私は現在、複数の短いCプログラムに対して複数のベンチマークを生成する必要があるuniでいくつかの作業を行っています。私はこのプロセスを自動化するためのPythonスクリプトを書いています。今まで私はtime
モジュールを使用してきたと本質的のようなベンチマークを計算する:PythonスクリプトからCプログラムをベンチマークする方法は?
run_program
機能だけでCのプログラムを実行するために
subprocess
モジュールを使用しています
start = time.time()
successful = run_program(path)
end = time.time()
runtime = end - start
:
def run_program(path):
p = subprocess.Popen(path, shell=True, stdout=subprocess.PIPE)
p.communicate()[0]
if (p.returncode > 1):
return False
return True
しかし、私は、最近、これはCPU時間ではなく経過時間を測定することを発見しました。つまり、この種の測定はOSからのノイズに敏感です。 SO上の同様の質問には、CPU時間を測定するためのより良いですtimeit
モジュールがあることが示唆されているので、私のようなrunメソッドを適応してきました:
def run_program(path):
command = 'p = subprocess.Popen(\'time ' + path + '\', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE); out, err = p.communicate()'
result = timeit.Timer(command, setup='import subprocess').repeat(1, 10)
return numpy.median(result)
しかしtimeit
のドキュメントを見てから、timeit
モジュールが唯一であると思われます文字列として渡されるPythonコードの小さなスニペットを意味します。だからtimeit
が私にこの計算のための正確な結果を与えているかどうかはわかりません。だから私の質問は:timeit
は、それが実行されるプロセスのすべてのステップについてCPUを測定するか、実際のPython(つまり、subprocess
モジュール)コードを実行するCPU時間のみを測定するのだろうか?これは、Cプログラムのセットをベンチマークする正確な方法ですか?
実行ファイルにはCコードではなくマシンコードが含まれています。 Cタグは完全に無関係です。 – Olaf
'time'シェル組み込み関数は良いオプションのように見えます。 Linuxでは、 'perf stat some_program'を使って、命令、クロックサイクル、キャッシュミス、分岐予測ミスなどのパフォーマンスカウンタを取得することもできます(これは単にデフォルトです)。 –