2010-10-30 47 views
2

CPU緩存總是中斷我們測試某些代碼的性能。當我們測量函數的性能時,如何清空緩存

gettime(); 
func1(); 
gettime(); 

gettime(); 
func2(); 
gettime(); 
// func2 is faster because of the cache.(or page faults of func1()) 
// But we often misunderstand. 

當您測量代碼性能時,如何刪除緩存的影響。

我在Windows中找到了一些函數或方法。
請給我你的好建議。謝謝。

+0

沒有任何緩存,性能往往會很糟糕。我寧願嘗試測量代表性(即緩存)平臺上的代表性工作負載。 – 2010-10-30 14:44:09

+0

您是否想像主題中指示的那樣不時清空緩存?或者你想像問題本身所說的那樣完全禁用緩存? – 2010-10-30 15:10:07

+0

我想公平地運行這些功能。就這樣。如果func1沒有被緩存,func2也不能被緩存。如果func1導致頁面錯誤,func2也是如此。當然,我希望他們都不要導致頁面錯誤。 – Benjamin 2010-10-30 15:25:09

回答

0

良好的代碼利用緩存,所以你不能只關掉它(你可以,但這些結果將是完全不相關的)。

你需要什麼是在連續測試之間清空(或無效)緩存。這裏有一些提示:Invalidating the CPU's cache

1

你可以做的一件事就是調用一個函數,該函數有很多代碼,並且在調用正在分析的項目之間訪問大量內存。例如,在僞代碼(爲主要語言中性):

// loop some number of times 
{ 
    //start timing 
    profile_func(); 
    //stop timing 
    //add to total time 
    large_func(); // Uses lots of memory and has lots of code 
} 
// Compute time of profile func by dividing number of iterations by total time 

在large_func的代碼()可以是無義碼,像一些組OPS的重複一遍又 過來。關鍵是它或它的代碼在編譯時不會被優化,因此它實際上清除了CPU的代碼和數據高速緩存(以及L2和L3(如果存在的話)高速緩存)。

這是很多情況下非常重要的測試。重要的原因在於,通常獨立進行配置的小型快速功能可以非常快地運行,利用CPU緩存,內聯和註銷。但是,由於這些快速函數被調用的上下文,通常在大型應用程序中這些優點是不存在的。

作爲一個例子,通過在緊密循環中運行一百萬次迭代來分析一個函數,可能會顯示該函數的執行時間爲50納秒。然後使用我上面展示的框架運行它,突然之間它的運行時間可能會急劇增加到幾微秒,因爲它不能再利用它擁有整個處理器 - 它的寄存器和高速緩存本身。