V8引擎去优化小实验 | Web高能短文系列

321 阅读2分钟

老师上课时说方法里调用conole.log,V8会发生去优化,但我查阅了好多相关文章和写了demo,都没有发现console.log和去优化有联系。
这让我很困惑,于是和老师小讨论了下,老师回忆了下,发现自己记忆出现了偏差:

上课的时候有一处问题。catch try会影响v8的性能。
当然console.log也会影响,但是是在其输出对象的时候,其输出的对象可能导致内存无法释放。

于是我接着前面写的demo,测试了下catch try是否会发生去优化,但结果是否定的,接着我再次打开一篇关于去优化的翻译文章,《V8性能优化杀手》 ,大家可以先不用阅读这篇文章,我这边先列举这篇文章的摘要。

文章中列举了一些发生去优化的情况: eval debugger with Generator函数(V8 5.7 已优化) for of(V8 commit11e1e20 已优化) try catch(V8 5.3 已优化) let const(V8 5.6 已优化) __proto__ get set
就是说,作者在2017年07月03日翻译前还有eval debugger with __proto__ get set会发生去优化。
文章用的测试代码如下:
测试代码传送门,必须阅读下这段代码,与下文关联紧密。

然而再我尝试运行这段代码时,发现GetOptimizationStatus(fn)的返回值根本不会是1,2...7,后来google到了stackoverflow的回答,原来是因为这个方法更新了,返回值发生了变化。
然后我把《优化杀手》提到的去优化情况都测了一遍。 总结下测试结果:

关键词都不会直接发生去优化,如果不使用OptimizeFunctionOnNextCall方法来使得方法优化,而是用大循环重复运行一个方法,同样方法会被V8自动优化,原因可参考这张图:

文章最后另一位老师终于抛出了自己的收藏:

https://v8.dev/docs/turbofan 这里有好多相关的文章
去优化可以看这个 
https://docs.google.com/presentation/d/
1Z6oCocRASCfTqGq1GCo1jbULDGS-w-nzxkbVF7Up0u0

v8 5.9 重写了很多代码,Ignition + TurboFan,Google
这个团队应该很喜欢车,引擎叫 V8 也就算了,优化还是涡轮增压。