【问题标题】:GWT string concatenation operator + vs. stringbufferGWT 字符串连接运算符 + 与 stringbuffer
【发布时间】:2011-04-21 18:07:19
【问题描述】:

我必须为 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

【问题讨论】:

  • 这不是一个问题 :) 一般来说,连接更昂贵,因为String 是不可变的。 Java 每次都必须创建一个新的String 对象。
  • 你是否在不同的浏览器上检查过这个?托管版本和部署版本之间的区别是什么?
  • 请将您的帖子表述为问题,并将答案写在下方。

标签: performance string gwt concatenation


【解决方案1】:

下面是stan229的问题和蜥蜴比尔的要求。

这确实很有趣,性能因浏览器而异。对我来说,问题是“选择哪种连接方法”,我得到了我想要的答案。但这里有更多的测试结果:

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,但我认为情况相似在那里。
【解决方案2】:

您可以查看 gwt 源代码,了解如何模拟 StringBuffer/StringBuilder。 GWT 为浏览器选择了最佳的字符串连接方式。

GWT 2.2.0 StringBuffer source

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

【讨论】:

  • 我明白你的意思,但我的测试显示使用普通 + 连接时性能更好。所以,我自己会毫无疑问地使用它,就像我以前一样。当然,在客户端和服务器都使用的共享代码中,我将使用 StringBuffer。通常我需要生成 HTML 代码,而且 + 更好(可读性和性能)。
猜你喜欢
  • 2016-07-19
  • 2010-09-08
  • 2011-06-06
  • 2017-02-04
  • 2010-09-09
  • 2014-02-27
  • 2013-03-10
  • 2015-08-28
  • 1970-01-01
相关资源
最近更新 更多