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

问题:

我们必须一直建立字符串来记录输出等等。在JDK版本中,我们已经学会了何时使用StringBuffer(许多追加,线程安全)和StringBuilder(许多追加,非线程安全)。
使用String.format()有什么建议?是否有效率,或者我们被迫坚持使用连接性能重要的单线程?
例如丑陋的旧风格,

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

与整洁的新风格(可能很慢),

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); } } [/code] 对于不同的N运行上面的表示两者都是线性的,但是String.format的速度是5-30倍。
原因是在当前的实现中String.format首先用正则表达式解析输入,然后填写参数。另一方面,与连接的连接由javac(而不是由JIT)进行优化,并直接使用StringBuilder.append
 Runtime comparison

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Should I use Java’s String.format() if performance is important?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

51 − 47 =