c - 为什么删除代码后我的循环变慢了

标签 c gcc

当我从循环中删除用于计算最小值和最大值的测试时,执行时间实际上比测试要长。这怎么可能?

编辑: 运行更多测试后,运行时间似乎不是恒定的,即相同的代码 可以在 9 秒或 13 秒内运行……所以这只是一个重复的巧合。重复,直到你做了足够多的测试,即......

一些细节:

  • 最小最大测试的执行时间:9 秒
  • 没有最小最大测试的执行时间:13 秒
  • CFLAGS=-Wall -O2 -fPIC -g
  • gcc 4.4.3 32 位 现在在代码中指示要删除的部分

一些猜测: 糟糕的缓存交互?

void    FillFullValues(void)
{
    int i,j,k;
    double  X,Y,Z;
    double  p,q,r,p1,q1,r1;
    double  Ls,as,bs;
    unsigned long t1, t2;

    t1 = GET_TICK_COUNT();  
    MinLs = Minas = Minbs = 1000000.0;
    MaxLs = Maxas = Maxbs = 0.0;

    for (i=0;i<256;i++)
    {
        for (j=0;j<256;j++)
        {
            for (k=0;k<256;k++)
            {
                X = 0.4124*CielabValues[i] + 0.3576*CielabValues[j] + 0.1805*CielabValues[k];
                Y = 0.2126*CielabValues[i] + 0.7152*CielabValues[j] + 0.0722*CielabValues[k];
                Z = 0.0193*CielabValues[i] + 0.1192*CielabValues[j] + 0.9505*CielabValues[k];

                p = X * InvXn;
                q = Y;
                r = Z * InvZn;

                if (q>0.008856)
                {
                    Ls = 116*pow(q,third)-16;
                }
                else
                {
                    Ls = 903.3*q;
                }

                if (q<=0.008856)
                {
                    q1 = 7.787*q+seiz;
                }
                else
                {
                    q1 = pow(q,third);
                }

                if (p<=0.008856)
                {
                    p1 = 7.787*p+seiz;
                }
                else
                {
                    p1 = pow(p,third);
                }

                if (r<=0.008856)
                {
                    r1 = 7.787*r+seiz;
                }
                else
                {
                    r1 = pow(r,third);
                }

                as = 500*(p1-q1);
                bs = 200*(q1-r1);

                //
                // cast on short int for reducing array size
                // 
                FullValuesLs[i][j][k] = (char) (Ls);
                FullValuesas[i][j][k] = (char) (as);
                FullValuesbs[i][j][k] = (char) (bs);

                            //// Remove this and get slower code    
                if (MaxLs<Ls)
                    MaxLs = Ls;
                if ((abs(Ls)<MinLs) && (abs(Ls)>0))
                    MinLs = Ls;

                if (Maxas<as)
                    Maxas = as;
                if ((abs(as)<Minas) && (abs(as)>0))
                    Minas = as;

                if (Maxbs<bs)
                    Maxbs = bs;
                if ((abs(bs)<Minbs) && (abs(bs)>0))
                    Minbs = bs;
                            //// End of Remove

            }
        }
    }

    TRACE(_T("LMax = %f LMin = %f\n"),(MaxLs),(MinLs));
    TRACE(_T("aMax = %f aMin = %f\n"),(Maxas),(Minas));
    TRACE(_T("bMax = %f bMin = %f\n"),(Maxbs),(Minbs));
    t2 = GET_TICK_COUNT();
    TRACE(_T("WhiteBalance init : %lu ms\n"), t2 - t1); 
}

最佳答案

我认为编译器正在尝试展开内部循环,因为您正在消除迭代之间的依赖性。但不知何故,这对你的情况没有帮助。可能是因为循环太大并且使用了太多的寄存器无法展开。

尝试关闭展开并再次发布结果。

如果是这种情况,我建议您向 gcc 提交性能问题。

附言。我想你可以合并 if (q>0.008856)if (q<=0.008856) .

关于c - 为什么删除代码后我的循环变慢了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5651614/

相关文章:

c - 通过CGO传递结构

任何人都可以举一个例子说明这个优先级很重要吗?

c - 确保变量声明只发生在范围 block 的开头

c - 打印此星形时出现问题

C程序输出分析

c++ - 标准库和GCC的CLion链接器错误

c - 如何在 Linux 上调试 C 程序?

gcc - 运行 rhel6 构建的可执行文件时在 rhel7 机器上导入错误

c - 为什么不能在 ubuntu 上链接 64 位静态 libgcc

c - GDB宏在处理时使用一些数据结构来保存数据