3

Linuxサンプリングプロファイラーを探していましたが、callgrindが最も有用な結果を表示するようになりました。ただし、オーバーヘッドは通常より20〜100倍遅いと推定されます。さらに、私は関数ごとに費やされる時間にのみ関心があります(他のプロファイラーが忠実に表示しない、read()やなどの呼び出しのブロックに特に重点を置いています)。write()

  1. 余分なオプションをオフにして、さまざまなコールスタックで費やされる時間を生成するために最小限のデータだけが記録されるようにする方法はありますか?
  2. callgrindのcachegrindの遺産は、キャッシュプロファイリングなどに関して過剰な処理が行われていることを意味しますか?
  3. callgrindはデバッガーのように動作すると思います。これを調整して、すべての命令ではなく、間隔を置いてプロセスをサンプリングできますか?
4

3 に答える 3

2

3) Callgrind は動的トランスレータのように機能し、計数計器コードで元のコードを計器します。コード内のメモリ アクセス命令ごとに (キャッシュ シミュレーション用に) インストルメント化が行われ、(お勧めします) jmp のような命令ごとに exec を追跡します。すべての基本ブロックの数。

デバッガーと同じように機能する小さなサンプリング プロファイラーがあります。プロファイリング カウンターをアプリケーションに挿入setitimer()し、すべての SIGALRM をインターセプトして現在の$eip値を出力します。

setitimer以前のアプローチでいくつかのサンプリング プロファイラーがありましたprofil()。これはglibc/gmon/gmon.cgprof -p(正確にはgcc -pg) によって使用されます。profil()関数は、1 ミリ秒または 10 ミリ秒ごとに仮想 CPU 時間をサンプリングして、単一の連続コード フラグメントをプロファイリングできます。機能もありsprofil()ます。

LD_PRELOAD=/lib/libpcprofile.so PCPROFILE_OUTPUT=output.file も確認してください - しかし、それが機能するか、またはどのように機能するかはわかりません

番号付きの質問の場合:

2) 「Callgrind は Cachegrind の拡張機能です。Cachegrind が行うすべての情報に加えて、コールグラフに関する追加情報を提供します。」- したがって、cachegrind にあるすべてのものを提供できますが、ユーザーはキャッシュ シミュレーションをオフにすることもできます: --simulate-cache=no(これはデフォルト値です)

速度について: http://www.valgrind.org/docs/manual/nl-manual.html - 追加の計測を行わない Nul valgrind ツール (別名 nulgrind) のマニュアルによると、速度は 5 倍です。これは、プログラムが valgrind 自体によって動的に変換されるためです。そのため、nullgrind よりも高速に動作する valgrind 用のツールは存在しません。

于 2011-05-11T15:36:34.260 に答える
0

gprofを試しましたか?valgrindのように大きなオーバーヘッドはありません。

于 2010-09-10T04:53:34.213 に答える
0

RotateRight のZoomを使用してみてください。スレッドが実行中かブロックされているかにかかわらず、すべてのスレッドを 1 つのプロセスでサンプリングする「スレッド時間」構成があります。

于 2012-09-04T20:01:37.613 に答える