1

間にパフォーマンスの違いがあるかどうか疑問に思っています

  1. 文字列 s = someObject.toString(); System.out.println(s);

  2. System.out.println(someObject.toString());

生成されたバイトコードを見ると、違いがあるようです。JVM は実行時にこのバイトコードを最適化して、両方のソリューションで同じパフォーマンスを提供できますか?

この単純なケースでは、もちろん解決策 2 の方が適切に思えますが、読みやすさのために解決策 1 を好むこともあり、重要なコード セクションでパフォーマンスが「低下」しないようにしたいだけです。

4

5 に答える 5

6

一時変数 (特に文字列のような小さなもの) の作成は、コードの速度には影響しないため、これについて心配する必要はありません。

コードのこの部分に費やされた実際の時間を測定してみてください。パフォーマンスにまったく違いがないことがわかるでしょう。結果を呼び出しtoString()て出力するのにかかる時間は、一時的な値を保存するのにかかる時間よりもはるかに長くかかります。ここで測定可能な違いがまったく見つかるとは思いません。

ここでバイトコードが異なって見える場合でも、それjavacは単純であり、JIT コンパイラが面倒な作業を行っているためです。このコードが速度にとって本当に重要な場合、コードは何度も実行され、JIT はネイティブ コードへのコンパイル用に選択します。これらの両方が同じネイティブ コードにコンパイルされる可能性が非常に高くなります。

最後に、なぜSystem.out.println()パフォーマンス クリティカルなコードを呼び出すのでしょうか? ここで何かがあなたのパフォーマンスを台無しにするなら、それはそうなるでしょう。

于 2009-06-03T06:34:24.933 に答える
2

パフォーマンスが要求される重要なコード セクションがある場合は、System.out.println(). 変数の割り当てよりも、標準出力に行くことで発生するオーバーヘッドが多くなります。

解決策 1 を実行します。

編集:または解決策2

于 2009-06-03T06:28:29.843 に答える
2

2 つのサンプルの違いがまったく違いを生むほど重要な*コードはありません。これをテストすることをお勧めします。両方を数百万回実行し、かかった時間を記録します。

より読みやすく保守しやすい形式を選択してください。

*効果を誇張する。十分に重要なコードがある場合は、これを学ぶためにそれを研究しています。

于 2009-06-03T06:30:10.197 に答える
2

生成されたバイトコードは、特定のコード片のパフォーマンスの良い尺度ではありません。なぜなら、このバイトコードは分析され、最適化され、(サーバー コンパイラの場合) 再分析され、再最適化されるからです。パフォーマンスのボトルネック。

疑わしい場合は、プロファイラーを使用してください。

于 2009-06-03T06:30:46.657 に答える
1

コンソールへの出力と比較すると、両者のパフォーマンスの違いは測定可能になるとは思えません。問題があることを測定して確認する前に最適化しないでください。

于 2009-06-03T06:27:56.427 に答える