Is it better to reuse a StringBuilder in a loop?

前端 未结 14 2062
名媛妹妹
名媛妹妹 2020-12-04 06:46

I\'ve a performance related question regarding use of StringBuilder. In a very long loop I\'m manipulating a StringBuilder and passing it to another method like

14条回答
  •  春和景丽
    2020-12-04 07:24

    The second one is about 25% faster in my mini-benchmark.

    public class ScratchPad {
    
        static String a;
    
        public static void main( String[] args ) throws Exception {
            long time = System.currentTimeMillis();
            for( int i = 0; i < 10000000; i++ ) {
                StringBuilder sb = new StringBuilder();
                sb.append( "someString" );
                sb.append( "someString2"+i );
                sb.append( "someStrin4g"+i );
                sb.append( "someStr5ing"+i );
                sb.append( "someSt7ring"+i );
                a = sb.toString();
            }
            System.out.println( System.currentTimeMillis()-time );
            time = System.currentTimeMillis();
            StringBuilder sb = new StringBuilder();
            for( int i = 0; i < 10000000; i++ ) {
                sb.delete( 0, sb.length() );
                sb.append( "someString" );
                sb.append( "someString2"+i );
                sb.append( "someStrin4g"+i );
                sb.append( "someStr5ing"+i );
                sb.append( "someSt7ring"+i );
                a = sb.toString();
            }
            System.out.println( System.currentTimeMillis()-time );
        }
    }
    

    Results:

    25265
    17969
    

    Note that this is with JRE 1.6.0_07.


    Based on Jon Skeet's ideas in the edit, here's version 2. Same results though.

    public class ScratchPad {
    
        static String a;
    
        public static void main( String[] args ) throws Exception {
            long time = System.currentTimeMillis();
            StringBuilder sb = new StringBuilder();
            for( int i = 0; i < 10000000; i++ ) {
                sb.delete( 0, sb.length() );
                sb.append( "someString" );
                sb.append( "someString2" );
                sb.append( "someStrin4g" );
                sb.append( "someStr5ing" );
                sb.append( "someSt7ring" );
                a = sb.toString();
            }
            System.out.println( System.currentTimeMillis()-time );
            time = System.currentTimeMillis();
            for( int i = 0; i < 10000000; i++ ) {
                StringBuilder sb2 = new StringBuilder();
                sb2.append( "someString" );
                sb2.append( "someString2" );
                sb2.append( "someStrin4g" );
                sb2.append( "someStr5ing" );
                sb2.append( "someSt7ring" );
                a = sb2.toString();
            }
            System.out.println( System.currentTimeMillis()-time );
        }
    }
    

    Results:

    5016
    7516
    

提交回复
热议问题