2013年8月17日土曜日

Exceptionを利用したループのハンドリング性能

Effective Java の Item57 にあるwhileループのやってはいけない例について調べてみました。
たぶん、こんな使い方する人はいないんだと思いますが、悪いことしかないってことを確かめたかったので。

調べたのは性能です。ソースを見るとわかりますが、エラーなのかループの終了なのか判断できないため、使う人はいないと思います。

以下の2つの性能を比較しました。
例1)
// Horrible abuse of exceptions. Don't ever do this!
try{
  int i = 0;
  while(true)
    range[i++].climb();
}catch{ArrayIndexOutOfBoundsException e{
}
例2)
int i = 0;
while(range. length > i)
  range[i++].climb();
配列のサイズは100、試行回数は1万回。累積時間(ms)を計測した結果です。

例1  230ms
例2  2ms

こんなに差があるとは思ってなかったですが、100倍違います。

EffectiveJavaでは、現在のJVMを利用した場合は遅い。とか書いてありましたが、昔は早かったのでしょうか。
そうだとすると、悪い書き方をしたソースがあるかもしれないですよね....
この例だけでは言えませんが、正当な作り方をしておくと、のちのち性能が上がるかも知れない。
ということでしょうか。
その場しのぎのコーディングはやめようと思います。

0 件のコメント:

コメントを投稿