这让我很困惑,于是和老师小讨论了下,老师回忆了下,发现自己记忆出现了偏差:
上课的时候有一处问题。catch try会影响v8的性能。
当然console.log也会影响,但是是在其输出对象的时候,其输出的对象可能导致内存无法释放。
复制代码
于是我接着前面写的demo,测试了下catch try是否会发生去优化,但结果是否定的,接着我再次打开一篇关于去优化的翻译文章,《V8性能优化杀手》 ,大家可以先不用阅读这篇文章,我这边先列举这篇文章的摘要。
文章中列举了一些发生去优化的情况: eval
debugger
with
(V8 5.7 已优化) Generator函数
(V8 commit11e1e20 已优化) for of
(V8 5.3 已优化) try catch
(V8 5.6 已优化) let const
__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 也就算了,优化还是涡轮增压。
复制代码