append()内で"+"使うともったいない

スポンサーリンク

f:id:tkhstol-929:20180721192617p:plain

前回の記事で、Javaで文字列結合をするときはStringBuilderのappendメソッドを使うほうがいいと書きました。

programmers-outputs.hatenablog.com

しかし、appendの間違った使い方をしているコードをたまに見かけます。

appendの間違った使用例

例えばこんなコード

StringBuilder sb = new StringBuilder();
String val = "hoge";
sb.append("[" + val + "]")

+を使った文字列結合はそのたびにStringオブジェクトを生成するため処理速度が落ちます。

この例だと、"[" + val + "]"の部分でStringオブジェクトを生成してしまっているため、結局処理速度が落ちてしまいます。

改善例

こうしましょう

StringBuilder sb = new StringBuilder();
String val = "hoge";
sb.append("[").append(val).append("]");

+でつなぐのではなく、appendを複数回使ってつなぐのです。

では、改善前と改善後でどのくらい処理速度が変わるのでしょうか?

処理速度の違いを検証

下記コードで処理速度を比べてみました。

public class StringBuilderTest{
  public static void main(String[] args) {
    final int MAX_COUNT = 100;
    System.out.println("結合回数:" + MAX_COUNT + "回のとき");

    StringBuilder sb1 = new StringBuilder();
    StringBuilder sb2 = new StringBuilder();

    long resultTime1;
    long resultTime2;
    long startTime;
    long endTime;

    /********************* 改善前:append()内で文字列結合を行う場合 *********************/
    // 開始時間
    startTime = System.nanoTime();

    for (int i = 0; i < MAX_COUNT; i++) {
      sb2.append(Integer.toString(i) + "\n");
    }
    // 終了時間
    endTime = System.nanoTime();

    // 処理にかかった時間を算出
    resultTime1 = endTime - startTime;

    /********************* 改善後:append()を二回使う場合 *********************/
    // 開始時間
    startTime = System.nanoTime();

    // StringBuilderによる文字列結合
    for (int i = 0; i < MAX_COUNT; i++) {
      sb1.append(Integer.toString(i)).append("\n");
    }
    // 終了時間
    endTime = System.nanoTime();

    // かかった時間
    resultTime2 = endTime - startTime;

    System.out.println("① append()内で結合を行った時の処理時間:" + resultTime1 + "ナノ秒");
    System.out.println("② append()を二回使った時の処理時間:" + resultTime2 + "ナノ秒");
    System.out.println("② の方が " + (resultTime1 - resultTime2) + " ナノ秒速い");
  }
}

文字列結合を100回行った時の、処理速度の差を比較するプログラムです。

結果は以下。

f:id:tkhstol-929:20180721191145p:plain

appendを二回使うほうが速いですね。

にほんブログ村 IT技術ブログへ
にほんブログ村