2016-07-28 35 views
1

我目前正在做一些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程序進行基準測試的準確方法嗎?

+0

可執行文件包含機器碼,而不是C代碼。 C標籤完全不相關。 – Olaf

+0

'時間'貝殼內置看起來像一個不錯的選擇。在Linux上,您還可以使用'perf stat some_program'來獲取指令,時鐘週期,緩存未命中和分支預測錯誤(或任何其他計數器集合,這些只是默認值)的性能計數器計數 –

回答

1

timeit將測量運行的Python進程使用的CPU時間。外部流程的執行時間將不會「記入」那些時間。

-1

更準確的方法是在C中執行此操作,從而獲得真實的速度和吞吐量。

+0

這是我的備份選項;編寫一段時間並運行代碼的c程序,並使用子進程從我的python腳本中調用該程序。起初看起來有點凌亂,但看起來這是要走的路! –

+0

你可以在代碼中嵌入計時器 – NWMG