小编典典

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

all

我们必须一直为日志输出等构建字符串。在 JDK
版本中,我们了解了何时使用StringBuffer(许多附加,线程安全)和StringBuilder(许多附加,非线程安全)。

使用上有什么建议String.format()?它是有效的,还是我们被迫坚持对性能很重要的单行代码进行串联?

例如丑陋的旧风格,

String s = "What do you get if you multiply " + varSix + " by " + varNine + "?";

与整洁的新样式(String.format,可能更慢)相比,

String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine);

注意:我的具体用例是贯穿我的代码的数百个“单行”日志字符串。它们不涉及循环,所以StringBuilder太重了。我String.format()特别感兴趣。


阅读 58

收藏
2022-05-31

共1个答案

小编典典

我写了一个小类来测试两者的性能更好,并且 + 领先于格式。乘以 5 到 6 倍。自己尝试一下

import java.io.*;
import java.util.Date;

public class StringTest{

    public static void main( String[] args ){
    int i = 0;
    long prev_time = System.currentTimeMillis();
    long time;

    for( i = 0; i< 100000; i++){
        String s = "Blah" + i + "Blah";
    }
    time = System.currentTimeMillis() - prev_time;

    System.out.println("Time after for loop " + time);

    prev_time = System.currentTimeMillis();
    for( i = 0; i<100000; i++){
        String s = String.format("Blah %d Blah", i);
    }
    time = System.currentTimeMillis() - prev_time;
    System.out.println("Time after for loop " + time);

    }
}

对不同的 N 运行上述代码表明两者的行为都是线性的,但String.format速度要慢 5-30 倍。

原因是在当前的实现中,String.format首先用正则表达式解析输入,然后再填充参数。另一方面,与 plus 的连接由 javac(而不是
JIT)优化并StringBuilder.append直接使用。

运行时比较

2022-05-31