プロファイリング(コンピュータープログラミング)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

ソフトウェアエンジニアリングプロファイリング(「ソフトウェアプロファイリング」、「プログラムプロファイリングする」)の形態である動的プログラム解析手段は、例えば、スペース(メモリ)またはタイムこと複雑プログラムの特定の命令の使用、または周波数および関数呼び出しの期間。最も一般的には、プロファイリング情報は、プログラムの最適化、より具体的にはパフォーマンスエンジニアリングを支援するのに役立ちます

プロファイリングはプロファイラー(またはコードプロファイラーと呼ばれるツールを使用して、プログラムのソースコードまたはそのバイナリ実行可能形式のいずれかインストルメント化することによって実現されますプロファイラーは、イベントベース、統計、インストルメント化、シミュレーションなど、さまざまな手法を使用できます。

プログラムイベントの収集

プロファイラーは、ハードウェア割り込みコードインストルメンテーション命令セットシミュレーション、オペレーティングシステムフックパフォーマンスカウンターなど、さまざまな手法を使用してデータを収集します

プロファイラーの使用

CodeAnalystプロファイラーのグラフィカル出力

プログラム分析ツールは、プログラムの動作を理解するために非常に重要です。コンピュータアーキテクトは、プログラムが新しいアーキテクチャでどれだけうまく機能するかを評価するために、そのようなツールを必要としていますソフトウェア作成者は、プログラムを分析し、コードのクリティカルセクションを特定するためのツールを必要としています。コンパイラの作成者は、このようなツールを使用して、命令スケジューリングまたは分岐予測アルゴリズムのパフォーマンスを確認することがよくあります...

—  ATOM、PLDI、'94

プロファイラーの出力は次のようになります。

  • 観察されたイベントの統計的要約プロファイル
サマリープロファイル情報は、イベントが発生するソースコードステートメントに対して注釈が付けられて表示されることが多いため、測定データのサイズはプログラムのコードサイズに比例します。
/ * ------------ソース-------------------------カウント* /             
0001 IF X = "A" 0055
0002 THEN DO                       
0003 XCOUNT0032に1を追加
0004 ELSE
0005 IF X = "B" 0055
  • 記録されたイベントのストリーム(トレース
シーケンシャルプログラムの場合、通常はサマリープロファイルで十分ですが、パラレルプログラムのパフォーマンスの問題(メッセージの待機または同期の問題)は、イベントの時間関係に依存することが多いため、何が起こっているのかを理解するには完全なトレースが必要です。
(完全な)トレースのサイズは、プログラムの命令パスの長さに比例するため、多少実用的ではありません。したがって、トレースは、プログラムのあるポイントで開始され、別のポイントで終了して出力を制限する場合があります。
  • ハイパーバイザーとの継続的な相互作用(たとえば、オンスクリーンディスプレイを介した継続的または定期的な監視)
これにより、(まだ実行中の)プログラムに関する進行中のメトリックを表示するだけでなく、実行中の任意の時点でトレースをオンまたはオフに切り替えることができます。また、重要なポイントで非同期プロセスを一時停止して、他の並列プロセスとの相互作用をより詳細に調べる機会も提供します。

プロファイラーは、個々のメソッドに適用することも、モジュールやプログラムの規模で適用して、実行時間の長いコードを明確にすることでパフォーマンスのボトルネックを特定することもできます。[1]プロファイラーは、さまざまな実行時条件[2]またはさまざまな負荷を処理するようにコードを最適化する目的で、タイミングの観点からコードを理解するために使用できます。[3]プロファイリングの結果は、プロファイルに基づく最適化を提供するコンパイラーによって取り込むことができます[4]プロファイリングの結果は、個々のアルゴリズムの設計と最適化をガイドするために使用できます。クラウス・マッチングワイルドカードアルゴリズムは一例です。[5]プロファイラーは一部のアプリケーションパフォーマンス管理に組み込まれていますプロファイリングデータを集約して分散アプリケーションのトランザクションワークロードに関する洞察を提供するシステム[6]

歴史

パフォーマンス分析ツールは、1970年代初頭からIBM / 360およびIBM / 370プラットフォームに存在し、通常、実行中のコードの「ホットスポット」を検出するために設定されたタイマー間隔でプログラムステータスワード(PSW)を記録するタイマー割り込みに基づいていました[要出典]これはサンプリングの初期の例でした(以下を参照)。 1974年の初めに、命令セットシミュレータは、完全なトレースおよびその他のパフォーマンス監視機能を許可しました。[要出典]

Unixでのプロファイラー駆動型プログラム分析は1973年にさかのぼります[7]。Unixシステムに基本ツールが含まれていたときprof、各関数とそれが使用したプログラム実行時間の量がリストされていました。 1982年にgprof、概念を完全なコールグラフ分析に拡張しました[8]

1994年には、アミターブSrivastava氏とアラン・ユースタスデジタル・イクイップメント・コーポレーションは、 ATOMについての論文発表され[9](OMとの分析ツールを)。ATOMプラットフォームは、プログラムを独自のプロファイラーに変換します。コンパイル時に、分析対象のプログラムにコードを挿入します。その挿入されたコードは分析データを出力します。この手法(プログラムを変更してそれ自体を分析する)は、「インストルメンテーションとして知られています。

2004年には、gprofとATOMの両方の論文が、1999年までの20年間で最も影響力のある50のPLDI論文のリストに掲載されました。[10]

出力に基づくプロファイラータイプ

フラットプロファイラー

フラットプロファイラーは、呼び出しから平均呼び出し時間を計算し、呼び出し先またはコンテキストに基づいて呼び出し時間を分解しません。

コールグラフプロファイラー

コールグラフプロファイラー[8]は、呼び出し時間、関数の頻度、および呼び出し先に基づいて関係する呼び出しチェーンも示します。一部のツールでは、完全なコンテキストが保持されません。

入力に敏感なプロファイラー

入力に敏感なプロファイラー[11] [12] [13]は、パフォーマンス測定値を入力サイズや入力値などの入力ワークロードの機能に関連付けることにより、フラットまたはコールグラフプロファイラーにさらなる次元を追加します。これらは、アプリケーションのパフォーマンスが入力の関数としてどのようにスケーリングするかを特徴付けるチャートを生成します。

プロファイラータイプのデータ粒度

プロファイラーは、それ自体がプログラムでもあり、実行に関する情報を収集することにより、ターゲットプログラムを分析します。データの粒度に基づいて、プロファイラーが情報を収集する方法に基づいて、イベントベースまたは統計プロファイラーに分類されます。プロファイラーは、情報を収集するためにプログラムの実行を中断します。これにより、時間測定の解像度が制限される可能性があります。これは、一粒の塩で行う必要があります。基本ブロックプロファイラーは、コードの各行の実行に費やされるマシンクロックサイクルの、またはこれらを合計することに基づくタイミングを報告します。基本ブロックごとに報告されるタイミングは、キャッシュのヒットとミスの違いを反映していない場合があります[14] [15]

イベントベースのプロファイラー

ここにリストされているプログラミング言語には、イベントベースのプロファイラーがあります。

  • JavaJVMTI(JVM Tools Interface)API(以前のJVMPI(JVM Profiling Interface))は、呼び出し、クラスロード、アンロード、スレッド入力休暇などのイベントをトラップするためのフックをプロファイラーに提供します。
  • .NETプロファイリングAPIを使用して、プロファイリングエージェントをCOMサーバーとしてCLRに接続できますJavaと同様に、ランタイムは、メソッドJIT / enter / Leave、オブジェクト作成などのイベントをトラップするために、エージェントにさまざまなコールバックを提供します。プロファイリングエージェントがターゲットアプリケーションのバイトコードを任意の方法で書き換えることができるという点で特に強力です。
  • Python:Pythonプロファイリングには、プロファイルモジュール、ホットショット(コールグラフベース)、および「sys.setprofile」関数を使用したc_ {call、return、exception}、python_ {call、return、exception}などのイベントが含まれます。
  • Ruby:Rubyも、プロファイリングにPythonと同様のインターフェースを使用します。profile.rb、module、およびruby-profにC拡張機能のフラットプロファイラーが存在します。

統計プロファイラー

一部のプロファイラーは、サンプリングによって動作します。サンプリングプロファイラーは、オペレーティングシステムの割り込みを使用して、ターゲットプログラムのコールスタックを定期的にプローブしますサンプリングプロファイルは通常、数値的に正確で具体的ではありませんが、ターゲットプログラムをほぼフルスピードで実行できます。

結果のデータは正確ではありませんが、統計的な概算です。 「実際の誤差量は通常、複数のサンプリング周期です。実際、値がサンプリング周期のn倍である場合、予想される誤差はn個のサンプリング周期の平方根です。」[16]

実際には、サンプリングプロファイラーは、他のアプローチよりもターゲットプログラムの実行のより正確な画像を提供できることがよくあります。これは、ターゲットプログラムにそれほど煩わしくなく、したがって、多くの副作用(メモリキャッシュや命令など)がないためです。パイプラインのデコード)。また、実行速度にそれほど影響を与えないため、他の方法では隠されていた問題を検出できます。また、ルーチンまたは「タイトな」ループと呼ばれることが多い小さなコストを過大評価することも比較的ありません。ユーザーモードとシステムコール処理などの割り込み可能なカーネルモードで費やされた相対時間を表示できます

それでも、割り込みを処理するカーネルコードは、CPUサイクルのわずかな損失、キャッシュ使用の迂回を伴い、割り込み不可能なカーネルコード(マイクロ秒範囲のアクティビティ)で発生するさまざまなタスクを区別できません。

専用ハードウェアはこれを超えることができます。ARMCortex-M3および最近の一部のMIPSプロセッサJTAGインターフェイスにはPCSAMPLEレジスタがあり、プログラムカウンターを真に検出できない方法でサンプリングし、フラットプロファイルの非侵入型収集を可能にします。

Java /マネージコードに一般的に使用される[17]統計プロファイラーには、SmartBearSoftwareAQtime [18]MicrosoftCLRプロファイラーがあります。[19]これらのプロファイラも一緒に、ネイティブコードのプロファイリングをサポートしたApple Inc.シャーク、(OSX)[20] のOProfileする(Linux)、[21] インテル のVTuneとアンプをパラレル(の一部インテルParallel Studioを)、およびOracleの パフォーマンスアナライザー[22]とりわけ。

インストルメンテーション

この手法は、必要な情報を収集するための命令をターゲットプログラムに効果的に追加します。プログラムインストルメント化すると、パフォーマンスが変化する可能性があり、場合によっては、不正確な結果や特異なバグが発生する可能性があることに注意してください。効果は、収集される情報、報告されるタイミングの詳細のレベル、および基本ブロックプロファイリングがインストルメンテーションと組み合わせて使用​​されるかどうかによって異なります。[23] たとえば、すべてのプロシージャ/ルーチン呼び出しをカウントするコードを追加すると、各ステートメントが実行された回数をカウントするよりも効果が少なくなる可能性があります。一部のコンピューターには、情報を収集するための特別なハードウェアがあります。この場合、プログラムへの影響は最小限です。

インストルメンテーションは、プロファイラーが使用できる制御レベルと時間分解能を決定するための鍵です。

  • 手動:プログラマーによって実行されます。たとえば、ランタイムを明示的に計算するための命令を追加したり、イベントをカウントしたりアプリケーション応答測定標準などの測定APIを呼び出したりします
  • 自動ソースレベル:インストルメンテーションポリシーに従って自動ツールによってソースコードに追加されたインストルメンテーション。
  • 中間言語アセンブリまたは逆コンパイルされたバイトコードにインストルメンテーションが追加され、複数の高レベルのソース言語がサポートされ、(非シンボリック)バイナリオフセットの再書き込みの問題が回避されます。
  • コンパイラ支援
  • バイナリ変換:このツールは、コンパイルされた実行可能ファイルにインストルメンテーションを追加します
  • ランタイムインストルメンテーション:実行の直前にコードがインストルメントされます。プログラムの実行は、ツールによって完全に監視および制御されます。
  • ランタイムインジェクション:ランタイムインストルメンテーションよりも軽量です。コードは実行時に変更され、ヘルパー関数にジャンプします。

通訳計装

  • インタープリターのデバッグオプションを使用すると、インタープリターが各ターゲットステートメントに遭遇したときに、パフォーマンスメトリックの収集が可能になります。バイトコード制御テーブルJIT通訳は通常、極めて包括的なデータ収集の機会を有効にする、ターゲット・コードの実行を完全に制御を持っている3例です。

ハイパーバイザー/シミュレーター

  • ハイパーバイザー:データは、ハイパーバイザーの下で(通常は)変更されていないプログラムを実行することによって収集されます。例:SIMMON
  • シミュレーターハイパーバイザー命令セットシミュレーターの下で変更されていないプログラムを実行することにより、インタラクティブかつ選択的に収集されたデータ

も参照してください

参考文献

  1. ^ 「C#デスクトップアプリケーションのパフォーマンスのボトルネックを見つける方法は?」スタックオーバーフロー2012年。
  2. ^ Krauss、Kirk J(2017)。「焦点を絞ったパフォーマンスプロファイリング」パフォーマンスのために開発します。
  3. ^ 「コードプロファイリングとは何ですか?3種類のコードプロファイラーを学びましょう」Stackify開発者のヒント、コツ、リソースDisqus。2016年。
  4. ^ ローレンス、エリック(2016)。「プロファイルガイド付き最適化の開始」testslashplainWordPress。
  5. ^ クラウス、カーク(2018)。「ワイルドカードのマッチング:ビッグデータの改善されたアルゴリズム」パフォーマンスのために開発します。
  6. ^ 「。Netプロファイラーのリスト:3つの異なるタイプとそれらすべてが必要な理由」Stackify開発者のヒント、コツ、リソースDisqus。2016年。
  7. ^ Unixプログラマーマニュアル、第4版
  8. ^ a b SL Graham、PB Kessler、およびMK McKusick、gprof:コールグラフ実行プロファイラー、コンパイラ構築に関するSIGPLAN '82シンポジウムの議事録、SIGPLAN Notices、Vol。17、No 6、pp.120-126; doi:10.1145 / 800230.806987
  9. ^ A.SrivastavaおよびA.Eustace ATOM:カスタマイズされたプログラム分析ツールを構築するためのシステム、プログラミング言語の設計と実装に関するACM SIGPLAN会議の議事録(PLDI '94)、pp。196-205、1994; ACM SIGPLAN特記事項- PLDI 1979年から1999年のホームページアーカイブ、巻のベスト。39、No。4、pp.528-539; doi:10.1145 / 989393.989446
  10. ^ PLDIの20年(1979–1999):選択キャスリンS.マッキンリー、編集者
  11. ^ E. Coppa、C。Demetrescu、およびI. Finocchi、入力に敏感なプロファイリングIEEETransソフトウェア工学 40(12):1185-1205(2014); doi:10.1109 / TSE.2014.2339825
  12. ^ D. Zaparanuks and M. Hauswirth、 Algorithmic Profiling、Proceedings of the 33rd ACM SIGPLAN Conference on Programming Language Design and Implementation(PLDI 2012)、ACM SIGPLAN Notices、Vol。47、No。6、pp。67-76、2012; doi:10.1145 / 2254064.2254074
  13. ^ T. Kustner、J。Weidendorfer、およびT. Weinzierl、引数制御プロファイリング、Proceedings of Euro-Par 2009 – Parallel Processing Workshops、Lecture Notes in Computer Science、Vol。6043、pp.177-184、2010; doi:10.1007 / 978-3-642-14122-5 22
  14. ^ 「タイミングとプロファイリング-基本ブロックプロファイラー」OpenStaxCNXアーカイブ
  15. ^ ボール、トーマス; Larus、James R.(1994)。「プログラムの最適なプロファイリングとトレース」(PDF)プログラミング言語とシステムに関するACMトランザクションACMデジタルライブラリ。16(4):1319–1360。土井10.1145 /183432.183527S2CID 68971382018-05-18にオリジナル(PDF)からアーカイブされました2018518日取得  
  16. ^ ウェイバックマシンアーカイブされgprof出力の統計的不正確 2012-05-29
  17. ^ 「人気のあるC#プロファイラー」ギンテージ。2014年。
  18. ^ 「サンプリングプロファイラー-概要」AQTime8リファレンスSmartBearソフトウェア。2018年。
  19. ^ ウェンザル、マイラ; etal。(2017)。「プロファイリングの概要」Microsoft .NETFrameworkアンマネージAPIリファレンスマイクロソフト。
  20. ^ 「パフォーマンスツール」Apple DeveloperToolsApple、Inc.2013。
  21. ^ Netto、Zanella; アーノルド、ライアンS.(2012)。「LinuxonPowerのパフォーマンスを評価する」IBMDeveloperWorks
  22. ^ Schmidl、Dirk; Terboven、クリスチャン; メイ、ディーター; ミュラー、マティアスS.(2013)。OpenMPタスクに対するパフォーマンスツールの適合性-並列プログラムProc。高性能コンピューティングのための並列ツールに関する第7回国際ワークショップ。pp。25–37。ISBN 9783319081441
  23. ^ カールトン、ゲイリー; Kirkegaard、Knud; Sehr、David(1998)。「プロファイルガイドによる最適化」ドブ博士の日記

外部リンク