ソフトウェアエンジニアリングにおいて、プロファイリング(プログラムプロファイリング、ソフトウェアプロファイリング)は、プログラムの空間(メモリ)や時間計算量、特定の命令の使用頻度、関数呼び出しの頻度や実行時間などを測定する動的プログラム分析の一種です。プロファイリング情報は、プログラムの最適化、特にパフォーマンスエンジニアリングを支援するために最も一般的に利用されます。
プロファイリングは、プロファイラ(またはコードプロファイラ)と呼ばれるツールを使用して、プログラムのソースコードまたはそのバイナリ実行形式に計測機能を組み込むことによって実現されます。プロファイラは、イベントベース、統計的、計測型、シミュレーションなど、さまざまな手法を用いることができます。
プロファイラは、ハードウェア割り込み、コード計測、命令セットシミュレーション、オペレーティングシステムフック、パフォーマンスカウンタなど、さまざまな手法を用いてデータを収集します。

プログラム解析ツールは、プログラムの動作を理解する上で非常に重要です。コンピュータアーキテクトは、新しいアーキテクチャ上でプログラムがどれだけうまく動作するかを評価するために、このようなツールを必要とします。ソフトウェア開発者は、プログラムを分析し、コードの重要な部分を特定するためにツールを必要とします。コンパイラ開発者は、命令スケジューリングや分岐予測アルゴリズムの性能を把握するために、このようなツールをよく使用します。
— ATOM、PLDI
プロファイラの出力は次のようになる場合があります。
/* ------------ ソース------------------------- カウント */ 0001 IF X = "A" 0055 0002 では、 0003 XCOUNTに1を加算 0032 0004 ELSE 0005 IF X = "B" 0055
プロファイラは、個々のメソッド、モジュール、またはプログラム規模で適用でき、実行時間の長いコードを明確にすることでパフォーマンスのボトルネックを特定できます。[ 1 ]プロファイラは、さまざまな実行時条件[ 2 ]やさまざまな負荷[ 3 ]に対応するようにコードを最適化することを目的として、タイミングの観点からコードを理解するために使用できます。プロファイリングの結果は、プロファイルガイドによる最適化を提供するコンパイラに取り込むことができます。[ 4 ]プロファイリングの結果は、個々のアルゴリズムの設計と最適化のガイドとして使用できます。Kraussのワイルドカードマッチングアルゴリズムはその一例です。[ 5 ]プロファイラは、分散アプリケーションのトランザクションワークロードに関する洞察を提供するためにプロファイリングデータを集約するアプリケーションパフォーマンス管理システムに組み込まれています。[ 6 ]
IBM/360およびIBM/370プラットフォームには、1970年代初頭からパフォーマンス分析ツールが存在していました。これらのツールは通常、タイマー割り込みに基づいており、一定のタイマー間隔でプログラムステータスワード(PSW)を記録し、実行中のコードにおける「ホットスポット」を検出していました。これはサンプリングの初期の例です(下記参照)。1974年初頭には、命令セットシミュレータによって完全なトレース機能やその他のパフォーマンス監視機能が利用可能になりました。
Unix 上でのプロファイラによるプログラム分析は 1973 年に遡り[ 7 ] 、当時 Unix システムには、各関数とそれがプログラム実行時間のうちどれだけを使用しているかを一覧表示する基本的なツール が含まれていましたprof。1982 年に、gprofこの概念は完全な呼び出しグラフ分析に拡張されました。[ 8 ]
1994年、Digital Equipment CorporationのAmitabh SrivastavaとAlan Eustaceは、ATOM [ 9 ] (Analysis Tools with OM)について説明した論文を発表しました。ATOMプラットフォームは、プログラムを独自のプロファイラに変換します。コンパイル時に、分析対象のプログラムにコードを挿入します。挿入されたコードは分析データを出力します。このように、プログラムを修正して自身を分析させる手法は、「インストルメンテーション」として知られています。
2004年には、とATOMの論文の両方が、1999年までの20年間で最も影響力のあるPLDIgprof論文50選にランクインした。[ 10 ]
フラットプロファイラは、呼び出しから平均呼び出し時間を計算し、呼び出し先やコンテキストに基づいて呼び出し時間を分類しません。[ 11 ]
コールグラフプロファイラ[ 8 ]は、呼び出し時間、関数の頻度、および呼び出し先に基づいて関連する呼び出しチェーンを表示します。一部のツールでは、完全なコンテキストは保持されません。
入力依存型プロファイラ[ 12 ] [ 13 ] [ 14 ]は、入力サイズや入力値などの入力ワークロードの特徴にパフォーマンス指標を関連付けることで、フラットプロファイラやコールグラフプロファイラに新たな次元を追加します。アプリケーションのパフォーマンスが入力に応じてどのように変化するかを特徴付けるグラフを生成します。
プロファイラはそれ自体もプログラムであり、対象プログラムの実行に関する情報を収集することで対象プログラムを分析します。プロファイラが情報を収集する方法によって決まるデータの粒度に基づいて、イベントベースまたは統計的プロファイラに分類されます。プロファイラはプログラムの実行を中断して情報を収集します。これらの中断は時間測定の分解能を制限する可能性があるため、タイミングの結果は慎重に扱う必要があります。基本ブロックプロファイラは、コードの各行の実行に費やされたマシンクロックサイクルの数、またはそれらを合計したタイミングを報告します。基本ブロックごとに報告されるタイミングは、キャッシュヒットとキャッシュミスの違いを反映していない可能性があります。[ 15 ] [ 16 ]
イベントベースのプロファイラは、以下のプログラミング言語で利用可能です。
これらのプロファイラはサンプリングによって動作します。サンプリングプロファイラは、オペレーティングシステムの割り込みを使用して、一定間隔で対象プログラムのコールスタックをプローブします。サンプリングプロファイルは通常、数値的な精度と具体性が低く、統計的な近似値しか提供しませんが、対象プログラムをほぼフルスピードで実行できます。「実際の誤差量は通常、1サンプリング周期以上です。実際、値がサンプリング周期のn倍である場合、その値の予想される誤差はnサンプリング周期の平方根です。」[ 17 ]
実際には、サンプリングプロファイラは、他のアプローチよりも対象プログラムの実行状況をより正確に把握できる場合が多い。これは、サンプリングプロファイラは対象プログラムにそれほど干渉せず、副作用(メモリキャッシュや命令デコードパイプラインへの影響など)が少ないためである。また、オーバーヘッドが少ないため、そうでなければ隠されてしまう問題も検出できる。[ 18 ]また、サンプリングプロファイラは、頻繁に呼び出される小さなルーチンや「タイト」なループのコストを過大評価する傾向も比較的低い。さらに、システムコール処理などの割り込み可能なカーネルモードとユーザーモードで費やされた時間の相対的な割合を示すことができる。
残念ながら、カーネルコードを実行して割り込みを処理すると、対象プログラムのCPUサイクルがわずかに失われ、キャッシュの使用が分散され、割り込み不可能なカーネルコード(マイクロ秒単位のアクティビティ)で発生するさまざまなタスクとユーザーコードを区別できなくなります。専用ハードウェアであれば、より優れた結果が得られます。ARM Cortex-M3や最近のMIPSプロセッサの一部には、JTAGインターフェースにPCSAMPLEレジスタが搭載されており、プログラムカウンタを全く検出不可能な方法でサンプリングすることで、非侵襲的にフラットプロファイルを収集できます。
Java/マネージドコードで一般的に使用されている統計プロファイラには、SmartBear SoftwareのAQtime [ 20 ]やMicrosoftのCLR Profiler [ 21 ]などがあります。これらのプロファイラは、Apple Inc.のShark ( OSX ) [ 22 ]、OProfile ( Linux ) [ 23 ]、Intel VTuneおよびParallel Amplifier ( Intel Parallel Studioの一部)、Oracle Performance Analyzer [ 24 ]などとともに、ネイティブコードのプロファイリングもサポートしています。
この手法は、対象プログラムに命令を追加して必要な情報を収集するものです。ただし、プログラムを計測するとパフォーマンスが変化する可能性があり、場合によっては不正確な結果やハイゼンバグが発生する可能性があることに注意してください。その影響は、収集される情報、報告されるタイミングの詳細レベル、および計測と併せて基本ブロックプロファイリングが使用されるかどうかによって異なります。[ 25 ] 例えば、すべてのプロシージャ/ルーチン呼び出しをカウントするコードを追加すると、各ステートメントが何回実行されるかをカウントするよりも影響は小さくなるでしょう。一部のコンピュータには、情報を収集するための特別なハードウェアが搭載されています。この場合、プログラムへの影響は最小限です。
計測機器は、プロファイラが利用できる制御レベルと時間分解能の量を決定する上で重要な要素となる。
gprofWayback Machineにアーカイブ済み)