+运算符的性能比StringBuffer.append()差

时间:2020-03-06 14:30:56  来源:igfitidea点击:

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

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()差。这是真的吗?

解决方案

是的,这是真的,但我们不必在意。选择一个更容易阅读的语言。如果我们必须对应用进行基准测试,请关注瓶颈。

我猜想字符串串联不会成为瓶颈。

试试这个:

var s = ["<a href='", url, "'>click here</a>"].join("");

JavaScript没有原生的StringBuffer对象,因此我假设这来自我们正在使用的库或者不寻常的宿主环境(即不是浏览器)的功能。

我怀疑一个库(用JS编写)会更快地产生任何东西,尽管原生StringBuffer对象可能会。可以使用探查器找到明确的答案(如果我们正在浏览器中运行,则Firebug将为我们提供Firefox中JS引擎的探查器)。

用克努斯的话来说,"过早的优化是万恶之源!"无论哪种方式的小偏差最终都不会产生太大影响。我会选择可读性更强的一种。

是的,根据通常的基准。例如:http://mckoss.com/jscript/SpeedTrial.htm。

但是对于小的字符串,这是无关紧要的。我们将只关心非常大的字符串上的演奏。而且,在大多数JS脚本中,瓶颈操作很少出现在字符串操作上,因为它不够用。

我们最好注意DOM操作。

示例不是一个很好的示例,因为性能不太可能出现显着差异。在示例中,可读性应胜过性能,因为其中一个性能对另一个性能的提高可忽略不计。数组(StringBuffer)的好处只有在我们进行许多合并时才显而易见。即使那样,行驶里程也可能很大程度上取决于浏览器。

这是一份详细的性能分析,显示了在许多不同浏览器中使用所有不同JavaScript串联方法的性能。弦乐性能分析

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

与迈克尔·哈伦(Michael Haren)达成协议。

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

var buffer = ["<a href='", url, "'>click here</a>"];
buffer.push("More stuff");
alert(buffer.join(""));

据我所知,每个串联都意味着内存重新分配。因此,问题不在于操作员曾经这样做,解决方案是减少级联数。例如,如果可以,请在迭代结构之外进行串联。

就像一些用户已经注意到的那样:这与小字符串无关。

Firefox,Safari或者Google Chrome中的新JavaScript引擎也进行了优化

"<a href='" + url + "'>click here</a>";

快如

["<a href='", url, "'>click here</a>"].join("");

Internet Explorer是当今世界上唯一遭受此困扰的浏览器。 (版本5、6和7的速度变慢。8不会出现相同的降级。)此外,字符串越长,IE越慢。

如果我们要连接的字符串很长,则一定要使用array.join技术。 (或者,一些StringBuffer包装器,以提高可读性。)但是,如果字符串较短,请不要打扰。