0
在運行一些基準測試程序時,掛鐘時間可能會令人吃驚地給出一個非常小的持續時間,這是因爲各種編譯器優化(如死代碼消除,循環解開...)優化了測試代碼。如何在發佈模式下正確編寫基準程序?
我可以通過靜態/易失性限定符添加一些「外部依賴」,但這並不總是奏效。
有什麼想法?
在運行一些基準測試程序時,掛鐘時間可能會令人吃驚地給出一個非常小的持續時間,這是因爲各種編譯器優化(如死代碼消除,循環解開...)優化了測試代碼。如何在發佈模式下正確編寫基準程序?
我可以通過靜態/易失性限定符添加一些「外部依賴」,但這並不總是奏效。
有什麼想法?
通常,通過靜態/易失性限定符添加「一些」外部依賴「將改變實際行爲,因此不建議進行計時。
我通常確保代碼可以被測試的方式是通過使用argc
(第一ARG到主) 如果我需要一個循環,我更改使用argc
的輸入數據。也有一些虛擬的計算值依賴於代碼並在循環和計時器後打印,以確保結果不會被優化。
如果您的填充函數可以接受種子,您也可以使用argc
作爲種子的一部分。
因此,如果您有隨機測試數據或用於測試代碼的循環,請將argc
添加到它。
不知道正是你正在測試的最好的,我能做的就是像成才
seed=argc; // the compiler cannot count on any value of argc
dummy=0;
total_time=0;
for (rep=0; rep < max_rep; ++rep)
{
for (i =0; i < max_array; ++i)
{
test_array[i]=seed+gen_random(); // Note use of seed
}
start=time_now();
dummy+=function_to_time(test_array); // this is what you are testing
end=time_now();
total_time+=end-start;
seed++; // change seed just to be extra paranoid
}
std::cout << "Time=" << total_time << " Dummy=" << dummy << std::endl;
只要把它原樣。如果你是基準測試,那是因爲你需要現實的測量。編譯器優化是其中的一部分。 – 2014-01-13 15:13:57
@ H2CO3這並非完全正確。 3DMark用於在CPU上進行渲染測試,這與現實測量非常相似。基準的目標是衡量(通常)硬件之間的性能比。即使測試是非常不切實際的,只要你一直使用相同的測試,你仍然可以比較硬件。 – Kevin
@Kevin但是如果不同的硬件處理的是volitile與non-volatile不同的比率,並且你不需要volitile –