繁体   English   中英

编译器优化导致性能降低

[英]Compiler optimization causing the performance to slow down

我有一个奇怪的问题。 我有以下代码:

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 ms才能完成。 (使用AQTimer进行分析)

我发现一个未使用的变量double d = 0.0; 外环外面并删除相同。 在此更改之后,突然该方法花费500毫秒来执行相同数量的操作。 (慢5倍)。

此行为可在具有不同处理器类型的不同计算机中重现。 (Core2,双核处理器)。

我正在使用优化级别为O2 VC6编译器。 Follwing是使用的其他编译器选项:

 -MD -O2 -Z7 -GR -GX -G5 -X -GF -EHa

我怀疑编译器优化并删除了编译器优化/O2 在该功能变得正常并且它作为旧代码花费100ms之后。

谁能对这种奇怪的行为有所了解?

为什么编译器优化会在我删除未使用的变量时降低性能?

注意:汇编代码(更改前后)看起来相同。

如果汇编代码在更改之前和之后看起来相同,则错误会以某种方式与您对函数计时的方式相关联。

VC6很危险。 众所周知,在几种情况下生成错误的代码,并且它的优化器也不是那么先进。 编译器已有十多年的历史,多年来甚至都没有得到支持。

实际上,答案是“你正在使用一个错误的编译器。预计有错误的行为,特别是在启用优化时。”

我不认为升级到现代编译器(或只是在一个上测试代码)是一个选项?

显然,生成的程序集不能相同,否则就没有性能差异。

唯一的问题是差异在哪里 并且有了一个错误的编译器,它可能是一些完全不相关的代码部分突然得到不同的编译和中断。 但最有可能的是,为此函数生成的汇编代码并不相同,并且差异非常微妙,您没有注意到它们。

widthheight声明为const {unsigned}整数。 { 应使用无符号,因为高度和宽度从不为负。 }

const int width = test_in.width();
const int height = test_in.height();

这有助于编译器进行优化。 使用const作为值,它可以将它们放在代码或寄存器中,因为它们不会发生变化。 此外,它减轻了编译器必须猜测变量是否在变化。

我建议打印出未使用的double和没有的版本的汇编代码。 这将使您深入了解编译器的思考过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM