質問

性能に違いがあるのか​​気になる

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

    そして

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

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

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

役に立ちましたか?

解決

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

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

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

最後に、なぜ電話をかけてきたのか System.out.println() パフォーマンスが重要なコードでは?ここでパフォーマンスを損なうものがある場合は、それが原因となります。

他のヒント

パフォーマンスを必要とする重要なコードセクションがある場合は、使用を避けてください。 System.out.println(). 。標準出力にアクセスすると、変数の代入よりも多くのオーバーヘッドが発生します。

解決策 1 を実行します。

編集:または解決策2

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

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

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

生成されたバイトコードは、 ない このバイトコードは、パフォーマンスのボトルネックであるとみなされる場合、分析、最適化、および (サーバー コンパイラーの場合) 再分析および再最適化されるため、特定のコード部分のパフォーマンスの適切な尺度になります。

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

コンソールへの出力と比較すると、 どれでも 2 つの間のパフォーマンスの差は測定可能なものになるでしょう。問題があることを測定して確認する前に最適化を行わないでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top