これは実際には一種の学術的な質問です。どちらが速いか知りたいだけです。違いはごくわずかだと思いますが、それでも知りたいです。
if( (x == 1) || (x == 2) )
vs
if (x < 3)
ありがとう!
これは実際には一種の学術的な質問です。どちらが速いか知りたいだけです。違いはごくわずかだと思いますが、それでも知りたいです。
if( (x == 1) || (x == 2) )
vs
if (x < 3)
ありがとう!
あなたが提供した形式では、複雑さに明らかな違いがあります。最初のコードは3つの演算子を使用し、次に2番目のコードは1つだけです。>
しかし、OK、このコードを入れて、 (or <
) と==
( )を比較したいと仮定します!=
。プログラムを調べているときにアセンブラーに直面したことがあるなら (しかし、きっとそうではないでしょう)、そのようなコードに気付くでしょう。
if (x < 3) /* action */;
次のように変換されます(x86 CPUの場合):
cmp %eax, 3 // <-- compare EAX and 3. It modifies flags register(*1) (namely ZF, CF, SF and so on)
jge @@skip // <-- this instruction tells CPU to jump when some conditions related to flags are met(*2).
// So this code is executed when jump is *not* made (when x is *not*
// greater or equal than 3.
/* here is action body */
@@skip:
// ...
次のコードを検討してください。
if (x == 3) /* action */;
それはほぼ同じアセンブリを提供します(もちろん、それは私のものとは異なるかもしれませんが、意味的には異なります):
cmp %eax, 3
jne @@skip // < -- here is the only difference
/* action is run when x is equal to 3 */
@@skip:
...
この両方のオペレーター (jge
およびjne
その他のジャンプ) は同じ速度でジョブを実行します (CPU はそのように作られているためですが、明らかにそのアーキテクチャーに依存します)。パフォーマンスへの影響が大きくなると、ジャンプの距離 (コード位置の違い)、キャッシュ ミス (プロセッサがジャンプを誤って予測した場合) などになります。一部の命令はさらに効果的ですが (たとえば、より少ないバイトを使用します)、唯一のことを覚えておいてください:あまり注意を払わないでください。アルゴリズムの最適化を行うことは常に良いことであり、一致を節約しないでください。コンパイラーに任せてください。そのような質問については、コンパイラーの方が実際に優れています。アルゴリズム、コードの可読性、プログラム アーキテクチャ、フォールト トレランスに焦点を当てます。速度は最後の要素にします。
(*1): http://en.wikipedia.org/wiki/FLAGS_register_%28computing%29
(*2): http://www.unixwiz.net/techtips/x86-jumps.html