<分区>
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) 谁能告诉我为什么我看不到增益?
您应该专注于编写可读代码而不是“快速”代码。通过提高算法效率来提高速度:
您可以通过将简单排序替换为快速排序来获得更高的性能,而不是将 (i != 0)
替换为 (i)
。
编译器无论如何都会为你做所有这些。
我将引用列出的更新问题进行回顾:
(1) Is there any way I can optimize the above code further?
当然,您可以将 (i != 0)
和 (n != 0)
替换为 (i)
和 (n)
并对代码进行各种恶作剧和吹毛求疵,以使其更快一点,但最终,您不会真正更改任何内容,因为您的编译器进行了更多优化。通常,它可以优化直接生成的程序集。
(2) Can any one tell me why i am not able to see the gain?
编译器我的 friend 。即使编译器在这里没有做任何事情,除非你有纳秒精度的计时器,否则你不会注意到增益。最终,这取决于您对 L_SUBFR
的定义。
只是为了好玩,这里有一个编译器可以做什么的例子:
unsigned int i = getValue();
if (i >= 10 && i <= 200) {
}
那些看起来如此精简、如此不可简化的代码,可以被编译器优化成这样:
unsigned int i = getValue();
if (i - 10 <= 190) {
}