16

気にしないノイズと計算を削除して、コードの特定の部分を (Callgrind で) プロファイルしようとしています。これが私がやりたいことの例です:

for (int i=0; i<maxSample; ++i) {
    //Prepare data to be processed...
    //Method to be profiled with these data
    //Post operation on the data
}

私のユースケースは回帰テストです。問題のメソッドがまだ十分に高速であることを確認したいと思います (最後の実装以降の追加命令が 10% 未満など)。これが、Callgrind からのよりクリーンな出力が欲しい理由です。(プロファイリングするメソッドの動作を適切に推定するために、大量のデータを処理するために for ループが必要です)

私の最初の試みは、コードを次のように変更することでした。

for (int i=0; i<maxSample; ++i) {
    //Prepare data to be processed...
    CALLGRIND_START_INSTRUMENTATION;
    //Method to be profiled with these data
    CALLGRIND_STOP_INSTRUMENTATION;
    //Post operation on the data
}
CALLGRIND_DUMP_STATS;

インストルメンテーションを制御する Callgrind マクロを追加します。また、 --instr-atstart=no オプションを追加して、必要なコードの部分のみをプロファイルするようにしました...

残念ながら、この構成では、callgrind で実行可能ファイルを起動し始めると、決して終了しません... 完全なインストルメンテーションの実行は 1 分未満であるため、遅さの問題ではありません。

私も試しました

for (int i=0; i<maxSample; ++i) {
    //Prepare data to be processed...
    CALLGRIND_TOGGLE_COLLECT;
    //Method to be profiled with these data
    CALLGRIND_TOGGLE_COLLECT;
    //Post operation on the data
}
CALLGRIND_DUMP_STATS;

(または --toggle-collect="myMethod" オプション) しかし、Callgrind は呼び出しなしでログを返しました (KCachegrind は雪のように白です :( そしてゼロ命令を言います...)

マクロ/オプションを正しく使用しましたか? 期待される結果を得るために何を変更する必要があるかについて何か考えはありますか?

4

2 に答える 2

18

私は最終的にこの問題を解決することができました...これは設定の問題でした:

コードをお預かりしました

for (int i=0; i<maxSample; ++i) {
    //Prepare data to be processed...
    CALLGRIND_TOGGLE_COLLECT;
    //Method to be profiled with these data
    CALLGRIND_TOGGLE_COLLECT;
    //Post operation on the data
}
CALLGRIND_DUMP_STATS;

しかし、--collect-atstart=noを指定して (そして --instr-atstart=no!!! を指定せずに) callgrind を実行すると、妥当な時間 (~1 分) で完全に機能しました。

START/STOP インスツルメンテーションの問題は、callgrind が各反復 (各 STOP) でファイル (callgrind.out.#number) をダンプすることでした。そのため、非常に遅くなりました... (5 分後、300,000 回の反復で 5000 回しか実行できませんでした。ベンチマーク...回帰テストには適していません)。

于 2012-12-04T10:27:45.873 に答える