为什么 'var a = "..." ' 比 'var a = new String( "..." )' 更快?



我试图理解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")

特别是在 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或任何其他引擎的情况没有太大区别。

最新更新