0

最初のケース:

void lowTermReduction(int numerator, int denominator) {
    int gcd = GCD(numerator, denominator);
    numerator /= gcd;
    denominator /= gcd;
}

2 番目のケース:

void lowTermReduction(int numerator, int denominator) {
    int gcd = GCD(numerator, denominator);
    if (gcd != 1) {
        numerator /= gcd;
        denominator /= gcd;
    }
}

どちらがより効率的 (高速) ですか?
最初のケースでは、関数は常にnumerator除算を実行します。この除算が 1 で、との値を変更しない場合も同様ですdenominator。12/1 と 12/2 のどちらが CPU の方が速いかはわかりませんが、まったく同じだと思います。
2 番目のケースでは、代わりに、関数は大公約数が 1だけ異なる場合にのみ除算を行います。ただし、この場合は論理演算を実行しますif
効率の違いはありますか?もしそうなら、それらは適切ですか?

4

5 に答える 5

1

ほとんどのコンピューターの除算は、CPU が実行できる最も遅い算術演算の 1 つです。一方、条件付きジャンプは非常に高速です (パイプラインの問題を今忘れている場合)。

ただし、最初に、これが本当にプログラムのボトルネックであるかどうかを判断する必要があります。次に、両方のバージョンの時間を測定する必要があります。

最後に、数値を で除算しているため、パフォーマンスの向上は見られないと思います。1これはかなり高速である必要があり、ここでジャンプすると速度の問題のみが発生する可能性があるため、ifバージョンが遅くなる可能性があります。 .

この質問からのビルの回答を必ず読んでください。

于 2013-04-30T19:32:16.150 に答える
0

最初のケースは、平均して高速です。その理由は、2 番目の関数は常にその比較を行う必要があり、必要に応じて除算を行う必要があるからです。1 回か 2 回しか実行されない場合は違いに気付かないかもしれませんが、複数回実行されるより大きな関数の一部である場合は、わずかに目立つ可能性があります。

最初のものは、呼び出されたときに常に 1 つの操作を実行するため、n 回呼び出された場合、n 回の操作を実行します。2 番目に良いシナリオでは n 回の操作が実行されますが (すべての呼び出しの GCD が 1 の場合)、最悪のシナリオでは 2n 回の操作が実行されます。したがって、安全な賭けは最初のケースに行くことだと思います

于 2013-04-30T19:34:15.223 に答える