8

c++で2乗するよりも乗算を行う方が効率的ですか?

最終的な詳細な最適化を行おうとしています。コンパイラは x*x を pow(x,2) と同じように扱いますか? 私の記憶が正しければ、なぜか掛け算の方が良かったのですが、c++11では関係ないのかもしれません。

ありがとう

4

8 に答える 8

20

pow()乗算を標準ライブラリ関数と比較している場合、そうです、乗算は間違いなく高速です。

于 2013-05-23T20:44:01.143 に答える
6

一般に、ホットスポットがあるという証拠がない限り (つまり、現実的なシナリオでコードをプロファイリングし、コードの特定のチャンクを特定していない限り)、そのようなピコ最適化について心配する必要はありません。あなたの巧妙なトリックは、実際には新しいプロセッサでパフォーマンスの低下を引き起こし、仮定が成り立たなくなる可能性があります。

アルゴリズムの変更は、コンピューティング費用に対して最大の効果が得られる場所です。それに集中してください。

乗算をいじったり、巧妙なビットハッカーを実行したり... えー、そこまで大したことじゃない* 現世代の最適化コンパイラは、その仕事において本当に非常に優れているからです。彼らに勝てないと言っているわけではありません。それらは可能ですが、簡単ではなく、おそらく Agner Fog のような少数の人々によってのみ可能です。

※もちろん例外もあります。

于 2013-05-23T20:54:32.503 に答える
5

パフォーマンスに関しては、常に測定を行って仮定を裏付けてください。その理論が正しいことを証明するベンチマークがない限り、その理論を決して信用しないでください。

また、C++ では 2 の二乗が得られないx ^ 2ことに注意してください。

#include <iostream>

int main()
{
    int x = 4;
    std::cout << (x ^ 2); // Prints 6
}

実例

于 2013-05-23T20:43:53.747 に答える
0

C/C++ には、ネイティブの "power" 演算子がありません。^ビット単位の排他的論理和 (xor) です。したがって、pow関数はおそらくあなたが探しているものです。

実際には、整数を二乗するx*xのが最も直接的な方法であり、一部のコンパイラは、可能な場合はマシン操作に合わせて最適化する場合があります。

于 2013-05-23T20:49:20.547 に答える
0

次のリンクを読む必要があります。 なぜ GCC は a*a*a*a*a*a を (a*a*a)*(a*a*a) に最適化しませんか?

pow(x,2) はおそらく x x に変換されます。ただし、pow(x,4) などのより高い累乗は、可能な限り最適に実行されない場合があります。たとえば、 pow(x,4) は、浮動小数点定義をどれだけ厳密にする必要があるかに応じて、3 つの乗算 x x x x または 2 つの (x x) (x*x) で実行できます (デフォルトでは、 3つの乗算。

たとえば、pow(x*x,2) が -ffast-math を使用した場合と使用しない場合で何が生成されるかを見るのは興味深いでしょう。

于 2013-05-24T17:41:39.957 に答える