- PR -

ループ内で使う変数の宣言位置について

1
投稿者投稿内容
harumaki
常連さん
会議室デビュー日: 2004/09/09
投稿数: 32
投稿日時: 2004-11-18 00:27
以下のような処理があるとします。


String s;
for ( int cnt = 0; cnt < 10000000; cnt++ ) {
s = "hoge";
s = "fuga";
}


for ( int cnt = 0; cnt < 10000000; cnt++ ) {
String s = "hoge";
s = "fuga";
}

どっちが処理として高速でしょうか?
処理内容に意味はありません.
”ものすごく重たいものをイメージしてください。”
変数の宣言をループの中でするか外でするかの質問です.
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-11-18 01:06
変数の宣言ですのでコストは知れてますが、
1の方が当然速くなるはずです。

しかしコンパイラの実装によりますが、
最近のコンパイラは、2の様な書き方をすると
1に置き換えてくれます。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-18 01:12
本当にループの中が「とても重たい処理」であれば、変数の宣言場所によるコストの差は
あったとしても無視できる程度でしょう。ただし、変数のスコープは狭ければ狭いほどよい、
とされているので、2の方が推奨される書き方であることは確かです。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-18 01:35
まず、動かしてみてはいかがでしょう?
使うコンパイラ、JVMによって違いがあるかもしれません。

大して(または全く)変わらないのであれば読みやすい記述にするのが良いですね。
Same
会議室デビュー日: 2004/11/05
投稿数: 8
お住まい・勤務地: 鹿児島
投稿日時: 2004-11-18 10:12
この例の場合、同じです。
定数のStringはバイトコードのコンスタントプールに保存されているので。
それを呼び出すだけ。

new String()
のようにインスタンスを何度も生成するのだったら、話は別ですが、
基本的にスコープを狭めた方がバイトコード上、
変数を保存する場所が再利用されるのでヒープ領域上も有利です。
(ただし、バイトコードコンパイラ依存なので保障はできませんが)

良いプログラムのためにも、2を推奨します。

---追記---
String以外の定数だったら、外に出したほうが良いですよ。(もちろんfinal宣言して)
かつのりさんの言ってることも正しい。

[ メッセージ編集済み 編集者: same 編集日時 2004-11-18 10:21 ]
harumaki
常連さん
会議室デビュー日: 2004/09/09
投稿数: 32
投稿日時: 2004-11-19 00:10
みなさん、ご回答ありがとうございました。
コストをかけられず、よい例がかけませんでしたが、よくわかりました。

今まで何も考えずに2が正しいと思っていましたので、
状況に応じて使い分けるようにしたいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)