- - PR -
ループ内で使う変数の宣言位置について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-11-18 00:27
以下のような処理があるとします。
1 String s; for ( int cnt = 0; cnt < 10000000; cnt++ ) { s = "hoge"; s = "fuga"; } 2 for ( int cnt = 0; cnt < 10000000; cnt++ ) { String s = "hoge"; s = "fuga"; } どっちが処理として高速でしょうか? 処理内容に意味はありません. ”ものすごく重たいものをイメージしてください。” 変数の宣言をループの中でするか外でするかの質問です. |
|
投稿日時: 2004-11-18 01:06
変数の宣言ですのでコストは知れてますが、
1の方が当然速くなるはずです。 しかしコンパイラの実装によりますが、 最近のコンパイラは、2の様な書き方をすると 1に置き換えてくれます。 |
|
投稿日時: 2004-11-18 01:12
本当にループの中が「とても重たい処理」であれば、変数の宣言場所によるコストの差は
あったとしても無視できる程度でしょう。ただし、変数のスコープは狭ければ狭いほどよい、 とされているので、2の方が推奨される書き方であることは確かです。 |
|
投稿日時: 2004-11-18 01:35
まず、動かしてみてはいかがでしょう?
使うコンパイラ、JVMによって違いがあるかもしれません。 大して(または全く)変わらないのであれば読みやすい記述にするのが良いですね。 |
|
投稿日時: 2004-11-18 10:12
この例の場合、同じです。
定数のStringはバイトコードのコンスタントプールに保存されているので。 それを呼び出すだけ。 new String() のようにインスタンスを何度も生成するのだったら、話は別ですが、 基本的にスコープを狭めた方がバイトコード上、 変数を保存する場所が再利用されるのでヒープ領域上も有利です。 (ただし、バイトコードコンパイラ依存なので保障はできませんが) 良いプログラムのためにも、2を推奨します。 ---追記--- String以外の定数だったら、外に出したほうが良いですよ。(もちろんfinal宣言して) かつのりさんの言ってることも正しい。 [ メッセージ編集済み 編集者: same 編集日時 2004-11-18 10:21 ] |
|
投稿日時: 2004-11-19 00:10
みなさん、ご回答ありがとうございました。
コストをかけられず、よい例がかけませんでしたが、よくわかりました。 今まで何も考えずに2が正しいと思っていましたので、 状況に応じて使い分けるようにしたいと思います。 |
1