谷歌中的V8引擎:Ignition和TurboFan;极大提高网页浏览器内部JavaScript执行的性能

  • Post author:
  • Post category:java




V8是被设计用来提高网页浏览器内部JavaScript执行的性能


v8引擎,v8引擎是一种js引擎的实现,JavaScript引擎是什么?

JavaScript引擎是执行JavaScript代码的程序或解释器。javaScript引擎可以实现为标准解释器或即时编译器,它以某种形式将JavaScript编译为字节码。

v8引擎,你还知道那些js引擎

V8 – 开源,由Google开发,用C ++编写

Rhin- 由Mozilla基金会开源,完全用Java开发

SpiderMonkey 第一个JavaScript引擎,Netscape Navigator,Firefox

JavaScriptCore 苹果公司为Safari开发

Chakra** (JScript9) Microsoft Edge

Chakra** (JavaScript) Microsoft IE9-IE11



V8是被设计用来提高网页浏览器内部JavaScript执行的性能,


那么如何提高性能呢?

为了提高性能,v8会把js代码转换为高效的机器码,而不在是依赖于解释器去执行。v8引入了

JIT在运行时把js代码进行转换为机器码。这里的主要区别在于V8不生成字节码或任何中间代码。

v8曾经有两个编译器(v5.9之前)

full-codegen — 一个简单且速度非常快的编译器,可以生成简单且相对较慢的机器码

Crankshaft —  一个更复杂的(Just-In-Time)优化编译器,生成高度优化的代码

v8充分多进程,主进程负责获取代码,编译生成机器码,有专门负责优化的进程,,还有一个监控进程负责分析那些代码执行比较慢,以遍Crankshaft 做优化,最后还有一个就是GC进程,负责内存垃圾回收。


新的管道是由解释器(Ignition)和编译器(TurboFan)组成


Ignition

设计之初是为了减少移动设备的内存占用。以前通过Full-codegen基准编译器生成的代码几乎要占用Chrome浏览器三分之一的堆内存。这样为应用的实际数据留下的内存空间就很少。当在限制RAM的Android设备上启用Chrome M53的Ignition时,未优化的基准Javascript代码在ARM64的移动设备上的内存占用下降了九倍。


TurboFan

在2013发起初只是为了弥补Crankshaft仅仅可以优化Javascript一部分语言的短板。例如,它并没有通过结构化的异常处理来设计代码,即代码块不能通过try、catch、finally等关键字划分。另外由于为每一个新的特性Crankshaft都将要做九套不同的框架代码适应不同的平台,因此在适配新的Javascript语言特性也很困难。


TurboFan

在起初设计的时不仅是为了适配ES5标准的特性,同时也是为了优化ES2015及以后的规范的新语言特性。在TurboFan通过清楚区分高质量和低质量优化编译的分层编译器,实现在不修改架构代码的情况下优化新的语言特性。同时由于在TurboFan增加明确的指令选择编译阶段,可以为每个支持的平台编写少得多的体系结构代码。在这个新的阶段中,体系结构代码只需要编写一次,而且很少需要更改。这些变化为V8提供了更容易维护和可扩展的特性。

与此同时Ignition和TurboFan也减少了V8整体的内存占用。在M59版的Chrome浏览器中,新的管道技术可以为桌面端和移动端减少5-10%不等的内存占用。Ignition内存占用的减少最总导致V8整体内存占用的优化。

V8引擎的牛逼效果:

1、JS 解析快了 2 倍

2、async 执行快了 11 倍

3、平均减少了 20% 的内存使用



版权声明:本文为chenkeyu1997原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。