为啥 `var a = "..."` 比 `var a = new String("...")` 快?
Posted
技术标签:
【中文标题】为啥 `var a = "..."` 比 `var a = new String("...")` 快?【英文标题】: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 上对此进行了测试,结果始终相同。
【参考方案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 或任何其他引擎中情况并没有太大的不同。
【讨论】:
以上是关于为啥 `var a = "..."` 比 `var a = new String("...")` 快?的主要内容,如果未能解决你的问题,请参考以下文章