水曜日 3 21, 2007

文字連結

すでにご存知の方が多いでしょうし、何をいまさらって感じだとおもいますが、
Javaでの文字列(String)の連結の性能について、
以前、ちょこっとテストをやったので結果をのっけたいとおもいます。

1. +演算子を使うケース
2. String.concat()をつかうケース 
3. StringBuffer.append()を使うケース

 の3パターンを計測してみました。
計測方法は、4byteの文字列 "fuga" を30000回連結しまくるだけのプログラムで
実行時間を比べるだけのシンプルなものです。
FullGCは起きないようheapの調整は実施しましたが、
+演算子、String.concat()では、YoungGCは避けられませんでした。
蛇足ですが、jreのバージョンは、以下のとおりです。

。。。。。
$ java -version java version "1.6.0" v1.5.8f. Copyright 2001 Pavel Kouznetsov. Java(TM) SE Runtime Environment (build 1.6.0-b105) Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)
上記、verion表記は clientですが、-client, -serverの両方で計測は実施しました。 結果は以下のとおりです。
ケースWrap Time:Client VMWrap Time: Server VM
1 +演算子 21641 ms 14078 ms
2 String.concat() 5890 ms 4200 ms
3 StringBuffer.append() 16 ms 31 ms
当たり前の結果ですみません。 テストプログラムやテストデータ生成以外で そうそう無茶な回数の連結を行う必要はないかもしれないですが、 もしご入用の際には StringBuffer ですね。やっぱり。。。。 。。。。。。 。。。。。。 これで終っては申し訳ないので、、、、 jad って ByteCode から逆Compile してみます。  +演算子で記述したメソッドが以下に変換されました。   s = (new StringBuilder()).append(s).append("fuga").toString();  new してます。30000回もループしたらきついですね。やっぱり。  このへんでゆるしてください。

Comments:

Post a Comment:
Comments are closed for this entry.