java - 在循环中重用 StringBuilder 会更好吗?

标签 java performance string stringbuilder

我有一个关于使用 StringBuilder 的性能相关问题。 在一个很长的循环中,我正在操作 StringBuilder 并将其传递给另一个方法,如下所示:

for (loop condition) {
    StringBuilder sb = new StringBuilder();
    sb.append("some string");
    . . .
    sb.append(anotherString);
    . . .
    passToMethod(sb.toString());
}

在每个循环周期实例化 StringBuilder 是一个好的解决方案吗?像下面这样调用删除更好吗?

StringBuilder sb = new StringBuilder();
for (loop condition) {
    sb.delete(0, sb.length);
    sb.append("some string");
    . . .
    sb.append(anotherString);
    . . .
    passToMethod(sb.toString());
}

最佳答案

在我的迷你基准测试中,第二个大约快 25%。

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 );
    }
}

结果:

25265
17969

请注意,这适用于 JRE 1.6.0_07。


根据 Jon Skeet 在编辑中的想法,这里是第 2 版。但结果相同。

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 );
    }
}

结果:

5016
7516

关于java - 在循环中重用 StringBuilder 会更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/242438/

相关文章:

java - 为什么我在这个 Java 动态 Web 项目中看不到任何 main 方法?

java - 如何使依赖注入(inject)对组件起作用

c# - 理解有漏洞的应用程序的 Performance Profiler 输出?

基于 php 的 MySQL 数据的全文搜索?

c# - 在这种情况下,String.Format 或 String.Replace 哪个更快?

java - HQL java.lang.NumberFormatException : For input string

java - 除 IMEI 或 IMSI 之外的手机唯一标识符?

javascript - 为什么 javascript 处理结构数组比处理数组结构更快?

c++ - 与部分阵列作斗争

c++ - 使用来自 lldb : take 2 的字符串参数调用函数