为什么 var a = "..." 比 var a = new String("...") 快?
Why `var a = "..."` is faster than `var a = new String("...")`?
我正在尝试了解 Javascript 的工作原理。分析一些代码,我发现面向 "typed" 的声明比非 "typed" 的声明慢。我当然知道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 或任何其他引擎中情况并没有太大不同。
我正在尝试了解 Javascript 的工作原理。分析一些代码,我发现面向 "typed" 的声明比非 "typed" 的声明慢。我当然知道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 或任何其他引擎中情况并没有太大不同。