+运算符的性能比StringBuffer.append()差
在我的团队中,我们通常像这样进行字符串连接:
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包装器,以提高可读性。)但是,如果字符串较短,请不要打扰。