凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46608
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

問題

1.以下のメソッドtestA-Dを実行時間の短いものから順に並べなさい【3点】

2.実行時間の違いの理由を説明しなさい【7点】

public class StringAppend {

    public static void main(String[] args) {
        final int loop = 1000;
        long base, temp;

        base = System.nanoTime();
        testA(loop);
        temp = System.nanoTime();
        System.out.print("A : ");
        System.out.println(temp - base);

        base = System.nanoTime();
        testB(loop);
        temp = System.nanoTime();
        System.out.print("B : ");
        System.out.println(temp - base);

        base = System.nanoTime();
        testC(loop);
        temp = System.nanoTime();
        System.out.print("C : ");
        System.out.println(temp - base);

        base = System.nanoTime();
        testD(loop);
        temp = System.nanoTime();
        System.out.print("D : ");
        System.out.println(temp - base);
    }

    public static String testA(int loop) {
        String str = "";
        for (int i=0; i<loop; i++) {
            str += "hoge" "piyo";
        }
        return str;
    }

    public static String testB(int loop) {
        String str = "";
        for (int i=0; i<loop; i++) {
            str += "hoge";
            str += "piyo";
        }
        return str;
    }

    public static String testC(int loop) {
        StringBuilder bul = new StringBuilder();
        for (int i=0; i<loop; i++) {
            bul.append("hoge" "piyo");
        }
        return bul.toString();
    }

    public static String testD(int loop) {
        StringBuilder bul = new StringBuilder();
        for (int i=0; i<loop; i++) {
            bul.append("hoge");
            bul.append("piyo");
        }
        return bul.toString();
    }
}

投稿日時 : 2007年11月27日 13:34
コメント
  • # re: Javaの文字列連結パフォーマンスクイズ
    凪瀬
    Posted @ 2007/11/27 13:35
    元ネタは「Javaとデータベースの相性」のコメント欄より
    http://blogs.wankuma.com/kacchan6/archive/2007/11/22/109701.aspx
  • # re: Javaの文字列連結パフォーマンスクイズ
    taka
    Posted @ 2007/11/27 14:42
    C,D,A,Bの順かな?

    実際に検証したことはないですけど通常の文字列結合より、
    StringBuilderのほうが早い。
    で、CとDならDのほうがAppend2回呼び出してる分オーバーヘッドがある。
    "hoge" + "piyo"なら別のインスタンスは出来ていないと思うのでCの方が早い。
    AとBならば+=を2回やっているBのほうが(これまた検証してないですけど+=のタイミングでインスタンスが作られる気がするので)Bのほうが遅い。
  • # re: Javaの文字列連結パフォーマンスクイズ
    かつのり
    Posted @ 2007/11/27 15:51
    C,D,A,Bの順ですね。

    A,BとC,Dの違いは、
    ループ外でStringBuilderのインスタンスが作られるか、
    ループ内でStringBuilderのインスタンスが作られるかの違いです。

    A,CとB,Dの違いは、
    "hogepiyo"か"hoge","piyo"の違いです。

    ちなみに、

    String foo = "";
    foo += "hoge";

    は、

    String foo = "";
    String ??? = String.valueOf(foo);
    StringBuilder builder = new StringBuilder(???);
    builder.append("hoge");
    foo = builder.toString();

    に置き換えられます。
    JDK1.4までの文字列連結は、StringBufferに置き換えられていましたが、
    JDK5以降はStringBuilderに置き換えられるようです。
  • # re: Javaの文字列連結パフォーマンスクイズ
    凪瀬
    Posted @ 2007/11/27 16:10
    解説記事の準備ができていないので回答編は夜に載せますね。
  • # re: Javaの文字列連結パフォーマンスクイズ
    なちゃ
    Posted @ 2007/11/27 16:30
    Hotspotで最適化されて想像外な結果になるというオチはあります?
  • # re: Javaの文字列連結パフォーマンスクイズ
    melt
    Posted @ 2007/11/27 18:17
    C++ 的に考えると "hoge" + "piyo" で新しい String を作っているので、その分がネックになって D, C, B, A になりそうですね。
  • # Javaの文字列連結パフォーマンスクイズ解答編
    凪瀬 Blog
    Posted @ 2007/11/28 0:22
    Javaの文字列連結パフォーマンスクイズ解答編
  • # re: Javaの文字列連結パフォーマンスクイズ
    bleis-tift
    Posted @ 2009/08/24 21:15
    トラックバックの送信に失敗するので、手動で失礼します。
    ■[Java]文字列の結合
    http://d.hatena.ne.jp/bleis-tift/20090824/1251115969
  • # <url>http://www.car-insur-online.com/|car insurence</url> >:-[[[ <url>http://www.autosinsurance4u.com/|auto insurance</url> >:-]]] <url>http://dynamicteencompany.org/|a auto insurance</url> 8045
    Joyce
    Posted @ 2012/10/20 1:08
    <url>http://www.car-insur-online.com/|car insurence</url> >:-[[[ <url>http://www.autosinsurance4u.com/|auto insurance</url> >:-]]] <url>http://dynamicteencompany.org/|a auto insurance</url> 8045
タイトル
名前
Url
コメント