FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

toString、valueOf、new String の速度比較

StringBuilderなどをStringに変換するのに、toString、valueOf、new Stringのどれが一番速いか比較してみた。

 StringBuilder、StringBufferをStringに変換する処理時間で比較。

■ソース(抜粋)
 以下のようなメソッドを呼んで、戻り値を標準出力に出力するクラスを作成
 ★部分をそれぞれのメソッドに変更して計測
   private long test(String str){
    StringBuilder sb = new StringBuilder(str);

    Calendar cal = Calendar.getInstance();
    long time = cal.getTimeInMillis();

    for(int i=0; i< LOOP; i++){
      sb.toString();//★
    }

    cal = Calendar.getInstance();
    return cal.getTimeInMillis() - time;
  }

■計測方法
 ループは10000000回。

 それぞれを10回実行し、平均値で比較。

 Javaのバージョンは、 java version "1.6.0_16"
 マシンのスペックなどはReadMeを参照

■結果
・StringBuilder
 1位:toString   655ミリ秒
 2位:valueOf    749ミリ秒
 3位:new String  889ミリ秒

 StringBuilderの場合、パフォーマンスだけを考えるなら、toStringが一番良いみたい。

・StringBuffer
 1位:valueOf    1170ミリ秒
 2位:toString   1233ミリ秒
 3位:new String  1575ミリ秒

 StringBufferの場合は、valueOfのほうが早いらしい。


■考察
 それぞれのソースを見てみる。

・StringBuilder.toString
public String toString() {
  return new String(value, 0, count);
}

・String.valueOf
public static String valueOf(Object obj) {
  return (obj == null) ? "null" : obj.toString();
}

・new String
public String(StringBuilder builder) {
String result = builder.toString();
this.value = result.value;
this.count = result.count;
this.offset = result.offset;
}

 toString、newStringの実装はStringBuffer、StringBuilderとも同じ

 StringBuilderの方は、ソース見たままでわかりやすいのだが、StringBufferのvalueOfの方が速い理由が不明。
 どう見ても、早くなるはずないと思うのだが。(測定に使用した値はnullは使用していない)
 ちょっと原因がわからない。

 まぁ、とりあえず、new Stringは遅いということは共通している。

■まとめ
・基本は toString
・nullの場合に例外にしたくない場合は valueOf

 という使い分けとしたい。

 と、ここまで書いて、StringBuilderの場合はJavaDocに、「toString メソッドを使って文字列ビルダから文字列を取得するのは、処理が高速になるので一般的に推奨されています」って書いてあることに気づいた orz
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

検索フォーム
プロフィール

takuan93

Author:takuan93
本ブログの説明書→「ReadMe」

管理者に連絡

カテゴリ
WiX (5)
Ant (1)
フリーエリア
最新記事
カウンター
カレンダー
08 | 2018/09 | 10
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。