http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39515&forum=12&start=9
ちょっと温度差を感じますね。初心者が見るんだからといって、間違っている事を正しいように言うのはどうかなと思いました。向こうにコメントしてもいいのですが、間違っている根拠を示すだけの材料がないので。
引用すると、
基本的にループ中で、
変数の宣言をしたり、余計なインスタンスの生成はしないですよね?
元のコードを見る限り余計なインスタンス生成とは思えないし、十分に適材適所な手段です。ループ単位で新しいインスタンスが必要なら生成すべきだし、ループ単位で共有されるインスタンスはループの手前で生成するべきで、ひとくくりで「基本的に」というのはどうかなと。よくループの中でArrayListにJavaBeanを入れる処理がありますが、中身が全て最後に設定した値が入っているというような質問を聞いたことがありませんか?こういうところって初心者の陥りやすい罠なのです。
ループの中で変数宣言することにより、スコープをより局所的にでき、バグを減らしやすいですし、実行効率もよくなります。実行効率についてはJVMやGCの実装によって変わるのですが、最近のJVMの傾向として、
- 実行効率を考えたトリッキーなコードよりも、直感的なコードの方がJITによって最適化されやすい
- スコープが狭い場合、ヒープではなくスタックにメモリが確保される(エスケープ解析)
- GCが短命オブジェクトとして判断しやすい
など、より大多数のコードが効率よく動くようにチューニングされています。特に最適化にいたっては、全体のパフォーマンスアップもありますが、全てのケースにおいて高速化ではなく、少ないケースを犠牲にしても大多数のケースで高速化という手法もとられています。したがって昔ながらの小手先の技は使わない方がよいのです。
ちなみに、最適化はJavaコンパイラでは行われずに、HotSpotと呼ばれるJITコンパイラによってランタイム時に行われます。コンパイラによって生成されるバイトコードは基本的に同じです。