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)任何人都可以告诉我为什么我无法看到收益吗?
答案 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) {
}