かつのりの日記2

わんくまでは珍しいJavaを中心とした日記です

目次

Blog 利用状況

書庫

日記カテゴリ

いろいろリンク

【@IT会議室】nanoTime()メソッド

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コンパイラによってランタイム時に行われます。コンパイラによって生成されるバイトコードは基本的に同じです。

投稿日時 : 2007年7月11日 23:48

Feedback

# re: 【@IT会議室】nanoTime()メソッド 2007/07/11 23:55 中博俊

こりゃひどい。
意味もなくインスタンスを使いまわすなんて古すぎますよ。

# re: 【@IT会議室】nanoTime()メソッド 2007/07/12 10:35 けろ

ものによりきりですが、インスタンスをループ外で作らなきゃいけないんだったら、static でいいじゃん!ですね。

# re: 【@IT会議室】nanoTime()メソッド 2007/07/12 10:49 nagise

「基本的に変数宣言は必要最小限のスコープで行う」
としておくほうがフェイルセーフですかね。

本当に生成が無駄であればループの外に出せばいいんですが、
チューニングは高度な知識と経験を要求されるので初学者には教えないぐらいでちょうどいいかもしれない。

該当スレッドではパフォーマンス計測を話題としていますので、特別な意図で外に出したい気持ちはあるかもしれませんが。

# re: 【@IT会議室】nanoTime()メソッド 2007/07/12 15:39 Fujiwo

初心者には「変数宣言は必要最小限のスコープで行う」の方の基本を覚えてほしいですね。

「インスタンス生成はループの外で」なんて特殊な場合にしか役に立たない姑息な技の方が、初心者には重要度が低いと思います。

タイトル
名前
Url
コメント