-5

これは実際には一種の学術的な質問です。どちらが速いか知りたいだけです。違いはごくわずかだと思いますが、それでも知りたいです。

if( (x == 1) || (x == 2) )

vs

if (x < 3)

ありがとう!

4

1 に答える 1

5

あなたが提供した形式では、複雑さに明らかな違いがあります。最初のコードは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

于 2012-06-24T17:27:54.630 に答える