特定のメソッドを実行するのにどれくらいの時間が必要かを教えてくれるテクニックやツールがあるかどうか知りたいです。
アルゴリズムの複雑さについてのアイデアを与えることができる数学/コンピューターサイエンスの大きなO表記に似たものがありますが、コード分析に似たものがあるのではないかと思います。
プロファイリングは、プログラムを分析して、特定の機能またはメソッドに費やされた相対的な時間を決定する手段です。これは、プログラムのパフォーマンスの問題を経験的に発見するのに役立ちます。たとえば、GCCを使用すると、次のことができます。
-pg
プロファイリングを有効にするオプションを指定してプログラムをコンパイルします。
実行可能ファイルを実行して、と呼ばれるファイルを生成します。このファイルにはgmon.out
、実際に実行されたプログラムの実行時特性に関する情報が含まれています。
実行gprof
して、インストルメントされた実行可能ファイルによって生成された情報を表示します。
一般的に言って、人間の分析は、特定のアルゴリズムの漸近的(つまり、big-O)の複雑さを発見する唯一の方法です。私が知る限り、それを行う機械的な方法はありません。
関数に費やされた時間を知りたい場合は、いわゆる「プロファイラー」を使用してください。
ただし、複雑さの分析はプロファイラーの範囲外です。プロファイラーは、プログラムを1回実行すると何が起こるかを示しますが、複雑さは、入力がどんどん大きくなるプログラムの無限のシーケンスを実行したときに起こる限界の動作を示します。
つまり、プログラムで最もコストのかかる関数を知りたいですか(この場合、C ++実装のプロファイラーを見つけてそのドキュメントに従ってください)、または時間計算量について知りたいですか(この場合、ほとんどの場合、あなたのコードを分析する人間)?
callgrindを起動してコードを実行してみてください。呼び出された関数とその回数が記録されますが、コードの実行速度は20倍遅くなります。callgrindの出力を取得したら、kcachegrindで開いて、呼び出しのツリー構造を表示する必要があります。そこで、周りを閲覧して、ボトルネックがどこにあるかを確認できます。
便利なリンク:
kcachegrind http://kcachegrind.sourceforge.net/html/Home.html
callgrindドキュメントhttp://valgrind.org/docs/manual/cl-manual.html(valgrind
はフレームワーク、callgrindはコンポーネント)
方法プログラムがプロセスを生成し、それらもプロファイリングする場合にcallgrindを開始するには(sagebench.pyをプログラムに置き換えます)https://github.com/titusnicolae/pynac-callgrind/blob/master/run.sh
edit: "- -後でインストルメンテーションを有効にする予定がない場合は、パラメータリストから-instr-atstart=no"を削除する必要があります
これは停止性問題とどう違うのですか?
自動複雑度アナライザーを使用して停止問題を簡単に解決できることに注意してください。問題はより困難です。そして、停止問題はすでに決定不可能です。