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 に答える