-6

以下の for ループから、java でどちらが速いか

  1. for(int i = 100000; i > 0; i--) {}
  2. for(int i = 1; i < 100001; i++) {}

スピードの価値ある理由を教えてください。これは、アプリケーションのパフォーマンスを向上させるのに本当に役立ちます。

4

5 に答える 5

7

Java 言語の仕様では、特定のステートメントの実行にかかる時間が指定されていないため、あなたの質問に対する答えはありません。

十分にスマートなコンパイラーは、両方のステートメントをノーオペレーションに自由にコンパイルし、それでも準拠しています。実際、JIT はこれらの両方のケースでそうする可能性が最も高いです。

于 2012-05-11T15:01:58.560 に答える
5
  1. 一概にどちらが速いとは言えません。プラットフォーム、命令セット、JIT コンパイラなどに依存します。

  2. このJITコンパイラは、ループを完全に最適化する可能性があります...あなたの例では...ループ本体が空であり、コードが明らかに全体の計算に影響を与えないためです。

  3. 実際のコードに空のループがないと仮定すると、実際のループ本体 (およびおそらくループの前後にあるもの) は、ループ用に生成されたコード、したがってそのパフォーマンスに強く影響します。

  4. どちらかのバージョンを選択しても、アプリケーションの全体的なパフォーマンスに大きな違いはおそらくありません。

  5. それでも効果があると思われる場合は、アプリケーションを両方の方法でコーディングし、実際のパフォーマンスをテストしてください。ただし、テストから得られる答えは、コードのコンテキスト、ループ本体の内容、コンパイラ、ハードウェアなどによって異なることに注意してください。(そして、Java のマイクロベンチマークの落とし穴に注意してください。たとえば、@Vulcan がサンプル コードのパフォーマンスを測定しようとしたときに発生した問題などです。)

  6. 自明ではない/ゆがんだ方法でコードを記述すると、JIT コンパイラのオプティマイザーが最適な結果を生成するのを実際に阻害する可能性があります。通常、オプティマイザは、典型的なプログラムに現れる可能性が高いコード パターンに焦点を当てるように調整されています。ほとんど使用されないあいまいなコード パターンを探すのに時間がかかると、JIT コンパイラが遅くなるだけです。


この質問をしているという事実は、「時期尚早の最適化」の間違いを犯していることを示唆しています。これで時間を無駄にするのではなく、簡単な方法でコードを記述し、それを機能させてから、実際の入力を使用してプロファイリングします。プロファイラーの出力を使用して、手作業による最適化に時間を費やすことが有益な場所を導き出します。

于 2012-05-11T15:05:54.813 に答える
2

これが実際にアプリケーションのパフォーマンスに影響を与えるとは思えません。 時期尚早の最適化は諸悪の根源です。

最適化する前に、プロファイラーを使用して、アプリケーションのどこにボトルネックがあるかを見つけてください。

于 2012-05-11T15:03:00.523 に答える
1

インクリメントとデクリメントの違いは重要ではありませんが、そのループの本体で何が実行されているかを正確に考慮すると、これら2つの間に重要な違いがある可能性があります-そして、それについて一般的な声明を出す方法は明らかにありません.

于 2012-05-11T15:49:18.823 に答える
0

関係ないと思います。どちらも同じように実行します。なんで?Java Virtual Machine というものがありますが、どちらも同じ文として認識できるように最適化されていると確信しています。

于 2012-05-11T15:02:29.277 に答える