2014-05-09 84 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)',所以编译器可以将它从循环中提取出来。这是一个经典的优化,如果至少有一个编译器能够将它应用到您的代码中,我不会感到惊讶。不这样做的编译器根本没有实现与纯函数相关的全部优化范围。 “ –