2011年3月6日日曜日

+演算子、StringBuilder、StringBufferの文字列連結の時間計測

(JDK1.6)+演算子、StringBuilder、StringBufferのそれぞれで文字列を連結した場合の処理時間をNetBeansのプロファイラで計測した結果。



各テストが計測に妥当かどうか(コンパイラで最適化される書き方になっているかとか理解していないので)不明ですが…。意味のあるベンチマークとか私には難しすぎるw

1回こっきりだと、いずれも大差ないですが、繰り返し処理の場合は+演算子は相当不利っぽいので、普段は+演算子を使い、パフォーマンスが問題になった際には繰り返し処理内の文字列連結を確認することにしました(もちろん最もボトルネックになっているかどうかの計測は必要ですが)。

「いやいや計測方法がおかしいだろう」とか「そのコードじゃあ計測したことにならんよ」とか優しくおしえてくださいw

以下ソース

public class NewClassTest {

    private String s1 = "a";
    private String s2 = "b";
    private int loop1 = 1000;
    private int loop2 = 10000;
  
    public NewClassTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }
  
    @Before
    public void setUp() {
    }
  
    @After
    public void tearDown() {
    }

    @Test
    public void test01一回プラスで連結(){
        String str = s1 + s2;
    }

    @Test
    public void test02一回StringBuffer(){
        String str = new StringBuffer(s1).append(s2).toString();
    }

    @Test
    public void test03一回StringBuilder(){
        String str = new StringBuilder(s1).append(s2).toString();
    }

    @Test
    public void test04千回プラスで連結1(){
        String str = "";
        for (int i =0; i < loop1; i++) {
            str = str + i;
        }      
    }
  
    @Test
    public void test05千回StringBuilder1(){
        String str = "";
        StringBuilder sbui = new StringBuilder(str);
        for (int i =0; i < loop1; i++) {
            sbui.append(i);
        }
        str = sbui.toString();    
    }

    @Test
    public void test06千回StringBuffer1(){
        String str = "";
        StringBuffer sbuf = new StringBuffer(str);
        for (int i =0; i < loop1; i++) {
            sbuf.append(i);
        }
        str = sbuf.toString();    
    }

    @Test
    public void test07千回プラスで連結2(){
        String s = "abcdefg";
        for (int i = 0; i < loop1; i++) {
            s += "abc"+ "def";
        }
    }
  
    @Test
    public void test08千回StringBuilder2(){
        StringBuilder sbui = new StringBuilder("abcdef");
        for (int i = 0; i < loop1; i++) {
            sbui.append("abc");
            sbui.append("def");
        }
        sbui.toString();  
    }

    @Test
    public void test09千回StringBuffer2(){
        StringBuffer sbuf = new StringBuffer("abcdef");
        for (int i = 0; i < loop1; i++) {
            sbuf.append("abc");
            sbuf.append("def");
        }
        sbuf.toString();
    }

     @Test
    public void test10一万回プラスで連結1(){
        String str = "";
        for (int i =0; i < loop2; i++) {
            str = str + i;
        }      
    }
  
    @Test
    public void test11一万回StringBuilder1(){
        String str = "";
        StringBuilder sbui = new StringBuilder(str);
        for (int i =0; i < loop2; i++) {
            sbui.append(i);
        }
        str = sbui.toString();    
    }

    @Test
    public void test12一万回StringBuffer1(){
        String str = "";
        StringBuffer sbuf = new StringBuffer(str);
        for (int i =0; i < loop2; i++) {
            sbuf.append(i);
        }
        str = sbuf.toString();    
    }

  
    @Test
    public void test13一万回プラスで連結2(){
        String s = "abcdefg";
        for (int i = 0; i < loop2; i++) {
            s += "abc"+ "def";
        }
    }
  
    @Test
    public void test14一万回StringBuilder2(){
        StringBuilder sbui = new StringBuilder("abcdef");
        for (int i = 0; i < loop2; i++) {
            sbui.append("abc");
            sbui.append("def");
        }
        sbui.toString();  
    }

    @Test
    public void test15一万回StringBuffer2(){
        StringBuffer sbuf = new StringBuffer("abcdef");
        for (int i = 0; i < loop2; i++) {
            sbuf.append("abc");
            sbuf.append("def");
        }
        sbuf.toString();
    }
}

0 件のコメント:

コメントを投稿