Cコード(一部の機能ではいくつかの指示に制限されている可能性があります)で非常に特定の部分の時間を計測したいと思います。 1つの目的は、いくつかのコードの改訂に対するローカルパフォーマンスの改善または回帰を追跡することです。パフォーマンス追跡のための注釈(プラグマ)を使用した計測器Cコード
私はその目的のためにマクロを定義できます。しかし、すでにそれを行うツールもあります侵入の少ない方法?注釈(の#pragma)を使用することで完璧になる:
void func_to_profile()
{
/* Some instructions */
...
#pragma profile foo start
/* A part of the code to track */
...
#pragma profile foo stop
/* More instructions */
...
#pragma profile bar start
/* Another part to measure */
...
#pragma profile bar stop
}
理想的には、実行の最後にこのツールは、サブセクションごとの累積elasped回を表示していました。例えば:
-- [foo] cumulated time: 42s
-- [bar] cumulated time: 7s
はすでにそれを行うか、私は選択肢がないが、私自身のGCCのプラグインを開発ん既存のツールはありますか?
'#pragma'とマクロの使用の違いは何ですか?プラグマ以外にも、マクロを移植できる機会はありませんか? – Art
Cの行と最適化されたasm出力の間に直接マッピングはありません。コンパイラが2つの障壁の間で作業の特定の部分を実行するようにすると、コードが著しく悪化する可能性があります。最善の策は、実行のホットスポットを見つけるためにCPUパフォーマンスカウンター(例えば、linux 'perf')を調べることです。 x86では、最軽量の計時機器(CPUID)でさえ20サイクルのオーバーヘッドであるため、ほんの数の命令を測定するには重すぎます。ループのすべての反復を測定するために使用します。 –
スピードアップを見つけるためにこれをやっているなら、少し違って考える必要があります。確かにコード内に複数のスピードアップの機会があるので、そのうちの1つを見つけるだけでは十分ではありません。彼らがすべてのホットスポットであるという可能性はかなり小さいです。スピードアップが*から隠れることができない方法を試してください(http://stackoverflow.com/a/25870103/23771)。 –