2014-05-09 116 views
0

我正在運行一組比較不同libc字符串函數的基準測試。問題是GCC和Clang正在優化循環中的計算,因爲函數被標記爲「純」和「常量」。有什麼方法可以關閉優化或避開它?GCC和Clang:關閉純優化

+0

clang讓你選擇執行哪些通道,用gcc我不太確定 –

+3

基準測試這些東西的最好方法是使用結果。從輸出中打印出一個單獨的數字通常就足夠了。 – Mysticial

+0

使用純/常量函數,您希望使用結果,但您也希望確保每次都使用不同的參數調用它們,否則編譯器可能會執行一次調用。禁用編譯器傳遞(@Marco當然是gcc允許它)太脆弱了(除非你用-O0)。您可以嘗試自己聲明這些libc函數(而不是包含標準頭文件)並使用-fno-builtin編譯,因此編譯器不知道函數是純/常量,但更好地遵循Mysticial的建議。 –

回答

0

我解決了!該解決方案是討厭的,但它的工作原理:

volatile int x; 
for (...) 
{ 
    // ... 
    x = (int)f(args); 
} 

我從來沒有使用x的值,所以劇組將不會是一個問題。更好的是,現在我沒有得到關於不使用return value of function declared with pure attribute的錯誤。

+0

解決方案中沒有任何內容阻止編譯器的下一個版本或當前版本將該循環轉換爲'int i =(int)f(args);對於(...)x = i;' –

+0

@PascalCuoq:我聲明'x'爲['volatile'](http://en.wikipedia.org/wiki/Volatile_variable),所以編譯器知道它不應該'不要碰。 – refi64

+0

您將'x'聲明爲'volatile',因此編譯器知道在目標代碼中應該有與源代碼一樣多的訪問權限。 'volatile'限定符不適用於'(int)f(args)',所以編譯器可以將它從循環中提取出來。這是一個經典的優化,如果至少有一個編譯器能夠將它應用到您的代碼中,我不會感到驚訝。不這樣做的編譯器根本沒有實現與純函數相關的全部優化範圍。 「 –