GprofはUnixアプリケーションのパフォーマンス分析ツールです。計測とサンプリングのハイブリッド[ 1 ]を使用し、古い「prof」ツールの拡張バージョンとして作成されました。prof とは異なり、gprof は限定的なコール グラフの収集と出力が可能です。[ 1 ] [ 2 ]
GPROF は元々 、カリフォルニア大学バークレー校のスーザン L. グラハムが率いるグループによってBerkeley Unix ( 4.2BSD [ 3 ] )用に書かれたものです。別の実装は、1988 年に Jay Fenlason によってGNU Binutils用のGNU プロジェクトの一部として書かれました。[ 4 ] [ 5 ]
計測コードは、呼び出し元関数のデータを収集するために、コンパイル時にプログラムコードに自動的に挿入されます(たとえば、gccコンパイラ-pgのオプションを使用することによって)。各関数呼び出しの前に、モニタ関数への呼び出しが挿入されます。[ 6 ]mcount
サンプリングデータは、プログラム終了直前にファイルに保存され、コマンドラインツールを使用して分析できますgmon.out。複数のgmonファイルを組み合わせることで、プログラムの複数回の実行から得られたデータを蓄積できます。progname.gmongprofgprof -s
GPROFの出力は、フラットプロファイルとコールグラフの2つの部分から構成されます。フラットプロファイルには、各関数で費やされた合計実行時間と、その関数が全体の実行時間に占める割合が表示されます。関数呼び出し回数も報告されます。出力は割合順にソートされ、ホットスポットがリストの上位に表示されます。
出力の2番目の部分はテキスト形式の呼び出しグラフで、各関数について、呼び出し元(親)と呼び出し元(子サブルーチン)を示します。gprof の呼び出しグラフをグラフィカル形式に変換できる gprof2dot という外部ツールがあります。[ 7 ]
実行時には、タイミング値は統計的サンプリングによって取得されます。サンプリングは、オペレーティングシステムの割り込み(profil(2) または setitimer(2)システムコールでプログラム) を使用して、対象プログラムのプログラムカウンタを一定間隔でプローブすることによって行われます。結果として得られるデータは正確ではなく、統計的な近似値です。誤差は通常、1 サンプリング周期以上です。値がサンプリング周期のn倍である場合、その値の予想される誤差はnサンプリング周期の平方根です。[ 8 ] [ 9 ]一般的なサンプリング周期は 0.01 秒 (10 ミリ秒) または 0.001 秒 (1 ms) であり、言い換えれば、CPU 実行時間の 1 秒あたり 100 または 1000 サンプルです。
BSDなどの一部のバージョンでは、ライブラリ関数またはシステムコールとして実装される可能性のある関数の制限により、共有ライブラリのプロファイリングが制限される場合があります。glibcには、動的ライブラリをプロファイリングするためprofilの同様のユーティリティがありました。[ 10 ]sprof
Gprof はカーネルモード (システムコール、CPU または I/O の待機) に費やされた時間を測定できず、ユーザー空間コードのみがプロファイリングされます。[ 9 ]
この関数は実装によってはスレッドセーフmcountではない場合があるため、マルチスレッドアプリケーションのプロファイルが正しくない可能性があります(通常、アプリケーションのメインスレッドのみをプロファイルします)。[ 11 ]
高階プログラムやオブジェクト指向プログラムの場合、計測オーバーヘッドは高くなる可能性があります(推定値 30% [ 12 ]~ 260% [ 13 ])。相互再帰や非自明なサイクルは、gprof アプローチ(コンテキスト非依存の呼び出しグラフ)では解決できません。これは、完全な呼び出しチェーンではなく、アークの走査のみを記録するためです。[ 13 ] [ 14 ] [ 15 ]
コールグラフ収集機能を備えたGprofは、GCC、clang/LLVMなどの互換性のあるコンパイラでのみ使用できます。
2004年にGPROFの論文が、史上最も影響力のあるPLDI論文50選に、1982年の論文4本のうちの1本として掲載された。 [ 16 ]
ジャスティン・ティール氏によると、[ 6 ]「GPROFはパフォーマンス分析の分野に革命をもたらし、世界中の開発者にとってすぐに選ばれるツールとなりました。このツールは今でも多くの支持者を得ており、現在も積極的にメンテナンスされており、現代においてもなお有効です。」
{{cite web}}: CS1 maint: bot: 元の URL の状態が不明です (リンク)