2016-04-14 5 views
0

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のプラグインを開発ん既存のツールはありますか?

+0

'#pragma'とマクロの使用の違いは何ですか?プラグマ以外にも、マクロを移植できる機会はありませんか? – Art

+1

Cの行と最適化されたasm出力の間に直接マッピングはありません。コンパイラが2つの障壁の間で作業の特定の部分を実行するようにすると、コードが著しく悪化する可能性があります。最善の策は、実行のホットスポットを見つけるためにCPUパフォーマンスカウンター(例えば、linux 'perf')を調べることです。 x86では、最軽量の計時機器(CPUID)でさえ20サイクルのオーバーヘッドであるため、ほんの数の命令を測定するには重すぎます。ループのすべての反復を測定するために使用します。 –

+0

スピードアップを見つけるためにこれをやっているなら、少し違って考える必要があります。確かにコード内に複数のスピードアップの機会があるので、そのうちの1つを見つけるだけでは十分ではありません。彼らがすべてのホットスポットであるという可能性はかなり小さいです。スピードアップが*から隠れることができない方法を試してください(http://stackoverflow.com/a/25870103/23771)。 –

答えて

0

perf recordコアクロックサイクルのようなイベントの場合、命令にイベントが蓄積されます。ただし、正確ではありません。イベントカウントを取得する手順は、必ずしも近くではなく、すぐに遅くなるものではありません。遅いことが起こるのを待っている。しかし、潜在的に有用なほど近い。

これは、insnまたはCの1行(デバッグ情報を使用したマッピング)ごとのカウントを調べ、相対カウントがいつ変化するかを見ることが必要なようです。

変更によっていつasmの特定の部分が遅くなるかを特定することができます:perfイベントからのカウントの相対的な割合は、そのソース行に関連するinsnsの方が高くなります。 (Cの行は、常にASM命令に直接マップされませんので+/-たくさんの手が、手を振って、ESP。最適化は、いくつかの分岐ロジックを再構築、自動ベクトル化、など)


それはあるかもしれませんperf recordの下でコードを実行する自動化されたテスト手順を調理してから、perf reportのデータをソースバージョンを比較するときに比較/追跡できる何らかの形式にマッサージすることができます。

関連する問題