【问题标题】:Why `var a = "..."` is faster than `var a = new String("...")`?为什么 `var a = "..."` 比 `var a = new String("...")` 快?
【发布时间】:2019-06-20 12:52:49
【问题描述】:

我正在尝试了解 Javascript 的工作原理。分析一些代码,我发现以“类型化”为导向的声明比非“类型化”的声明慢。当然,我知道 JS 不是类型化语言。

我在 Firefox、Chrome 和 Opera 上对此进行了测试,结果始终相同。

var repetitions = 10000000;

console.time("a");
for (var i=0; i<repetitions; i++) {
    var a = "...";
}
console.timeEnd("a");

console.time("b");
for (var i=0; i<repetitions; i++) {
    var b = new String("...");
}
console.timeEnd("b")

【问题讨论】:

  • 这取决于底层引擎实现,每个浏览器/平台可能不同。你试过什么平台?您是否将其与其他平台进行了比较?你能说这种现象普遍存在吗?
  • toSource 被标记为非标准。即使它显示了您所说的内容,也没有理由相信解析器正在为两者执行相同的步骤。使用 new 比分配文字有更多的开销。但是,不能保证在某些实现上会更快/更慢。我看不出详细讨论这个问题的好处。
  • 我在 Firefox、Chrome 和 Opera 上对此进行了测试,结果始终相同。

标签: javascript profiling


【解决方案1】:

特别是在 V8 中,如果您检查生成的字节码 (node --print-bytecode),您会得到如下信息:

> return "..."

LdaConstant [0]
Return 

> return new String("...")

LdaGlobal [0], [0]
Star r0
LdaConstant [1]
Star r1
Ldar r0
Construct r0, r1-r1, [2]
Return 

这基本上意味着字符串文字只是从常量池中加载指针,而new String 涉及更多步骤——加载全局String 对象,加载常量,调用通用Construct 方法。我猜在 FF 或任何其他引擎中情况并没有太大的不同。

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 2019-11-17
    • 1970-01-01
    • 2016-05-30
    • 2012-10-15
    • 2013-01-26
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多