性能:Java的String.format

caa*_*os0 16 java performance string-concatenation

可能重复:
如果性能很重要,我应该使用Java的String.format()吗?

我想知道String.format在Java应用程序中使用是否很好而不是StringBuilder......所以,我只是编写一个简单的测试,如下所示:

public static void main(String[] args) {
        int i = 0;
        Long start = System.currentTimeMillis();
        while (i < 10000) {
            String s = String.format("test %d", i);
            i++;
        }
        System.out.println(System.currentTimeMillis() - start);
        i = 0;
        start = System.currentTimeMillis();
        while (i < 10000) {
            String s = new StringBuilder().append("test ").append(i).toString();
            i++;
        }
        System.out.println(System.currentTimeMillis() - start);
    }
Run Code Online (Sandbox Code Playgroud)

结果在哪里:

238
15
Run Code Online (Sandbox Code Playgroud)

所以,如果我的测试有效,StringBuilder则速度快于String.format.好.现在,我开始思考如何String.format运作.这是一个简单的字符串连接"test " + i吗?

StringBuilder连接和String.format?之间的区别是什么?有没有像简单String.format快速的方式StringBuilder

Tom*_*icz 38

我写了一个快速卡尺基准来比较String.format()StringBuilder,StringBuffer正常String +运营String.replace()String.concat()方法:

public class StringFormatBenchmark extends SimpleBenchmark {

    public void timeStringFormat(int reps) {
        while (--reps >= 0) {
            String s = String.format("test %d", reps);
        }
    }

    public void timeStringBuilder(int reps) {
        while (--reps >= 0) {
            String s = new StringBuilder("test ").append(reps).toString();
        }
    }

    public void timeStringBuffer(int reps) {
        while (--reps >= 0) {
            String s = new StringBuffer("test ").append(reps).toString();
        }
    }

    public void timeStringPlusOperator(int reps) {
        while (--reps >= 0) {
            String s = "test " + reps;
        }
    }

    public void timeReplace(int reps) {
        while (--reps >= 0) {
            String s = "test {}".replace("{}", String.valueOf(reps));
        }
    }

    public void timeStringConcat(int reps) {
        while (--reps >= 0) {
            String s = "test ".concat(String.valueOf(reps));
        }
    }

    public static void main(String[] args) {
        new Runner().run(StringFormatBenchmark.class.getName());
    }

}
Run Code Online (Sandbox Code Playgroud)

结果如下(Java 1.6.0_26-b03,Ubuntu,32位):

caliper2

显然String.format()要慢得多(按一个数量级).也StringBufferStringBuilder(正如我们所教导的)慢得多.最后StringBuilder,String +运算符几乎相同,因为它们编译为非常相似的字节码.String.concat()有点慢.

String.replace()如果简单连接就足够了,也不要使用.

  • 非常重要的是不要从你创建的图片中得出草率的结论!你的测试测量**一个**字符串操作的时间!(循环仅用于测试精度.)如果在循环中构建字符串,`StringBuffer`和`StringBuilder`比`+`运算符快**.示例结果:`+`运算符可能需要一分多钟才能构建一个500000个字符的字符串,其中`StringBu {ffer,ilder}`在不到50ms的时间内构建完全相同的字符串! (2认同)