优化嵌套for循环

时间:2013-03-26 19:18:40

标签: c linux optimization

for (n = 0; n < L_SUBFR; n++)
{
    s = 0;
    for (i = 0; i <= n; i++)
    {
        s += exc[i] * h1[n - i];
    }
    y1[n] = s;
}

优化版:

for (n = L_SUBFR; n != 0; n--)
{
    for (i = n; i != 0; i--)
    {
        y1[n] = y1[n] + exc[i] * h1[n - i];
    }
}

在使用AMD opteron 6274编译后,我在gcc 4.4.6.位机器上运行了两个代码但是,我无法看到速度或执行时间的任何增益。

(1)我有什么方法可以进一步优化上述代码?

(2)任何人都可以告诉我为什么我无法看到收益吗?

1 个答案:

答案 0 :(得分:2)

您应该专注于制作可读代码而不是“快速”代码。通过提高算法效率来获得速度:

您可以通过快速排序替换天真排序来获得更高的效果,而不是将(i != 0)替换为(i)

无论如何,编译器会为你做所有这些。


我将回顾一下列出的更新问题:

  

(1)我有什么方法可以进一步优化上述代码?

当然,您可以将(i != 0)(n != 0)替换为(i)(n)并使用代码进行各种恶作剧和挑剔,以使其更快一点,但最终,你真的不会改变任何东西,因为你的编译器做了更多的优化。通常,它可以优化直接生成的装配。

  

(2)任何人都可以告诉我为什么我无法看到收益吗?

编译我的朋友。即使编译器在这里没有做任何事情,除非你有纳秒精度计时器,否则你不会注意到增益。最终,这取决于您对L_SUBFR的定义。


只是为了踢,这是编译器可以做的一个例子:

unsigned int i = getValue();

if (i >= 10 && i <= 200) {

}

编译器可以优化那些看起来如此简单,不可简化的代码:

unsigned int i = getValue();

if (i - 10 <= 190) {

}