8

いくつかのオープン ソース プロジェクトで、プログラマーが何を使用しているかを考えていないときに、最適ではないコードに遭遇しました。

この回答で説明されているように、Math.Pow は内部で Exp および Ln 関数を使用するため、2 つのケースの間に最大 10 倍のパフォーマンスの違いがあります。

通常の乗算​​は、ほとんどの場合 (小さなべき乗で) ベキ乗よりも優れていますが、もちろん、最良の方法は2 乗アルゴリズムによる指数です

したがって、コンパイラまたは JITter は、べき乗などの最適化を実行する必要があると思います。なぜまだ導入されていないのですか?私は正しいですか?

4

2 に答える 2

7

もう一度参照した anwser を読んでくださいpow()。Microsoft が Intel から購入した機能を CRT が使用していると明確に述べています。Math.Logとの使用Math.Exp例は、この記事のライターがプログラミングの本で見つけた例です。

一般的なべき乗法の「問題」は、すべてのケースで最も正確な結果を生成するように構築されていることです。これにより、特定のケースではパフォーマンスが最適化されないことがよくあります。これらの特定のケースのパフォーマンスを向上させるには、すべてのケースでパフォーマンスが低下する条件付きロジックを追加する必要があります。値の 2 乗または 3 乗はMath.Powメソッドなしで簡単に記述できるため、これらのケースを最適化したり、他のすべてのケースで余分な損失を取る必要はありません。

于 2012-09-22T10:14:33.977 に答える
0

両方のメソッドが毎回同じ結果を返すわけではないので、それは悪い考えだと思います。

ここに小さなテストスクリプトがあります

        var r = new Random();

        var any = Enumerable.Range(0, 1000).AsParallel().All(p =>
            {
                var d = r.NextDouble();

                var pow = Math.Pow(d, 2.0);
                var sqr = d * d;

                var identical = pow == sqr;
                if (!identical)
                    MessageBox.Show(d.ToString());

                    return identical;
            });

両方の実装の精度が異なります。信頼できる計算が行われれば、再現可能でなければなりません。たとえば、リリース実装だけで二乗最適化が使用される場合、デバッグ バージョンとリリース バージョンでは異なるソリューションが返されます。エラーのデバッグにはかなり混乱する可能性があります...

于 2012-09-22T11:37:34.273 に答える