気にしないノイズと計算を削除して、コードの特定の部分を (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 は雪のように白です :( そしてゼロ命令を言います...)
マクロ/オプションを正しく使用しましたか? 期待される結果を得るために何を変更する必要があるかについて何か考えはありますか?