【发布时间】:2011-02-05 06:10:56
【问题描述】:
我有一个简单的代码段:
for( int i = 0; i < n; ++i)
{
if( data[i] > c && data[i] < r )
{
--data[i];
}
}
这是一个大型功能和项目的一部分。这实际上是对不同循环的重写,这被证明是耗时的(长循环),但我对两件事感到惊讶:
当 data[i] 像这样临时存储时:
for( int i = 0; i < n; ++i)
{
const int tmp = data[i];
if( tmp > c && tmp < r )
{
--data[i];
}
}
它变得更慢了。我不认为这应该更快,但我不明白为什么它应该这么慢,编译器应该能够确定是否应该使用 tmp。
但更重要的是,当我将代码段移到一个单独的函数中时,它的速度大约慢了四倍。我想了解发生了什么,所以我查看了 opt-report,在这两种情况下,循环都是矢量化的,并且似乎做了相同的优化。
所以我的问题是什么可以对一个没有被调用一百万次但本身很耗时的函数产生如此大的影响?在 opt-report 中寻找什么?
我可以通过保持它内联来避免它,但为什么困扰着我。
更新:
我应该强调,我主要关心的是理解为什么它在移动到一个单独的函数时变得更慢。使用 tmp 变量给出的代码示例,只是我在此过程中遇到的一个奇怪示例。
【问题讨论】:
-
只是一个强制性问题:您对所有构建都有最大优化?
-
尝试查看生成的程序集。
-
是的,都是用 O3 编译的。我还没有看过程序集,只是因为它是一个大型项目的一部分(也因为我不是程序集专家)。
标签: c++ optimization compiler-construction intel