Javascript是如何工作的:V8引擎的内核Ignition和TurboFan

文章翻译自V8团队系列博客中Launching Ignition and TurboFan

今天我怀着无比激动的心情宣布V8执行Javascript的管道5.9版将会与Chrome的M59同步。最新版的执行管道将会为Javascript带来显著的性能和内存占用的优化。关于更多性能优化数据我们会在文末有大量的论述,首先让我们认识下Ignition和TurboFan。


Ignition.png

TurboFan.png

新的管道是由解释器(Ignition)和编译器(TurboFan)组成。这些技术对于在这些年一直专注V8博客的开发者并不感到陌生,但是在V8的技术演变过程中却有着里程碑的意义。

Ignition和TurboFan第一次用来执行Javascript是从V8 5.9开始的。这也意味着自2010后一直服务V8引擎的Full-codegen和Crankshaft将不在使用。它们不能满足Javascript每年推陈出新变化趋势和优化这些新特性的需求。我们也将计划将它们完全从V8技术体系中清除,V8引擎将会朝着越来越简单、易控制方向发展。

漫长的旅途

V8引擎团队在优化真实生产环境下Javascript的性能和评估Full-codegen、Crankshaft的优劣做了大量细致的工作。融合Ignition和TurboFan的开发工作已经进行了三年半,这将是我们在未来继续优化执行Javascript性能的基础。

TurboFan在2013发起初只是为了弥补Crankshaft仅仅可以优化Javascript一部分语言的短板。例如,它并没有通过结构化的异常处理来设计代码,即代码块不能通过try、catch、finally等关键字划分。另外由于为每一个新的特性Crankshaft都将要做九套不同的框架代码适应不同的平台,因此在适配新的Javascript语言特性也很困难。还有Crankshaft框架代码的设计也限制优化机器码的扩展。尽管V8引擎团队为每一套芯片架构维护超过一万行代码,Crankshaft也不过为Javascript挤出一点点性能。

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

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

后来V8团队利用Ignition和TurboFan合作生成并优化的机器码而不是像Crankshaft重复编译源代码,来提高V8性能。Ignition的字节码为V8引擎提供了一种更简洁、更少错误的基准执行模型,大大简化V8的自适应优化的去优化机制这一关键特性。最终,由于产生字节码的速度要远远快于产生Full-codegen的基准编译代码,激活Ignition通常可以改善代码的启动速度和网页的加载速度。

从整体架构上Ignition与TurboFan在一起配合工作有许多的好处。例如,不需要在手工编写高效的程序集处理Ignition生成的字节码,而是使用TurboFan中间件来处理,并让TurboFan为V8所支持的平台进行优化和生成最终的执行代码。

运行表现

抛开历史,让我们看看真实生产环境下新管道技术的表现。

V8团队过去一直在使用Telemetry-Catapult作为测试性能的框架。在上一篇文章中我们已经讨论关于通过真实生产环境的测试数据驱动性能优化的重要性和如何使用WebPageReplay与Telemetry结合采集测试。

Reduction in time spent in V8 for user interaction benchmarks.png

虽然Speedometer是一个综合标准,我们之前也没发现其它综合测试标准可以比它更准确描述现代Javascript在真实环境中性能。在管道技术切换到Ignition和TurboFan后,Speedometer的综合指标在不同的平台略微有些差异,但是整体上提高了5-10%。


benchmarkscores.Improvements on Web and Node.js benchmarks .png

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

这些性能上的改善都只是开始,Ignition和TurboFan组成的新的管道技术为执行Javascript的性能优化普平了道路,V8的内存无论在Chrome还是在Node.js都将会大幅降低。我们期待与你分享这些改进。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容