我目前正在做一些uni工作,需要爲多個短C程序生成多個基準。我寫了一個python腳本來自動化這個過程。如何基於python腳本對C程序進行基準測試?
start = time.time()
successful = run_program(path)
end = time.time()
runtime = end - start
其中run_program
函數只是使用subprocess
模塊運行C程序:
def run_program(path):
p = subprocess.Popen(path, shell=True, stdout=subprocess.PIPE)
p.communicate()[0]
if (p.returncode > 1):
return False
return True
不過,我到現在爲止,我已經使用time
模塊和基本計算基準這樣被我們最近發現,這是衡量經過時間而不是CPU時間的指標,即這種測量對操作系統的噪音很敏感。在如此相似的問題表明,timeit
模塊是用於測量CPU的時間比較好,所以我已經適應的運行方法,例如:
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
模塊僅意味着以一串字符串的形式傳入的小代碼片段。所以我不確定timeit
是否給了我這個計算的準確結果。因此,我的問題是:請問timeit
是測量CPU運行過程的每一步,還是隻測量實際python(即subprocess
模塊)代碼的CPU時間?這是對一組C程序進行基準測試的準確方法嗎?
可執行文件包含機器碼,而不是C代碼。 C標籤完全不相關。 – Olaf
'時間'貝殼內置看起來像一個不錯的選擇。在Linux上,您還可以使用'perf stat some_program'來獲取指令,時鐘週期,緩存未命中和分支預測錯誤(或任何其他計數器集合,這些只是默認值)的性能計數器計數 –