この質問に関連して、callgrind で作成されたプロファイリング データを評価するためにどのツールをお勧めしますか?
グラフィカル インターフェイスを備えている必要はありませんが、簡潔で明確で解釈しやすい方法で結果を準備する必要があります。たとえば については知ってkcachegrind
いますが、このプログラムには、表示されているテーブルのデータエクスポートや、単に表示から行をコピーするなどの機能がありません。
この質問に関連して、callgrind で作成されたプロファイリング データを評価するためにどのツールをお勧めしますか?
グラフィカル インターフェイスを備えている必要はありませんが、簡潔で明確で解釈しやすい方法で結果を準備する必要があります。たとえば については知ってkcachegrind
いますが、このプログラムには、表示されているテーブルのデータエクスポートや、単に表示から行をコピーするなどの機能がありません。
何年も前に、私は DOS で実行するプロファイラーを書きました。
KCacheGrind を使用している場合は、次のようにします。書くのはそれほど難しくないかもしれませんし、手でやるだけかもしれません。
KCacheGrind には「Force Dump」というツールバー ボタンがあり、ランダムな時間に手動でダンプをトリガーできます。プログラムを待機している間に、ランダムまたは疑似ランダムな時間にスタック トレースをキャプチャすることが、この手法の核心です。
多くのサンプルは必要ありません。通常は 20 で十分です。ボトルネックのコストが大きい場合 (50% 以上など)、5 つのサンプルで十分な場合があります。
サンプルの処理は非常に簡単です。各スタック トレースは、一連のコード行 (実際にはアドレス) で構成され、最後を除くすべてが関数/メソッド呼び出しです。
サンプルに表示されるすべてのコード行のリストを収集し、重複を排除します。
コードの各行について、サンプルのどの部分に表示されるかを数えます。たとえば、20 個のサンプルを取得し、そのうちの 3 個にコード行が表示された場合、(再帰により) 一部のサンプルに複数回表示されたとしても、カウントは 3/20 または 15% です。これは、各ステートメントのコストの直接的な尺度です。
最もコストのかかる 100 行程度のコードを表示します。あなたのボトルネックはそのリストにあります。
この情報を使用して通常行うことは、コストの高い行を選択し、それが表示されるまで手動でスタック サンプルを取得し (または既に取得したサンプルを確認し)、「なぜそのコード行を実行しているのか、ローカルな意味だけでなく、グローバルな意味でも。」別の言い方をすると、「グローバルな意味で、そのサンプルが取得されたタイム スライスでプログラムが達成しようとしたこと」です。私がこれを尋ねる理由は、それが本当にその行にかかる費用を費やす必要があるかどうかを教えてくれるからです.
プロファイラーを開発する人々の偉大な仕事すべてを批判するつもりはありませんが、悲しいことに、このテーマには次のような多くの確固たる神話があります。
大量のサンプルを正確に測定することが重要です。むしろ、ボトルネックを見つけることに重点を置くべきです。正確な測定はそのための前提条件ではありません。コストが 10% から 90% の典型的なボトルネックの場合、測定値は非常に粗くなる可能性があります。
その機能はコード行よりも重要です。コストのかかる関数が見つかった場合でも、その関数内でボトルネックになっている行を検索する必要があります。その情報は、スタック トレースのすぐそこにあります。探す必要はありません。
CPU と壁時計の時間を区別する必要があります。待っていたらウォールクロックタイム(腕時計タイム?)。たとえば、余分な I/O からなるボトルネックがある場合、それは CPU 時間ではないので無視しますか?
排他的時間と包括的時間の区別が有用であること。これは、関数のタイミングを計っていて、呼び出し先以外で時間が費やされているかどうかの手がかりが必要な場合にのみ意味があります。コード行を見ると、重要なのは包括的な時間だけです。別の言い方をすれば、マイクロコードを呼び出すだけであっても、すべての命令は呼び出し命令です。
その再帰は重要です。ラインがオンになっているサンプルの割合には影響せず、したがって責任があるため、これは無関係です。
行または関数の呼び出し回数が重要であること。高速で何度も呼び出される場合でも、低速で 1 回呼び出される場合でも、コストは使用時間の割合であり、それがスタック サンプルの推定値です。
サンプリングのパフォーマンスが重要です。ボトルネックが移動しないと仮定して、スタック サンプルを取得し、続行する前に数分間それを確認してもかまいません。
ここに、より完全な説明があります。
callgrind データを操作するための CLI ツールがいくつかあります。
callgrind_annotate
callgrind.out からの情報を表示できる cachegrind ツール
cg_annotate