2017-05-30 55 views
2

我有一個程序,我想測量不同輸入大小的執行(wallclock)時間。測量執行時間 - 在程序代碼或shell中?

在一些其他類似的問題中,我讀到在源代碼中使用clock_gettime將不可靠,因爲CPU分支預測器,寄存器重命名,推測性執行,無序執行等,有時甚至是優化器可以將clock_gettime撥打電話,而不是放在我放置的地方。

但這些問題我看了大約測量特定功能的時間。如果我測量整個程序(即main函數),這些問題是否仍然存在?我正在尋找相對測量,不同輸入大小的執行時間如何變化,而不是絕對值。

我該如何獲得更好的結果?在代碼中使用計時功能:

start = clock_gettime(); 
do_stuff(); 
end = clock_gettime(); 
execution_time = end - start; 

或與time命令bash

time ./program 

回答

1

在程序測量會給你一個更準確的答案。當然,從理論上講,在某些情況下,您可以將clock_gettime調用移到您不期望的地方。在實踐中,如果你只有一個函數調用,它就不會發生。 (如果有疑問,請查看生成的彙編代碼)

在shell中調用time將包含一些您不關心的內容,例如加載可執行文件所需的時間以及有趣的地方。另一方面,如果你的do_stuff需要幾秒鐘,那麼它並不重要。

我會用下面的建議去:

  • 如果很容易隔離的功能,使其成爲需要幾秒鐘(你也可以循環,但衡量比較空循環爲好),那麼clock_gettimetime都可以。
  • 如果不能輕鬆地隔離,但你的函數始終需要幾百毫秒,使用clock_gettime
  • 如果無法隔離和你優化微小的東西,看看rdtsc timing for a measuring a function其中談到測量實際執行週期。
+0

你是什麼意思「隔離並使其花費幾秒鐘」?我應該在每次迭代中添加一次睡眠呼叫嗎? – devil0150

+0

@ devil0150絕對不是! :)我的意思是,循環足夠多的時間,執行時間比隨機延遲/上下文切換/填充緩存更長/ ...如果測量代碼的運行時間通常相差10毫秒,或者可能延遲10毫秒,決定在同一時間交換,你希望你的代碼運行1秒左右,這樣錯誤是微不足道的。或者,您可以運行數百次,精確測量每次運行並選擇最低時間。 – viraptor