9

主にインストルメント化とサンプリングを行うプロファイラー間の研究を行っています。私は次の情報を思いつきました:

  • サンプリング: プログラムの実行を停止し、PC を取得して、プログラムが
  • 計測: プログラムにいくつかのオーバーヘッド コードを追加して、プログラムを認識するためにいくつかのポインターをインクリメントします。

上記の情報が間違っている場合は、私を修正してください。

この後、実行時間を見ていたら、サンプリングよりもインストルメントの方が時間がかかると言う人もいました!これは正しいです?

はいの場合、それはなぜですか?サンプリングでは、プロセス間のコンテキスト切り替えの代償を支払う必要がありますが、後者では同じプログラムでコストはかかりません

何か不足していますか?

乾杯!=)

4

2 に答える 2

9

サンプリングプロファイラーによって生成される割り込みは、サンプリング間隔が非常に短い場合(たとえば、1ミリ秒未満)を除いて、通常、合計実行時間にわずかな時間を追加します。

インストルメント化されたプロファイリングでは、インストルメンテーションライブラリへの呼び出しが関数の実行時間と比較して重要になる可能性があるため、たとえば、何度も呼び出される小さなリーフ関数では、大きなオーバーヘッドが発生する可能性があります。

于 2011-01-12T16:36:51.960 に答える
8

それは、あなたがどれだけ慣習的になりたいかによって異なります。

gprofあなたが言及したことの両方を行います。これについていくつかのコメントがあります。

プロファイリングとは測定に関するものだという考え方があります。何を測定しますか?まあ、何でも - 測定するだけです。これに加えて、取得したいのは何が起こっているかの「全体像」であるという考えがあります。この学校は、主に「遅い関数」を見つけようとすることに目を向けていますが、それが何を意味するのかを明確に定義することなく、そこを見て最適化するように指示しています。

別の学校は、あなたが本当にデバッグしていると言っています。特定の種類のバグを正確に特定したいとします。つまり、プログラムを正しくしないバグではなく、時間がかかりすぎるバグです。これらは大局的なものではありません。これらは、必要以上に時間がかかる何かが発生しているコード内の非常に正確なポイントです。正確にどれだけ多くするかは重要ではありません。重要なのは、固定できるように配置されていることです。この観点では、プロファイリングのオーバーヘッドは無関係であり、測定の精度も重要ではありません。測定の目的は、どれだけの時間が節約されたかを確認することです。

私が思うに、両方の陣営にまたがるプロファイラーの 1 つはZoomです。これは、壁時計の時間でコール スタックをサンプリングし、ライン/命令レベルでスタック上の時間の割合を提示するためです。他のプロファイラーもこれを行いますが、ほとんどは行いません。

私は 2 番目の学校に通っていますが、これで達成できることの例を次に示します。

ここでは、問題のより簡単な説明を示します。

于 2011-01-12T20:53:33.737 に答える