如何告诉C ++不要优化丢弃的表达式?

时间:2014-07-21 20:28:07

标签: c++ visual-studio-2010 optimization

我想介绍一系列的matrice操作,以了解他们将花多少时间。 (当我想起CPU可以愚蠢地通过指令咀嚼时,我更倾向于考虑优化),

for(int n = 0; n < times; ++n){
    // scrambled to miss the cache on purpose
    matrix[ rand()%matrixLen ] * matrix[ rand()%matrixLen ];
}

我的编译器不断优化此表达式。有没有办法让它实际执行此代码,同时仍然保留所有其他优化?

3 个答案:

答案 0 :(得分:4)

最有可能的是,您需要使用#pragma。你如何做到完全取决于编译器(抱歉),但在这个过程中存在一定的共性:

// save your current options
#if SPEEDTEST
#pragma GCC push_options 
#pragma GSS optimize("whatever the settings are")
#endif

// ... your code

// restore options
#if SPEEDTEST
#pragma GCC pop_options
#endif

或在你的情况下:

#if SPEEDTEST
#pragma optimize("", off)
#endif

// ... your code

#if SPEEDTEST
#pragma optimize("", on)
#endif    

注意:you can't use some #pragma statements within a function

答案 1 :(得分:3)

您忽略计算结果,因此编译器可以将其删除。 只需存储结果:

<yourMatrixType> result = matrix[ rand()%matrixLen ];
for(int n = 0; n < times; ++n){
    // scrambled to miss the cache on purpose
    result *= matrix[ rand()%matrixLen ];
}

这应该会阻止编译器删除计算。

答案 2 :(得分:1)

生成一个便宜的结果,但在技术上依赖于所有结果。

例如,将它们全部添加并提取结果值。

然后,阻止优化返回值(创建动态库或其他),或输出分析代码的

这仍然需要重新排序代码元素,但它主要阻止表达式消除。 (小心结果很难在没有实际操作的情况下生成 - 添加比乘法更好,例如,一旦它到达0它就可以提前退出“假设”规则)