为什么parseInt()比Firefox中的* 1慢得多?

时间:2012-08-28 16:50:57

标签: javascript performance firefox

我有一个存储为字符串的值,我知道它总是一个整数。但我需要它作为一个数字,所以我在做n = n * 1。然后我想“嗯,我应该只使用parseInt()。然后我运行了一些jsperf测试,Firefox中的结果很有趣:

http://jsperf.com/parseintx1

总体而言,看起来操作非常相似,除了在Firefox中,使用*1非常快。这是怎么回事?


修改

有人做了基础10测试,并整体更新了测试。点击此处也可以提供一些额外的反馈:http://jsperf.com/parseintx1/2

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中}到每个变量,而从StringNumber的转换可能是在乘法测试中应用了第一次迭代,之后变量是数字,乘法不再需要转换。

在版本7中,变量在测试设置中分配,测试在每次迭代时分配新变量。现在两个测试都有“相同的变化”,parseInt优于乘法测试。

在IE [8,9]中检查测试后看到它的结果看起来像FF的结果我认为Chrome结果有一个解释:我很确定Chrome / Webkit在第一个版本中有更好的优化测试(尤其是parseInt部分),这为parseInt提供了更好的结果。它可能是V8引擎中代码(部分)的预编译,在这些浏览器中使用。

相关问题