文字連結実行速度比較実験

文字列連結の速度比較実験です。
- Page 3 - << 先頭のページ< 前のページ次のページ >最後のページ >>

Home > 試してみよう Java実験コーナー > 文字列連結実行速度比較


文字列連結実行速度比較

このページには、以下のサンプルを掲載しています。 下の項目をクリックをすると各サンプルにジャンプします。 ※2週間以内の新着記事はNewアイコン、更新記事はUpアイコンが表示されます。
  1. 文字列の連結−速度比較  

文字列の連結には、いくつかの方法があります。単純に+演算子で連結させる方法やStringクラスの concatメソッドを使う方法、StringBufferやStringBuilderを使う方法など。それぞれ一長一短あるのですが、 速度的にはどのくらいの違いがあるでしょうか。StringBufferよりStringBuilderの方が早いよって話は、よく聞くのですが実際には、どのくらいの違いがるのか。 それぞれの方法で速度比較を行ってみました。

■文字列の連結−速度比較

[ 実験に使ったプログラムのソースコード - ConcatTest.java - ]
  1. import java.util.ArrayList;
  2. import java.util.Calendar;
  3. import java.util.List;
  4. public class ConcatTest {
  5.   static public void main(String args[]){
  6.     // 連結回数
  7.     int count = 10000;
  8.     // 開始ミリ秒を保持する変数
  9.     long begin = 0;
  10.     // 終了ミリ秒を保持する変数
  11.     long end = 0;
  12.     // 連結文字列保持する変数
  13.     String string = "";
  14.     // 文字列のリスト作成
  15.     List strings = new ArrayList();
  16.     for ( int i = 0; i < count; i++ ) {
  17.       strings.add("[Str" + String.format("%1$03d", i)+"]");
  18.     }
  19.     ConcatTest cst = new ConcatTest();
  20.     // +演算子による文字連結
  21.     begin = Calendar.getInstance().getTimeInMillis();
  22.     string = cst.concat1(strings);
  23.     end = Calendar.getInstance().getTimeInMillis();
  24.     System.out.println("+演算子による文字列連結");
  25.     System.out.println(" 連結回数 = " + count );
  26.     System.out.println(" 連結後文字列の文字数 = " + string.length() );
  27.     System.out.println(" 実行時間 = " + (end - begin) + " ミリ秒");
  28.     System.out.println();
  29.     // String.concatによる文字連結
  30.     begin = Calendar.getInstance().getTimeInMillis();
  31.     string = cst.concat2(strings);
  32.     end = Calendar.getInstance().getTimeInMillis();
  33.     System.out.println("String.concatによる文字列連結");
  34.     System.out.println(" 連結回数 = " + count );
  35.     System.out.println(" 連結後文字列の文字数 = " + string.length() );
  36.     System.out.println(" 実行時間 = " + (end - begin) + " ミリ秒");
  37.     System.out.println();
  38.     // StringBufferによる文字連結
  39.     begin = Calendar.getInstance().getTimeInMillis();
  40.     string = cst.concat3(strings);
  41.     end = Calendar.getInstance().getTimeInMillis();
  42.     System.out.println("StringBufferによる文字列連結");
  43.     System.out.println(" 連結回数 = " + count );
  44.     System.out.println(" 連結後文字列の文字数 = " + string.length() );
  45.     System.out.println(" 実行時間 = " + (end - begin) + " ミリ秒");
  46.     System.out.println();
  47.     // StringBuilderによる文字連結
  48.     begin = Calendar.getInstance().getTimeInMillis();
  49.     string = cst.concat4(strings);
  50.     end = Calendar.getInstance().getTimeInMillis();
  51.     System.out.println("StringBuilderによる文字列連結");
  52.     System.out.println(" 連結回数 = " + count );
  53.     System.out.println(" 連結後文字列の文字数 = " + string.length() );
  54.     System.out.println(" 実行時間 = " + (end - begin) + " ミリ秒");
  55.     System.out.println();
  56.   }
  57.   /**
  58.    * 引数の文字列リストを+演算子によって連結して
  59.    * 連結された文字列を返します。
  60.    * @param strs
  61.    * @return 連結文字列
  62.    */
  63.   public String concat1(List strs) {
  64.     String strings = "";
  65.     for ( String str : strs ) {
  66.       strings += str;
  67.       strings += "\n";
  68.     }
  69.     return strings;
  70.   }
  71.   /**
  72.    * 引数の文字列リストをString.concatによって連結して
  73.    * 連結された文字列を返します。
  74.    * @param strs
  75.    * @return 連結文字列
  76.    */
  77.   public String concat2(List strs) {
  78.     String strings = "";
  79.     for ( String str : strs ) {
  80.       strings = strings.concat(str);
  81.       strings = strings.concat("\n");
  82.     }
  83.     return strings;
  84.   }
  85.   /**
  86.    * 引数の文字列リストをStringBufferによって連結して
  87.    * 連結された文字列を返します。
  88.    * @param strs
  89.    * @return 連結文字列
  90.    */
  91.   public String concat3(List strs) {
  92.     StringBuffer strings = new StringBuffer();
  93.     for ( String str : strs ) {
  94.       strings.append(str);
  95.       strings.append("\n");
  96.     }
  97.     return strings.toString();
  98.   }
  99.   /**
  100.    * 引数の文字列リストをStringBuilderによって連結して
  101.    * 連結された文字列を返します。
  102.    * @param strs
  103.    * @return 連結文字列
  104.    */
  105.   public String concat4(List strs) {
  106.     StringBuilder strings = new StringBuilder();
  107.     for ( String str : strs ) {
  108.       strings.append(str);
  109.       strings.append("\n");
  110.     }
  111.     return strings.toString();
  112.   }
  113. }
[ サンプルプログラムの実行結果 ]
+演算子による文字列連結
 連結回数 = 10000
 連結後文字列の文字数 = 99000
 実行時間 = 10985 ミリ秒

String.concatによる文字列連結
 連結回数 = 10000
 連結後文字列の文字数 = 99000
 実行時間 = 4484 ミリ秒

StringBufferによる文字列連結
 連結回数 = 10000
 連結後文字列の文字数 = 99000
 実行時間 = 16 ミリ秒

StringBuilderによる文字列連結
 連結回数 = 10000
 連結後文字列の文字数 = 99000
 実行時間 = 0 ミリ秒

[ 結果解説 ]
サンプルのプログラムの実行結果は、実行する環境や実行時の状況などによって変わってくると思いますが、 各実行時間の傾向的には、似たような結果になると思います。
サンプルでは、まずListを使って一万個の文字列を作っています。それら全ての文字列を前述のそれぞれの文字列連結の方法を使って連結させています。 連結の方法は、+演算子による連結String.concatによる連結StringBufferによる連結StringBuilderによる連結です。 それぞれの方法の最初と最後でシステム時刻を取得して終了時刻と開始時刻の差分で実行にかかった時間を計測しています。 +演算子による文字連結は、手軽ですが実行にかなり時間がかかります。String.concatによる連結は、+演算子による連結より 半分以下の速度ですんでいますが、StringBufferやStringBuilderと比べると遅いです。
StringBufferとStringBilderは、さすがに早いですね。StringBuilderにいたっては、1万個の文字列を連結させても 1ミリ秒以下で終わっています。
StringBuilderは、1ミリ秒以下で終わっちゃってるので今度は、10万個の文字連結でやってみます。
+演算子の連結とString.concatの連結は時間がかかりすぎるので今回は、除外。StringBufferとStringBuilderで比較します。まず、上記実験用サンプルの29行目から47行目をコメントアウトします。
それから10万個連結なので10行目のcountの値を100000に変更。
。。。で、実行!!
以下、実行結果です。

[ サンプルプログラムの実行結果2 ]
StringBufferによる文字列連結
 連結回数 = 100000
 連結後文字列の文字数 = 1089000
 実行時間 = 188 ミリ秒

StringBuilderによる文字列連結
 連結回数 = 100000
 連結後文字列の文字数 = 1089000
 実行時間 = 78 ミリ秒
StringBuilderの方は、StringBufferの半分以下の時間で終わっているのがわかります。



- Page 3 - << 先頭のページ< 前のページ次のページ >最後のページ >>


最終更新日:2019/02/13

2015-03-01からの訪問者数
  2801 人