GWT字符串连接运算符+与StringBuffer的比较

7

我需要为GWT应用程序选择一种高效的字符串拼接方式。因此,我进行了一项小型测试,认为这对其他人也会有所帮助。

令人惊讶的是,差异非常小:对于1000000个连接,大约只有100毫秒。因此,请从代码阅读角度选择适当的拼接方式。

我的测试很简单:

// + operator
private void str() {
    Date start = new Date();

    String out = "";
    for(int a=0;a<1000000;a++) {
        out += "item" + a;
    }

    Date end = new Date();

    MessageBar.error("str:" + (end.getTime() - start.getTime()));
}

// StringBuffer implementation
private void sb() {
    Date start = new Date();

    StringBuffer out = new StringBuffer();
    for(int a=0;a<1000000;a++) {
        out.append("item" + a);
    }

    Date end = new Date();

    MessageBar.error("sb:" + (end.getTime() - start.getTime()));
}

结果如下:

str:1612
str:1788
str:1579
sb:1765
sb:1818
sb:1839

1
一般来说,字符串拼接更加耗费资源,因为 String 是不可变的。每次 Java 都需要创建一个新的 String 对象。 - Vivin Paliath
2
你有在不同的浏览器上测试过吗?还有托管和部署版本之间的区别吗? - stan229
1
请将您的帖子以问题形式表达,并在下面放置答案。 - Bill the Lizard
2个回答

8

在回答stan229的问题和Bill the Lizard的请求之后,我们来探讨一下浏览器性能差异的有趣现象。对我而言,这个问题是“应该选择哪种字符串拼接方法”,我也得到了我想要的答案。但是我们还有更多的测试结果:

chrome 10.0.648.204:
str: 748
sb : 849

firefox 3.6.16:
str: 1681
sb : 1861

ie 8:
str: 2484
sb : 4094

opera 11.10
str: 802
sb : 792

所以,我得到的答案是:+ 运算符提供更好的性能 我的下一个问题是:什么可以提供更好的性能:
int i=0;
// this
String result = String.valueOf(i);
// or this
String result = i + "";

我会在测试后发布这篇文章,或者如果你已经有答案的话,请直接回复


你测试的浏览器之间的差异很小,由于有一点点的开销,StringBuffer甚至可能会稍微劣势。但对于旧版IE浏览器来说,差异是巨大的,有利于StringBuffer。我的IE 6测试结果是:“str: 90266 sb: 1203”(请注意,我将循环次数减少到50000,因为在我的上网本上进行1000000次循环需要相当长的时间)。不确定IE 7的情况,但我认为那里的情况是类似的。 - Chris Lercher

0
你可以查看GWT源代码,了解如何模拟StringBuffer/StringBuilder。 GWT会选择最佳的性能方式来进行字符串连接,以适应不同的浏览器。 GWT 2.2.0 StringBuffer source

使用多个追加操作快速创建字符串的方法。这是通过使用一个被延迟绑定选择的StringBufferImpl实现的。大多数方法都会给出预期的性能结果...


我明白你的意思,但我的测试表明,在使用普通的字符串连接时性能更好。因此,我自己会毫不犹豫地继续使用它,就像以前一样。在用于客户端和服务器的共享代码中,我会使用StringBuffer,当然。经常需要生成HTML代码,在这种情况下使用 "+" 连接符更好(既可读性又高性能)。 - user431529

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接