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

Javascript 为什么parseInt()比Firefox中的*1慢得多?,javascript,performance,firefox,Javascript,Performance,Firefox,我有一个存储为字符串的值,我知道它总是一个整数。但我需要它作为一个数字,所以我在做n=n*1。然后我想“嗯,我应该使用parseInt()。然后我运行了一些jsperf测试,结果在Firefox中非常有趣: 总体而言,操作似乎非常相似,除了在Firefox中,使用*1的速度非常快。这是怎么回事 编辑 有人做了base 10测试,并对测试进行了全面更新。单击此测试也可以提供一些额外的反馈:我无论如何都不是JavaScript引擎专家,甚至不是编译器专家,但我非常确定,这归结为编译器可以告诉我们

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

总体而言,操作似乎非常相似,除了在Firefox中,使用
*1
的速度非常快。这是怎么回事


编辑


有人做了base 10测试,并对测试进行了全面更新。单击此测试也可以提供一些额外的反馈:

我无论如何都不是JavaScript引擎专家,甚至不是编译器专家,但我非常确定,这归结为编译器可以告诉我们:

var a = "123";
a = a * 1;
与以下内容完全相同:

var a = 123;
因为“a”是一个局部变量,并且从初始化到该
*1
表达式都是未使用的,所以根本没有必要生成代码来执行该操作。在这一点之后,编译器还可以判断出“a”无法转义“从功能上来说,做任何事情都没有意义;也就是说,
*1
测试的结果可能与您从中得到的结果相同:

function() {}

但是,在
parseInt()
情况下,编译器无法确定
parseInt()
是否真的是
parseInt()
,因为它可能已经被重新定义。因此,它必须生成代码来进行函数调用。

它必须是测试设置,因为它在Firefox中也给出了预期的结果。在您的设置中,我认为,
parseInt
在每个变量的每次迭代中都会应用(至少在FF中),而从
String
Number
的转换可能会在乘法测试的第一次迭代中应用,之后,变量是数值的,乘法不再需要转换

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


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

添加
,10
以强制基本10。(我现在没有Firefox)在Chrome和Firefox中,ParseInt对我来说都更快。@j08691:附议。也一样result@j08691真正地同样的测试?链接?它一定与测试本身有关。@
parseInt
outperfums all(FF 14.01)是的,我认为这可能是我的另一种解释。我不知道jsperf是如何设置测试代码的。看看这个版本的测试,似乎
*1
在Firefox中更好,而
parseInt()
在Chrome中胜出(总体来说是速度)。与Chrome相比,FF在优化
parseInt
测试方面的效率可能更低。有人测试过IE;~)吗?啊,是的,与firefox的原始测试(IE9)相同。