是 + 运算符的性能不如 StringBuffer.append()

IT技术 javascript string concatenation
2021-01-30 06:10:10

在我的团队中,我们通常像这样进行字符串连接:

var url = // some dynamically generated URL
var sb = new StringBuffer();
sb.append("<a href='").append(url).append("'>click here</a>");

显然,以下内容更具可读性:

var url = // some dynamically generated URL
var sb = "<a href='" + url + "'>click here</a>";

但是 JS 专家声称该+运算符的性能不如StringBuffer.append(). 这是真的吗?

6个回答

您的示例不是一个好示例,因为性能不太可能有显着差异。在您的示例中,可读性应该胜过性能,因为一个与另一个的性能提升可以忽略不计。数组 (StringBuffer) 的好处仅在您进行许多连接时才显现出来。即使这样,您的里程也可能非常取决于您的浏览器。

这是一个详细的性能分析,显示了在许多不同浏览器中使用所有不同 JavaScript 连接方法的性能;字符串性能分析

join() 一次, concat() 一次, join() for, += for, concat() for

更多:
Ajaxian >> IE 中的字符串性能:Array.join vs += 续

“首先是 IE7 的性能改进,我们在进行大规模字符串操作时不再需要考虑使用备用路径;在迭代情况下使用 Array.join 比在相同情况下使用 += 没有什么大的优势。此外,与 IE6 的差异很小,让您不必为那个特定版本而烦恼。”
2021-03-15 06:10:10
@Chris,这不是真的。比较IE7 中的这两个小提琴jsfiddle.net/9uS4n/5(快)与jsfiddle.net/9uS4n/2(慢)。使用该join()技术,性能似乎至少提高了 1000 倍
2021-03-17 06:10:10
很好的解释。另请查看: iliadraznin.com/2012/03/...
2021-03-20 06:10:10
关于图表,以防它不明显;越低越好。
2021-03-27 06:10:10

Internet Explorer 是当今世界上唯一真正受此影响的浏览器。(版本 5、6 和 7 比较慢。8 没有表现出同样的退化。)此外,IE 变得越来越慢,字符串越长。

如果您有长字符串要连接,那么一定要使用 array.join 技术。(或者一些围绕这个的 StringBuffer 包装器,为了可读性。)但是如果你的字符串很短,不要打扰。

是的,这是真的,但你不应该在意。选择更容易阅读的那个。如果您必须对您的应用程序进行基准测试,那么请关注瓶颈。

我猜字符串连接不会成为你的瓶颈。

同意迈克尔·哈伦的观点

如果性能确实是一个问题,还要考虑使用数组和连接。

var buffer = ["<a href='", url, "'>click here</a>"];
buffer.push("More stuff");
alert(buffer.join(""));
我最近也在这样做,类似于 .NET StringBuilder 的代码风格,var sb = []; sb.push("第一节"); sb.push("第 2 节"); 返回 sb.join('');
2021-03-19 06:10:10
我知道已经选择了正确答案,但是这个答案有一个更有用的例子。
2021-03-26 06:10:10
这个 jsPerf jsperf.com/join-concat/2提到:stackoverflow.com/questions/16696632/...似乎表明它+=更快。
2021-03-30 06:10:10
@KirkWoll:将来可能想使用jsPerf,以便我们可以轻松比较结果。
2021-04-09 06:10:10
哇,只是哇。比较IE7 中的这两个小提琴jsfiddle.net/9uS4n/5(快)与jsfiddle.net/9uS4n/2(慢)。使用这种技术,性能似乎至少提高了 1000 倍。
2021-04-13 06:10:10

试试这个:

var s = ["<a href='", url, "'>click here</a>"].join("");
喜欢这种字符串连接方法。
2021-03-15 06:10:10
好吧,您在答案中链接到的帖子专门试图反驳我的答案所建议的 Array.join 的“神话”。所以也许不是。我只是发布了我在实践中看到的更快的内容。
2021-03-16 06:10:10