3

私はgpr​​ofを調べました。しかし、次のことを達成する方法がよくわかりません。

クラスタリング手順を書きました。各反復では、4 つの関数が繰り返し呼び出されます。約 100000 回の反復が必要です。各機能にどれくらいの時間が費やされたかを知りたい。
これらの関数は他のサブ関数を呼び出す可能性があり、ハッシュマップ、マップなどのデータ構造が含まれる場合がありますが、これらのサブ関数は気にしません。すべての反復でこれらすべての親関数に費やされた合計時間を知りたいだけです。これにより、プログラムをより適切に最適化できます。

gprof の問題は、すべての関数を分析することです。そのため、stl データ構造の機能も考慮されます。

現在、clock_gettime を使用しています。関数ごとに、各反復にかかった時間を出力します。次に、この出力ファイルを操作します。このために、多くのプロファイリング コードを入力する必要があります。プロファイリング コードにより、コードが非常に複雑に見えるので、それを避けたいと考えています。これは業界でどのように行われますか?

これを行う簡単な方法はありますか?

他にきれいな方法があれば教えてください

4

3 に答える 3

4

私の理解が正しければ、関心のある 4 つのターゲット関数にどれだけの時間が費やされたかに関心がありますが、それらの関数によって呼び出される子関数には関心がありません。

この情報は、"self seconds" の下の gprof の "flat" プロファイルで提供されます。あるいは、コール グラフを見ている場合、このタイミングは「自己」列にあります。

于 2012-08-24T07:50:49.947 に答える
1

これら 4 つの機能のセルフタイムが必要なため、それらを具体的に最適化できます。

gprof合計時間の % として表示されます。仮に10%とします。その場合、0% に最適化できたとしても、100/90 = 1.11 の高速化係数、つまり 11% の高速化が得られます。100 秒かかって遅すぎる場合、90 秒でも遅すぎる可能性があります。

ただし、これらの関数にかかる包括的(自己と呼び出し先の合計) 時間は、数値を選択するために、はるかに大きい %、80% になる可能性があります。もしそうなら、それらの呼び出し先への呼び出しを減らすことで、さらに最適化できます。あるいは、一般性のために引数をテストするなど、厳密に行う必要のないことを行うために、呼び出し先が大きな割合を費やしていることがわかります。この場合、それらをアドホックルーチンに置き換えることができます。

実際、厳密に言えば、セルフタイムというものはありません。プログラム カウンターが検出される最も単純な命令でさえ、実際にはマイクロコード サブルーチンの呼び出しです。

ここでは、問題のいくつかの議論と建設的な推奨事項を示します。

于 2012-08-24T11:42:52.900 に答える
1

テレメトリを見てみましょう。これは主に、フレームごとのデータを比較したいゲーム開発者を対象としていますが、要件に非常によく合っているようです。

于 2012-08-24T07:45:13.660 に答える