プログラムの実行時間の複雑さを特定する標準的な方法を探しています。hereで説明されているように、プログラムの実行時に他のパラメーターを使用するのではなく、コードを見て同じことを分析するためのソリューションを探しているわけではありません。
ユーザーが 2 進文字列を 10 進数に変換する必要があるプログラムを考えてみましょう。このようなプログラムの時間計算量は、各 2 進数が一度に処理される場合、最悪でも O(n) になります。ある程度の知性があれば、実行時間を O(n/4) に減らすことができます (一度にバイナリ文字列から 4 桁を処理し、バイナリ文字列がすべての k=1,2,3 に対して 4k 桁であると仮定します...)
このプログラムは C で作成し、time コマンドと gettimeoftheday を使用する関数 (両方) を使用して、64 ビットのクアッド コア プロセッサ (各コアが 800 MHZ) を搭載した Linux ボックスでの実行時間を 2 つのカテゴリで計算しました。
- システムに通常の負荷がかかっている場合 (コア使用率 5 ~ 10%)
- システムの負荷が高い場合 (コア使用率 80 ~ 90%)
以下は、O(n) アルゴリズムの測定値です。バイナリ文字列の長さは、通常の負荷で 100000 です。
Time spent in User (ms) - 216
Time Spent in Kernel (ms) - 8
Timed using gettimeofday (ms) - 97
以下は、O(n) アルゴリズムの測定値です。バイナリ文字列の長さは 200000 で、負荷が高い場合:
Time spent in User (ms) - 400
Time Spent in Kernel (ms) - 48
Timed using gettimeofday (ms) - 190
私が探しているもの:
- time コマンドを使用している場合、どの出力を考慮する必要がありますか? リアル、ユーザー、またはシステム?
- プログラムの実行時間を計算する標準的な方法はありますか?
- これらのコマンドを実行するたびに、異なる読み取り値が得られます。コードが変更されない場合、平均が常に同じになるように何回サンプリングする必要がありますか。
- 複数のスレッドを使用し、そのようなプログラムで execve を呼び出して各スレッドで時間を測定したい場合はどうすればよいでしょうか。
私が行った調査から、標準的なアプローチに出くわすことはありませんでした。また、使用しているように見えるコマンド/メソッドは、毎回異なる出力を提供します(これは、コンテキストスイッチとCPUサイクルが原因であることを理解しています)。ここでは、マシンに依存するソリューションでも実行できると想定できます。