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

2022-06-15 00:00:00 performance browser javascript v8

我一直在解决这个问题,发现了一些有趣的行为。基本上,如果我连续多次对相同的代码进行基准测试,代码的执行速度会显著加快。

代码如下:

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

以下是Chrome的截图:

有人知道发生了什么事吗?

我正在检查性能:

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

解决方案

Chrome V8优化编译器最初编译代码时不进行优化。如果您的代码的某个部分经常被执行(例如函数或循环体),V8会用优化的版本(即所谓的堆栈上替换)替换它。

根据https://wingolog.org/archives/2011/06/08/what-does-v8-do-with-that-loop:

V8始终将JavaScript编译为本机代码。V8第一次看到 一段代码,它快速地编译它,但不优化它。这个 初始的未优化代码是完全通用的,可以处理所有不同的 人们可能会看到的案例,还包括一些类型反馈代码, 记录在中的各个点上看到的类型 程序。

启动时,V8派生一个分析线程。如果它注意到一个 特定的未优化程序很热,它收集记录的类型 该过程的反馈数据,并使用它来编译优化的 程序的版本。然后替换未优化的旧代码 使用新的优化代码,该过程将继续

其他现代JS引擎也以类似的方式识别并优化这些热点。

相关文章