c - 优化嵌套 for 循环

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

最佳答案

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

您可以通过将简单排序替换为快速排序来获得更高的性能,而不是将 (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) {

}

关于c - 优化嵌套 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15645583/

相关文章:

c - 包含函数的 .h 文件

c++ - 列出 n 个对象的所有 k-排列的有效方法,同时满足特定标准

sql - mysql:哪些查询可以使用哪些索引?

linux - 查找包含特定文本的行,并打印该文本之后的内容

asp.net - 受 asp.net MVC 启发的更好的 WebForms

c - 合并 2 个二进制文件。文件之间的残留数据

c - 如何在 linux 上将两个虚拟地址映射到同一物理内存上?

在服务器上编写简单平面文件的 C 代码

python - 使用 Scipy 最小化数据线性组合的函数

c++ - 我怎样才能制作一个 C++ 程序来找到任何大小矩阵的行列式和逆矩阵?