为什么JavaScript代码随着时间的推移会执行得更快?

3

我有一个问题一直在研究,发现了一些有趣的行为。基本上,如果我连续多次对同一段代码进行基准测试,那么代码执行速度会显著提高。

以下是代码:

http://codepen.io/kirkouimet/pen/xOXLPv?editors=0010

这是来自Chrome的屏幕截图:

enter image description here

有人知道发生了什么吗?

我正在使用以下方式检查性能:

var benchmarkStartTimeInMilliseconds = performance.now();
...
var benchmarkEndTimeInMilliseconds = performance.now() - benchmarkStartTimeInMilliseconds;

具体来说,每个浏览器在第三次迭代后似乎会看到执行速度的跳跃。 - DJG
谷歌的“即时”编译/优化。 - Pointy
就像美酒一样...随着时间的推移变得越来越好(至少应该是这样) - charlietfl
1个回答

4
Chrome的V8优化编译器最初以不进行优化的方式编译您的代码。如果您的某个代码部分被频繁执行(例如函数或循环体),V8将用一个经过优化的版本替换它(称为“on-stack replacement”)。
根据https://wingolog.org/archives/2011/06/08/what-does-v8-do-with-that-loop:
V8总是将JavaScript编译成本机代码。第一次看到代码时,V8会快速编译但不进行优化。初始未优化的代码是完全通用的,处理所有可能出现的各种情况,并包括一些类型反馈代码,记录在过程的各个点上所看到的类型。
在启动时,V8会产生一个分析线程。如果它注意到一个特定的未经优化的过程非常活跃,它将收集该过程的记录的类型反馈数据,并使用它来编译一个经过优化的版本的过程。然后将旧的未优化代码替换为新的优化代码,该过程继续进行。
其他现代JS引擎也会识别这些热点并以类似的方式进行优化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接