为什么删除代码时循环变慢

如何解决为什么删除代码时循环变慢

| 当我从循环中删除测试以计算最小值和最大值时,执行时间实际上比测试更长。那怎么可能呢? 编辑: 运行更多测试后,似乎运行时不是恒定的,即相同的代码 可以在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。 PS。我认为您可以合并
if (q>0.008856)
if (q<=0.008856)
。     ,也许是缓存,可能是展开问题,只有一种方法可以解决此问题:查看生成的代码(例如,使用
-S
选项)。也许您可以将其发布/或在比较它们时发现差异。 编辑:正如您现在澄清的那样,这只是度量,我只能向您推荐(或更好的命令;-),当您想要获取运行时编号时:始终将其放入某个循环并取平均值。最好在程序外(在Shell脚本中)执行此操作,因此缓存中尚未填充正确的数据。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?