编译器修剪循环的执行和时间开销?

compiler prune loop excution and time costing?

本文关键字:时间 开销 执行 修剪 循环 编译器      更新时间:2023-10-16

我目前正在尝试使用虚拟循环样本来玩openmp。我发现奇怪的是,编译器可能会删减一些代码,而时间成本的结果并不像预期的那样。即使我不导入任何openmp的东西也是如此

我的测试很简单。虚拟循环,看看花了多长时间。

    float duration;
clock_t start=clock();
long lasting=9999999;
long iter1;
long sum=0;
for(iter1=1;iter1<lasting;iter1++)
{
    sum=iter1*10;
}
clock_t finish=clock();
//cout<<sum<<endl;
duration = (float)(finish - start) / CLOCKS_PER_SEC;
printf( "%f secondsn", duration );

这需要0.0000秒,我认为循环内的代码没有执行。只要取消注释cout<<sum<<endl;,它显示0.006秒。

编译器是否删除了不需要的/有用的代码而不执行输出?我用visual studio 2010和标准项目设置运行这个程序。

当然可以!在运行测试时,确保实际使用循环中生成的数据是至关重要的。这被称为死代码消除,是最著名的编译器优化之一。

另外,请注意,您的循环可以简单地并行化,因为它没有任何数据依赖关系。您的编译器还能够并行处理像这样的循环(以及许多其他循环优化,如展开),甚至更复杂的循环。如果你想测量"纯"性能,你需要使用必要的编译器标志来控制自动优化。