为什么`var a =“ ...”`比`var a = new String(“ ...”)`要快?

时间:2019-06-20 12:52:49

标签: javascript profiling

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

1 个答案:

答案 0 :(得分: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对象,加载常量,调用泛型{{1 }} 方法。我想在FF或任何其他引擎中情况没有太大不同。