0
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) 谁能告诉我为什么我看不到收益?

4

1 回答 1

2

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

通过用快速排序代替朴素排序,而不是(i != 0)(i).

无论如何,编译器都会为您完成所有这些工作。


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

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

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

(2) 谁能告诉我为什么我看不到收益?

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


只是为了好玩,这里有一个编译器可以做什么的例子:

unsigned int i = getValue();

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

}

那些看起来如此之少、如此不可简化的代码可以由编译器优化为:

unsigned int i = getValue();

if (i - 10 <= 190) {

}
于 2013-03-26T19:33:37.860 回答