如果性能很重要,是否应该使用Java的String.format()?
我们必须一直构建String以便进行日志输出等等。在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()
特别感兴趣。
回答:
我编写了一个小类进行测试,该类具有两者的更好性能,并且+领先于格式。以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直接使用。
以上是 如果性能很重要,是否应该使用Java的String.format()? 的全部内容, 来源链接: utcz.com/qa/418848.html