2012-10-23 14 views
5

私は自分のコードをプロファイリングしていますが、私はすでにその中で最も高価な部分を見つけました。ただし、インライン関数で発生します。その影響を測定するために、関数をインライン化しないようにしました。Callgrindのインライン関数

ここで、正確なプロファイリングデータを報告したいと思います。インラインがなければ、オーバーヘッドが大きくなります(この関数は基本的に単一のループですが、非常に頻繁に呼び出されます)。

valgrindにコードの特定のセクションを(関数makros CALLGRIND_START_INSTRUMENTATION、CALLGRIND_STOP_INSTRUMENTATIONのように)関数としてインライン展開しないように扱うことが可能かどうか疑問です。

答えて

5
valgrind --tool=callgrind 

は、CPU(と キャッシュなどのその他の費用)が費やされている場所について多くの詳細を表示することができます。 kcachegrind(可視化ツール)は、さまざまなコストを簡単に表示できます(インライン関数の場合を含む)。

valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes 

注:命令レベルでコストを見て、あなたが

+0

確かにそれは素晴らしい作品です。 kcachegrindはとても素晴らしいツールです! – ypnos

-1

イムそれは:)ではないかわからない、これはあなたが望むものであるかどうかわからなく、イムない:
http://valgrind.org/docs/manual/cg-manual.html#cg-manual.overview

また、1回の命令キャッシュの読み取りが実行された命令 ごとに行われるので、あなたが見つけることができます 行ごとにいくつの命令が実行されるかは、従来のプロファイリングに役立ちます。

+0

はいを​​kcachegrind使用しなければならない、しかし私は、私は、関数スコープの粒度を超えて何かをする方法を見つけることができませんでした、その行を読んで。 – ypnos

0

たぶん、あなたは自分の関数を呼び出す前にして、関数の出口のためのあなたの関数、同上の初めに、ちょうどあなたの関数の呼び出しの後CALLGRIND_TOGGLE_COLLECTマクロを呼び出すことができます。 など。

int main() 
{ 
    CALLGRIND_TOGGLE_COLLECT; 
    myFunction(); 
    CALLGRIND_TOGGLE_COLLECT; 
} 

__attribute__((noinline)) 
void myFunction() 
{ 
    CALLGRIND_TOGGLE_COLLECT; 
    //Do stuff 
    CALLGRIND_TOGGLE_COLLECT; 
} 

このトリックを行う必要があります。

関連する問題