2016-07-28 3 views
1

私は現在、複数の短い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を測定するか、実際のP​​ython(つまり、subprocessモジュール)コードを実行するCPU時間のみを測定するのだろうか?これは、Cプログラムのセットをベンチマークする正確な方法ですか?

+0

実行ファイルにはCコードではなくマシンコードが含まれています。 Cタグは完全に無関係です。 – Olaf

+0

'time'シェル組み込み関数は良いオプションのように見えます。 Linuxでは、 'perf stat some_program'を使って、命令、クロックサイクル、キャッシュミス、分岐予測ミスなどのパフォーマンスカウンタを取得することもできます(これは単にデフォルトです)。 –

答えて

1

timeitは、実行されるPythonプロセスで使用されるCPU時間を測定します。外部プロセスの実行時間は、それらの時間に「クレジット」されません。

-1

より正確な方法は、本当のスピードとスループットを得ることができるCで行うことです。

+0

これは私のバックアップオプションです。コードを実行して実行するcプログラムを作成し、サブプロセスを使用してpythonスクリプトから呼び出す。最初はちょっと混乱していたようですが、それはそれが行く方法ですように見えます! –

+0

あなたはタイマーをコード自体に埋め込むことができます – NWMG

関連する問題