2016-10-12 5 views
-3

ブール式の場合、 ">"と "<"は "> ="と "< ="より効率的ですか?後者の表現は同時に2つの条件 "="と "<"または "="と ">"をテストする必要があるからですか?比較>>>効率

+0

これらのパターンはマシンレベルでも1つのオペコードとして利用できます。別々のゼロとサインフラグがあるので、 '> = 0'はときどきもっと賢いことがあります。伝統的に部門だけが乗算よりも遅い。 –

答えて

2

いいえいいえ、ほとんどのマシンで効率に違いはありません。最新のCPU命令セットには、正確に同数のクロックサイクルで 'と等しい'というネイティブテストが含まれています。 JVMは比較を正しい命令に変換し、パフォーマンスは同等になります。

例えば、Intelチップの場合はhttps://en.wikipedia.org/wiki/X86_instruction_listings「ジャンプif」の説明を参照してください。各命令のレイテンシとスループットについては、http://www.agner.org/optimize/instruction_tables.pdfを参照してください。 Jccはすべて同じことを実行することがわかります。

はこのことを確認するために、私は次のコードを実行しました:

long t1 = System.currentTimeMillis(); 
    long t = 0; 
    for (long i = 0; i < 1E10; i++) 
      t++; 
    long t2 = System.currentTimeMillis(); 
    for (long i = 1; i <= 1E10; i++) 
      t++; 
    System.out.println((t2 - t1) + "/" + (System.currentTimeMillis() - t2)); 

結果は12701/12731.性能においてので有意差はなかったです。

1

これらの演算子の間にパフォーマンスの違いがあるのは間違いありません。

Java Bytecode命令セットは、それぞれ、より小さい演算子とより小さい演算子、またはより小さい演算子(ifltifle)を持っています。それ以上の比較演算子(ifgtおよびifge)にも同様の演算子があります。最終的には、これらのバイトコードがより低いレベルでどのように解釈されるかを判断するのはJVMの実装に依存しますが、今日のほぼすべての物理アーキテクチャがこの機能を一定に提供するので、これらの操作は一定時間内に起こるという安全な前提です時間。

1

O(n)(効率)の点で同じですが、if(a > b || a == b)if(a >= b)と同じです。唯一の違いは、コンピュータがいくつかの文字をより多く読むがコード効率は良いということですO(n+n)は実際には何も変更しませんO(n^n)などがある場合は重要です...

+0

複雑な理論は、2つの競合するアルゴリズムの理論的効率を分析するのに優れています。アルゴリズムを実装するために使用される実際のコードのパフォーマンスをチューニングするのにはあまり役に立ちません。これを行うには、実際の物理ハードウェア上にプロファイルコードが必要です。 – sprinter

関連する問題