2014-01-13 69 views
0

在運行一些基準測試程序時,掛鐘時間可能會令人吃驚地給出一個非常小的持續時間,這是因爲各種編譯器優化(如死代碼消除,循環解開...)優化了測試代碼。如何在發佈模式下正確編寫基準程序?

我可以通過靜態/易失性限定符添加一些「外部依賴」,但這並不總是奏效。

有什麼想法?

+0

只要把它原樣。如果你是基準測試,那是因爲你需要現實的測量。編譯器優化是其中的一部分。 – 2014-01-13 15:13:57

+0

@ H2CO3這並非完全正確。 3DMark用於在CPU上進行渲染測試,這與現實測量非常相似。基準的目標是衡量(通常)硬件之間的性能比。即使測試是非常不切實際的,只要你一直使用相同的測試,你仍然可以比較硬件。 – Kevin

+0

@Kevin但是如果不同的硬件處理的是volitile與non-volatile不同的比率,並且你不需要volitile –

回答

2

通常,通過靜態/易失性限定符添加「一些」外部依賴「將改變實際行爲,因此不建議進行計時。

我通常確保代碼可以被測試的方式是通過使用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; 
相關問題