5

ミリ秒ではなくマイクロ秒で関数呼び出し時間を与えるgprofのようなCコードプロファイラーを知っている人はいますか?

4

4 に答える 4

3

ソースコードがあると仮定して、これをどのように処理するかを提案させてください。

関数が呼び出し ( I/O を含む)ごとに包括的にかかる平均時間を知ると、呼び出しの数を掛けて、合計実行時間で割ると、その関数の制御下にある時間の割合がわかります。その割合は、関数が最適化を行うのに十分な時間がかかるかどうかを知る方法です。gprofから取得するのは簡単な情報ではありません。

各関数の制御下で包括的時間のどの部分が費やされているかを知るもう 1 つの方法は、コール スタックの時間指定またはランダム サンプリングです。関数がサンプルの一部 X に出現する場合 (サンプル内に複数回出現する場合でも)、X は (誤差の範囲内で) かかる時間の一部です。さらに、これにより、関数ごとだけでなく、行ごとの時間の一部が得られます。

この分数 X は、取得できる最も価値のある情報です。これは、その関数またはコード行を最適化することで潜在的に節約できる合計時間だからです。

Zoom プロファイラーは、この情報を取得するための優れたツールです。

私なら、実行時間の長いループを最上位コードに巻き付けて、少なくとも数秒かかる長さで繰り返し実行するようにします。次に、スタックをランダムに中断または一時停止して、手動でスタックをサンプリングします。実際には、最も時間のかかる関数やコード行を明確に把握するには、10 や 20 などのごくわずかなサンプルしか必要としません。

これが例です。

PS 統計の精度が心配な場合は、定量的に取得させてください。関数またはコード行が正確に 50% の時間スタックにあり、10 個のサンプルを取得する場合、それを示すサンプル数は 5 +/- 1.6 で、誤差範囲は 16% です。実際の時間が短くても長くても、誤差は小さくなります。より多くのサンプルを取得することで、エラーの範囲を減らすこともできます。1.6% を取得するには、1000 個のサンプルを取得します。実際には、問題が見つかったら、誤差を小さくする必要があるかどうかを判断するのはあなた次第です。

于 2010-05-25T11:41:27.647 に答える
3

Linux perfを見てください。ただし、かなり最近のカーネルが必要になります。

于 2010-05-24T12:47:35.943 に答える
2

gprof は、ミリ秒またはマイクロ秒で結果を返します。正確な根拠はわかりませんが、私の経験では、十分な精度があると判断された場合、マイクロ秒単位で結果が表示されます。マイクロ秒の出力を取得するには、プログラムを長時間実行するか、実行に時間がかかりすぎるルーチンがない必要があります。

于 2011-12-10T12:24:22.590 に答える
1

oprofile は、クロック分解能 (ナノ秒) で時間を取得します。gprof と互換性のある出力ファイルを生成するので、非常に便利です。

http://oprofile.sourceforge.net/news/

于 2010-05-25T12:36:33.230 に答える