【问题标题】:Is there a difference between concat(), "=" and "+="concat()、“=”和“+=”有区别吗
【发布时间】:2016-11-21 19:40:21
【问题描述】:

我想知道以下连接两个字符串str1='a'str2='b' 的语句在性能上是否存在差异

str1 = str1 + str2;

str1 += str2;

var res = str1.concat(str2);

我尝试了以下方法来衡量性能,但对于同一语句,从一次执行到另一次执行的输出似乎有很大差异。

var str1='a', str2='b';
var old_time=new Date();
for (var i=0; i<=1000000 ; i++){    
    str1=str1+str2;      // change this one with the other statements
}
var new_time=new Date();
console.log(new_time - old_time);

【问题讨论】:

标签: javascript performance concatenation


【解决方案1】:

根据MDN“强烈建议使用赋值运算符(+,+=)代替concat()方法。见performance test

【讨论】:

  • 我没有投票,但这是a link-only answer
  • IMO 无需多说,链接来自权威来源,清楚地回答了问题:(我想知道以下陈述之间的性能是否有任何差异 i>)。
【解决方案2】:

str1 += str2;

似乎比str1 = str1 + str2; 快一点,但由于字符串是不可变的,您不能重用来自str1 的旧引用。示例:

str0 = str1;   // duplicate reference
str1 += str2;

str0 lust 保持其旧值(在与str2 连接之前),因此在连接之后,str1 是一个新对象(与可变对象不同,其中就地连接可以更快,因为我们预计 s0 也会改变)

我还是更喜欢+= 语法,因为它更简洁,更容易掌握。

【讨论】:

  • VM 可以轻松合法地将x = x + y 优化为x += y,尤其是对于像大多数字符串这样的原语。由于字符串是不可变的(通常是写时复制,并且可能使用某种形式的绳索),所以关于临时对象的部分也具有误导性,并且通常会制作副本(或者,根据 VM,可能永远不会制作)。
  • @ssube 我认为过度并大量编辑了我的答案,因为我意识到它在 javascript 上下文中是多么不正确。
【解决方案3】:

这三种连接方法的区别在于concat 方法需要在String.prototype 处获取/查找(我猜String 是本地引用的,而不是在全局对象处获取/查找的) ,因此,“更慢”。

我不确定+== ... + ...,但+= 应该比= ... + ... 快,因为它是本机的。

【讨论】:

  • 不确定“应该”,++= 都是内置运算符。至少在旧版本的 IE 中,使用+= 连接字符串比使用赋值的+ 慢得多,所以我希望它依赖于实现。
  • @RobG 很奇怪!我所知道的更快,有时更慢。这个String#concat 在 cmets 的性能测试中,速度较慢,而且没有任何意义。 += 应该比 = 快,因为您不指定连接的旧值(这将被本机处理)。
猜你喜欢
  • 2013-11-10
  • 2017-11-18
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 2010-10-16
相关资源
最近更新 更多