【发布时间】:2011-02-13 16:22:37
【问题描述】:
我有一个奇怪的问题。我有以下代码:
template<clss index, class policy>
inline int CBase<index,policy>::func(const A& test_in, int* srcPtr ,int* dstPtr)
{
int width = test_in.width();
int height = test_in.height();
double d = 0.0; //here is the problem
for(int y = 0; y < height; y++)
{
//Pointer initializations
//multiplication involving y
//ex: int z = someBigNumber*y + someOtherBigNumber;
for(int x = 0; x < width; x++)
{
//multiplication involving x
//ex: int z = someBigNumber*x + someOtherBigNumber;
if(soemCondition)
{
// floating point calculations
}
*dstPtr++ = array[*srcPtr++];
}
}
}
内部循环执行了近 200,000 次,整个函数需要 100 毫秒才能完成。 (使用 AQTimer 分析)
我在外循环外发现了一个未使用的变量double d = 0.0; 并将其删除。在此更改之后,突然该方法需要 500 毫秒来执行相同数量的执行。 (慢 5 倍)。
这种行为可以在具有不同处理器类型的不同机器上重现。 (Core2,双核处理器)。
我正在使用优化级别为O2 的VC6 编译器。
以下是使用的其他编译器选项:
-MD -O2 -Z7 -GR -GX -G5 -X -GF -EHa
我怀疑编译器优化并删除了编译器优化/O2。在该功能变得正常后,它需要 100 毫秒作为旧代码。
有人能解释一下这种奇怪的行为吗?
为什么当我删除未使用的变量时编译器优化会降低性能?
注意:汇编代码(更改前后)看起来相同。
【问题讨论】:
-
你确定程序集看起来一样吗?它是“看起来一样”还是完全一样?
标签: c++ visual-c++ visual-c++-6 compiler-optimization