c++ - 用于计时测试的大循环以某种方式优化为无?

标签 c++ optimization compiler-optimization timing

我正在尝试测试一系列用于矩阵 vector 计算的库。为此,我只是做了一个大循环,然后在内部调用了我想要计时的例程。很简单。但是我有时会看到,当我提高编译器的优化级别时,无论循环有多大,时间都会下降到零。请参阅下面的示例,其中我尝试对 C 宏进行计时以计算叉积。编译器在做什么?除了允许对浮点运算进行最大优化外,我该如何避免呢?提前谢谢你

下面的示例是在配备 i5 英特尔处理器的计算机上使用 g++ 4.7.2 编译的。 使用优化级别 1 (-O1) 需要 0.35 秒。对于二级或更高级别,它下降到零。请记住,我想计时,所以我希望计算真正发生,即使对于这个简单的测试来说,这是不必要的。

#include<iostream>
using namespace std;

typedef double  Vector[3];
#define VecCross(A,assign_op,B,dummy_op,C)              \
(   A[0] assign_op (B[1] * C[2]) - (B[2] * C[1]),       \
    A[1] assign_op (B[2] * C[0]) - (B[0] * C[2]),       \
    A[2] assign_op (B[0] * C[1]) - (B[1] * C[0])        \
)

double get_time(){
  return clock()/(double)CLOCKS_PER_SEC;
}

int main()
{
  unsigned long n = 1000000000u;
  double start;

  {//C macro cross product                                                                                                                                              
    Vector u = {1,0,0};
    Vector v = {1,1,0};
    Vector w = {1.2,1.2,1.2};

    start = get_time();
    for(unsigned long i=0;i<n;i++){
      VecCross (w, =, u, X, v);
    }
    cout << "C macro cross product: " << get_time()-start << endl;
  }

  return 0;
}

最佳答案

问问自己,就最终用户可见的内容而言,您的程序实际上做什么

它显示计算结果:get_time()-start。循环的内容与该计算的结果无关,因为您实际上从未使用过在循环内修改的变量。

因此,编译器优化了整个循环,因为它是不相关的。

一种解决方案是输出在循环中被修改的变量的最终状态,作为您的 cout 语句的一部分,从而强制编译器计算循环。然而,一个聪明的编译器也可以弄清楚循环总是计算相同的东西,它可以简单地将结果直接插入到你的 cout 语句中,因为不需要在运行时实际计算它.作为解决此问题的方法,例如,您可以要求在运行时提供循环的输入之一(例如,从文件、命令行参数、cin 等中读取它) .

有关更多(可能更好)的解决方案,请查看此重复线程:Force compiler to not optimize side-effect-less statements

关于c++ - 用于计时测试的大循环以某种方式优化为无?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23445220/

相关文章:

c# - 如何获得特定长度的最大数量

编译器优化,线程安全?

java - 如果大部分方法在调用站点都是死代码,java 可以内联一个大方法吗?

c++ - 为什么编译器不能优化这两条语句?

c++ - 如何在没有 __thread 的情况下创建 pthread 特定变量

c++ - "ClassName objName; objName(1);"是什么意思?

c++ - 命名空间菜鸟问题 : two cpp files sharing the same namespace have the same variable

c - 算法 - 查找纯数字

performance - 代码清晰会扼杀应用程序性能吗?

c# - 从该行数据创建 HTML 表格的算法?