我有一个存储为字符串的值,我知道它总是一个整数。但我需要它作为一个数字,所以我在做n = n * 1
。然后我想“嗯,我应该只使用parseInt()
。然后我运行了一些jsperf测试,Firefox中的结果很有趣:
总体而言,看起来操作非常相似,除了在Firefox中,使用*1
非常快。这是怎么回事?
修改
有人做了基础10测试,并整体更新了测试。点击此处也可以提供一些额外的反馈:http://jsperf.com/parseintx1/2
答案 0 :(得分:2)
我不是一个JavaScript引擎专家,甚至不是编译器专家,但我很确定它归结为编译器可以告诉你的事实:
var a = "123";
a = a * 1;
与以下内容完全相同:
var a = 123;
因为" a"是一个局部变量,从初始化到* 1
表达式时未使用,根本没有生成代码来执行操作。在那之后,编译器也可以告诉他们没有办法" a"可以"逃避"从功能,所以任何真的没有意义;也就是说,* 1
测试最终可能会得到与您所得到的相同的东西:
function() {}
然而,在parseInt()
的情况下,编译器无法确定parseInt()
是否真的parseInt()
,因为它可能已被重新定义。因此,它必须生成代码以进行函数调用。
答案 1 :(得分:2)
它必须是测试设置,因为this version也会在Firefox中提供预期的结果。我认为,在您的设置中,事情是parseInt
在每次迭代中应用{好,至少在FF中}到每个变量,而从String
到Number
的转换可能是在乘法测试中应用了第一次迭代,之后变量是数字,乘法不再需要转换。
在版本7中,变量在测试设置中分配,测试在每次迭代时分配新变量。现在两个测试都有“相同的变化”,parseInt
优于乘法测试。
在IE [8,9]中检查测试后看到它的结果看起来像FF的结果我认为Chrome结果有一个解释:我很确定Chrome / Webkit在第一个版本中有更好的优化测试(尤其是parseInt
部分),这为parseInt
提供了更好的结果。它可能是V8引擎中代码(部分)的预编译,在这些浏览器中使用。