了解JavaScript性能差异

了解JavaScript性能差异,javascript,performance,Javascript,Performance,第二次执行: Time needed: 13654ms Time needed: 32192ms Time needed: 33167ms Time needed: 33587ms Time needed: 33630ms Time needed: 14004ms Time needed: 32965ms Time needed: 33705ms Time needed: 33923ms Time needed: 33727ms Time needed: 13124ms

第二次执行:

Time needed: 13654ms 
Time needed: 32192ms 
Time needed: 33167ms 
Time needed: 33587ms 
Time needed: 33630ms 
Time needed: 14004ms 
Time needed: 32965ms 
Time needed: 33705ms 
Time needed: 33923ms 
Time needed: 33727ms 
Time needed: 13124ms 
Time needed: 30706ms 
Time needed: 31555ms
Time needed: 32275ms
Time needed: 32752ms 
Time needed: 13786ms 
Time needed: 14402ms 
Time needed: 14261ms 
Time needed: 14355ms 
Time needed: 14444ms 
Time needed: 13778ms 
Time needed: 14293ms 
Time needed: 14236ms
Time needed: 14459ms 
Time needed: 14728ms 
Time needed: 13639ms 
Time needed: 14375ms 
Time needed: 13824ms 
Time needed: 14125ms 
Time needed: 14081ms
第三次执行:

Time needed: 13654ms 
Time needed: 32192ms 
Time needed: 33167ms 
Time needed: 33587ms 
Time needed: 33630ms 
Time needed: 14004ms 
Time needed: 32965ms 
Time needed: 33705ms 
Time needed: 33923ms 
Time needed: 33727ms 
Time needed: 13124ms 
Time needed: 30706ms 
Time needed: 31555ms
Time needed: 32275ms
Time needed: 32752ms 
Time needed: 13786ms 
Time needed: 14402ms 
Time needed: 14261ms 
Time needed: 14355ms 
Time needed: 14444ms 
Time needed: 13778ms 
Time needed: 14293ms 
Time needed: 14236ms
Time needed: 14459ms 
Time needed: 14728ms 
Time needed: 13639ms 
Time needed: 14375ms 
Time needed: 13824ms 
Time needed: 14125ms 
Time needed: 14081ms
从第一排跳到第二排的原因是什么

我的设置:

  • Ubuntu 13.10

  • Google Chrome 36.0.1985.125(Mozilla Firefox 30.0提供相同的结果)

编辑:

我修改了代码,使其在语义上保持不变,但内联了所有内容。有趣的是,它不仅大大加快了执行速度,而且在很大程度上消除了我上面描述的现象。不过,仍然可以看到轻微的跳跃

修改代码:

结果:

第一次执行:

Time needed: 13654ms 
Time needed: 32192ms 
Time needed: 33167ms 
Time needed: 33587ms 
Time needed: 33630ms 
Time needed: 14004ms 
Time needed: 32965ms 
Time needed: 33705ms 
Time needed: 33923ms 
Time needed: 33727ms 
Time needed: 13124ms 
Time needed: 30706ms 
Time needed: 31555ms
Time needed: 32275ms
Time needed: 32752ms 
Time needed: 13786ms 
Time needed: 14402ms 
Time needed: 14261ms 
Time needed: 14355ms 
Time needed: 14444ms 
Time needed: 13778ms 
Time needed: 14293ms 
Time needed: 14236ms
Time needed: 14459ms 
Time needed: 14728ms 
Time needed: 13639ms 
Time needed: 14375ms 
Time needed: 13824ms 
Time needed: 14125ms 
Time needed: 14081ms
第二次执行:

Time needed: 13654ms 
Time needed: 32192ms 
Time needed: 33167ms 
Time needed: 33587ms 
Time needed: 33630ms 
Time needed: 14004ms 
Time needed: 32965ms 
Time needed: 33705ms 
Time needed: 33923ms 
Time needed: 33727ms 
Time needed: 13124ms 
Time needed: 30706ms 
Time needed: 31555ms
Time needed: 32275ms
Time needed: 32752ms 
Time needed: 13786ms 
Time needed: 14402ms 
Time needed: 14261ms 
Time needed: 14355ms 
Time needed: 14444ms 
Time needed: 13778ms 
Time needed: 14293ms 
Time needed: 14236ms
Time needed: 14459ms 
Time needed: 14728ms 
Time needed: 13639ms 
Time needed: 14375ms 
Time needed: 13824ms 
Time needed: 14125ms 
Time needed: 14081ms
第三次执行:

Time needed: 13654ms 
Time needed: 32192ms 
Time needed: 33167ms 
Time needed: 33587ms 
Time needed: 33630ms 
Time needed: 14004ms 
Time needed: 32965ms 
Time needed: 33705ms 
Time needed: 33923ms 
Time needed: 33727ms 
Time needed: 13124ms 
Time needed: 30706ms 
Time needed: 31555ms
Time needed: 32275ms
Time needed: 32752ms 
Time needed: 13786ms 
Time needed: 14402ms 
Time needed: 14261ms 
Time needed: 14355ms 
Time needed: 14444ms 
Time needed: 13778ms 
Time needed: 14293ms 
Time needed: 14236ms
Time needed: 14459ms 
Time needed: 14728ms 
Time needed: 13639ms 
Time needed: 14375ms 
Time needed: 13824ms 
Time needed: 14125ms 
Time needed: 14081ms

Google Chrome似乎正在将您的脚本执行分解成块,并将处理时间分配给其他进程。直到每次函数调用的执行速度达到600毫秒左右时,才会注意到这一点。我使用较小的数据子集(如果我没记错的话,为300000000)进行了测试。

经过一点测试后,我想我已经指出了可能导致差异的原因。我想这一定和类型有关

var a=0
给了我一个统一的结果,总体性能更快,另一方面
var a=“0”
给了我与您相同的结果:第一个结果稍微快一些


我不知道为什么会发生这种情况。

以下只是一个伪答案,我希望社区可能会对此进行更新。最初,这是一个评论,但它变得太长,太快,因此需要作为一个答案张贴


有趣/发现 在中,我找不到与正在使用的
console.log的任何关联。在OSX Safari中测试时,我发现无论是否打印到控制台,问题都存在

我注意到的是一种模式。当我从初始值接近2147483648(2^31)时,出现了一个拐点。这很可能取决于用户的环境,但我发现一个拐点在2147485000左右(试试上面和下面的数字;2147430000..2147490000)。在这个数字附近的某个地方,计时变得更加统一

我真的希望是2^31[准确地说],因为这个数字在计算机术语中也很重要;它是
long
整数的上界。然而,我的测试得出的数字略高于这个数字(原因目前尚不清楚)。除了确保交换文件没有被使用,我没有做任何其他内存分析


从询问者处编辑:

在我的设置中,实际发生跳转的位置正好是2^31。我使用以下代码对其进行了测试:


此信息可能支持Derek的初始化观察

这只是一个想法,可能是一个延伸:
LLVM或其他东西可能正在执行一些预先优化。可能循环变量开始时是
int
,经过一两次之后,优化器会注意到该变量变为
long
。在尝试优化时,它会尝试将其设置为一个长前置,只是在这种情况下,它不是一个节省时间的优化,因为使用正则整数的性能比从int到long的转换成本更好


如果答案在文档中的某个地方,我不会感到惊讶:)

你脸书墙上的一个视频开始自动播放你电脑上的一个程序开始将数据发送回NSA总部/No!我再次运行它,它给了我类似的结果!我很高兴这需要3分钟来帮助您调试。请参阅安装程序的编辑。问题是,在使用相当少的迭代次数时,我没有遇到这种效果。如果您认为这没有什么区别,我相信您可以处理它来调整一个数字,这是减少计算时间所必需的;)@用户2820379-嗯,我没有考虑这个问题。不幸的是,我无法复制你的结果。使用
a=0
对我来说没有任何不同。@user2820379-我必须说有许多环境变量可能会改变结果。它确实对我的机器(Windows)有影响。好吧,这很有趣。别误会我的意思,很明显我并没有怀疑你在这件事上撒谎。我只是指出,在我的环境中,这并没有什么区别。你从哪里获取600毫秒?哎呀,忘了补充一点,我使用了更小的数据子集。你能报告一次迭代需要多长时间(即五个值中的一个)吗?/我这样问是因为我怀疑如果
console.log
对您的执行时间没有任何影响,那么可能浏览器没有执行死代码消除。我可以确认您的发现:在某些值之前,2147483648的执行时间是一致的,而且非常短。@user2820379和@vol7ron:调用函数(以迭代次数为参数)首先多次执行,例如3次
25000000
,然后两次执行
2500000000
,然后再次执行3次
25000000
,在
2500000000
之后,所有这些函数都会显著减速。但这实际上意味着JIT将函数拆分为多个部分。@user2820379(您应该命名),我没有说
console.log
在执行时间上没有任何区别。这不是这里要评估的。我说过它不会对循环迭代之间的差异产生影响。更清楚地说,当您运行测试5次时,您注意到第一次测试速度更快,而后面的4次测试都花费了几秒钟的时间(但彼此大致相同)
console.log
在它是否存在时没有区别;循环迭代之间存在差异(对我来说)。更有趣的是,当我使用的数字接近2^31时,我发现更多的测试更接近第一次迭代的d