0

次の2つの間にパフォーマンスの違いはありますか?

if(i>=0){
    //some code here
}

//and

if(i>-1){
    //some code here
}

そして、次の2つはどうですか?

if(i>=0){
    //some code here
}

//and

if(i>0 || i==0){
    //some code here
}

>= 内部的に ? に変換され> || ==ますか?

PSパフォーマンスの違いはごくわずかで、無視できるかもしれませんが、パフォーマンスの違いはまったくありますか?

4

5 に答える 5

2

現代の JVM では、この種の考え方は無意味だと思います。JVM は、コードをコンパイルして停止するだけではありません。実行時にコードを学習し、それに応じて動作を変更します。現在、私はコンパイラの専門家ではありませんが、私が理解していることから、JVM は非常にスマートであり、常に true または false に評価されるif値を確認すると、実行時にステートメント全体を基本的に最適化する可能性があります。i

このようにミクロな方法でコードを「最適化」したいときはいつでも、立ち止まって、JVM ほど賢くないことを思い出してください。実行時にコードが何をするかを実際に確認し、それに応じて動作を変更します。

VM がどれほど優れているかについてのヒントを提供する、Steve Yegge による講演からのこの優れたトランスクリプトを確認してください。そして、これは今から数年前のことです!

http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html

より良い例を追加

これらは Josh Bloch による講演のスライドで、現在マイクロ ベンチマークがいかに不可能であるかについて語っています。コードのソース行を見て、実行時に JVM が何をするかを知ることはできません。私のお気に入りのスライドは、ショート サーキット オペレーター&&が常に高速であった方法ですが、最新のハードウェアでは、これが常に正しいとは限りません。完全に直感に反しています。つまり、この道をたどろうとするのをやめるべきです。

http://wiki.jvmlangsummit.com/images/1/1d/PerformanceAnxiety2010.pdf

于 2012-07-24T04:20:48.220 に答える
1

答えはプラットフォームに依存します。つまり、Javaインストールのハードウェアプラットフォーム、ISA、およびJITコンパイラに依存します。

そして、これは答えを知ることをかなり無意味にします...あなたは特定のハードウェア/ ISA/JITコンパイラプラットフォームのためにマイクロ最適化する時間を無駄にしたくないので。

しかし、知る必要がある場合は、ベンチマークを行う必要があります...Javaベンチマークから有効な結果を取得するために必要なすべてのことを実行するように注意してください。


FWIW-最新のJITコンパイラーは、どちらの場合もサブケースに対して同等のネイティブコードを生成すると思います。つまり、使用するパフォーマンスに違いはありません。しかし、i>0 || i==0それは無意味な難読化であり、そのために避ける必要があります。

于 2012-07-24T04:08:34.877 に答える
0

最初の方法の方が良いと思います。

2 番目の例では、3 つの比較が必要です。

  1. if (i > 0)
  2. if (i == 0)
  3. 1 と 2 の論理和。

ただし、実際の結果は、コンパイラが2つのコードを同一になるように最適化できるかどうかに依存します(同じことをしているため)。

多分ベンチマークはより良い考えです。

于 2012-07-24T03:58:57.857 に答える
0

を使用して対応するアセンブリ コードを確認するobjdumpか、実行時に実際にリタイアした命令の数を調べることができます。ただし、パイプラインでは、必要な実際のサイクルはそれほど明確ではない場合があります。

于 2012-07-24T04:01:48.203 に答える
0

これは実装に依存するため、本当に気にする場合は、特定のプラットフォームのベンチマークを行う必要があります。

そうは言っても:

  • 最初の 2 つは、合理的に最新のハードウェアと JVM の組み合わせではおそらく同等です。最新のハードウェアでは、すべての比較が同じように実行される傾向があります。
  • 2 番目の 2 つについては、最初のオプションの方がおそらく高速です。巧妙なコンパイラは同等性を見つけて同じ単一のネイティブ操作を生成しますが、現在の JIT コンパイラの中にはこれを見つけられないものがあると思います。ただし、最初のオプションを使用する方が読みやすく維持しやすいため、とにかく最初のオプションを使用する必要があります。
于 2012-07-24T04:54:53.343 に答える