2017年的谷歌I/O大会召开。本文主要介绍在这次I/O大会上关于V8引擎最新的一些东西。
性能优化的多方权衡
在最开始,介绍一些关于浏览器引擎优化的基本路线,看看对浏览器引擎优化一般从哪几个方面着手。V8虽然在对javascript优化上取得很大的进步,将js的速度相比与最初提升了数十倍,采取了诸如隐藏类加PICs的技术加速属性读取,JIT技术等,但仍然存在一些问题。下面是主要几个
- 一般来说,优化程度越好,产生机器代码的速度越快, 但会造成程序的初始化时间加长
- 高度优化技术会造成很高的内存占用
所以,在优化编译代码的时候需要在这几个方面进行权衡。下面这张图可以表示这中权衡过程。
我们在上面提到过,优化程度的好坏影响着机器代码产生的快慢,优化越好,自然代码运行的速度会更快,但是会造成更长的初始化延迟,因为所有这些优化,发生在加载页面后面,浏览器首次遇到js代码的时候。所以第一个权衡就是程序启动时候的延迟和它启动后能达到的最高性能。而第二个权衡就是在JIT中,若要采取越多的优化,那么同时会占用更多的内存。所以,引擎在执行某个函数的时候需要考虑要更快的启动还是更快的运行,更低的内存还是更好的优化。
下面我们先来看看不同情况下的权衡需求。
foo(2)
现在这里有个页面,里面只包含一个foo函数,并且不知道它实际做什么。我们会发现js解释器本身的执行速度会比带有优化的js compiler速度快很多(虽然潜意识里你会认为解释器要慢的多)。因为当compiler遇到这个函数的时候,会把它转换成原生代码并且经过多次优化处理,而这一切会发生在运行之前。所以当你只需执行一次foo函数的时候,权衡策略应该这样: