写点什么

苹果用 LLVM JIT 提升 WebKit JS 引擎的速度

  • 2014 年 5 月 21 日
  • 本文字数:1299 字

    阅读完需:约 4 分钟

通过将 JavaScript 转换成 LLVM IR 代码并在随后对其进行重量级优化,苹果将 Safari JavaScript 引擎 Nitro 的速度提升了 35%。

根据 webkit.org 上的一篇博文,对内部的 JavaScript 字节码,WebKit 以前有三个级别的优化,每个级别都是在运行时使用,依据是要在优化代码段所需的时间和这样做的好处之间取得平衡:

  • LLInt (Low Level Interpreter)——这是一个字节码解释器而不是编译器,它在优化方面做的工作很少。每个函数调用都会通过 LLInt 处理,如果它包含一个被调用超过了 100 次的语句,或者函数本身被调用超过 6 次,那么它会被传递到下个优化级别,即 Baseline JIT。
  • Baseline JIT ——这是一个简单的 JIT,创建的代码执行速度比 LLInt 快,但它不包含重量级优化。同样,如果发现一个语句执行超过 1000 次,或者一个函数被调用超过 66 次,那么编译会传递到下一个优化级别,即 DFG JIT。借助“栈上替换(On-Stack Replacement,OSR)”,可以在运行一条语句后切换编译器。
  • DFG JIT (Data Flow Graph JIT)——直到现在,该编译器负责 Safari 的性能,但只用于需要更多 CPU 的代码段,因为代码优化需要时间。

为了进一步提升 Nitro 的性能,苹果决定将 LLVM 引入优化链。 Chris Lattner 是 LLVM 编译器基础架构的原作者和负责人,他为苹果工作,领导着开发工具部门,苹果此举可能是由他推动的。这个第四层名为 FTL JIT(Forth Tier LLVM),它是一个 C++ 模块,最终使用 LLVM 进行低级别优化。为此,一个函数的字节码通过两个中间阶段转换成 LLVM IR——“连续传递风格(Continuation-Passing Style)”(CPS)和“静态单一赋值(Static Single Assignment)”(SSA)——旨在将原先的动态代码转换优化成静态代码,并随后使用 LLVM 编译器进行处理。这是 LLVM 第一次用于一门动态语言的剖析制导编译,该做法需要在 LLVM 中进行若干深层次的修改,据 Filip Pizlo 说

将 LLVM JIT 基础架构用于一门动态语言的剖析制导编译,WebKit FTL JIT 是第一个这样做的重点项目。为此,我们需要在 WebKit 和 LLVM 中做若干重大修改。与我们现有的 JIT 相比,LLVM 编译代码所需的时间明显更多。WebKit 使用了一个复杂的分代垃圾收集器,但 LLVM 并不支持侵入式垃圾收集算法。性能剖析驱动的编译意味着我们可能在函数运行时调用一个优化编译器,而且我们可能在一个循环的中间将函数的执行转换到经过优化的代码;据我们了解,FTL 是第一个为将“热循环(hot-loop)”转换到经 LLVM 编译的代码做栈上替换的编译器。最后,LLVM 先前不支持自修改代码和反优化技巧,而我们依赖它们处理动态代码。

苹果做这方面的工作已有一年,他们取得了什么成果呢?据 Pizlo 说,Safari 在 Richards 基准测试中比 DFG 快 38%,在若干 asm.js 基准测试中平均快 35%。与 Chrome 或者 Firefox 上的 Octane 基准测试相比如何,尚有待观察。Pizlo 补充说“有关 FTL 的工作才刚刚开始——我们仍然需要扩大 FTL 能够编译的 JavaScript 操作集,它还有性能潜力可挖。”

FTL JIT 刚刚提交到 WebKit 主干,变更集编号为 167958 ,读者可以使用 WebKit 每日构建版对其进行测试。

查看英文原文:**** Apple Speeds Up WebKit’s JS Engine with LLVM JIT

2014 年 5 月 21 日 21:185597
用户头像

发布了 256 篇内容, 共 71.2 次阅读, 收获喜欢 7 次。

关注

评论

发布
暂无评论
发现更多内容

Apache Pulsar 社区周报:09-26 ~ 10-09

Apache Pulsar

大数据 开源 云原生 Apache Pulsar 消息中间件

一周信创舆情观察(9.28~10.11)

统小信uos

怎么才算掌握了JDK中的线程池

AI乔治

Java 编程 架构 jdk 线程池

打通IO栈:一次编译服务器性能优化实战

AI乔治

Java 编程 架构 io 高性能

Netty源码解析 -- 客户端启动过程

binecy

Netty nio 源码阅读

代表Java未来的ZGC深度剖析,牛逼!

AI乔治

Java 架构 ZGC JVM GC调优

阿里大牛精心整理了46张PPT,教你弄懂JVM、GC算法和性能调优

Java架构之路

Java 程序员 面试 编程语言 JVM

如何花“一点点小钱”突破华为云CCE服务的“防线”

华为云开发者社区

容器 k8s

图解面试题-二叉树的所有路径

9527

Java 面试 算法 LeetCode 二叉树

架构师训练营第四周命题作业

一马行千里

极客大学架构师训练营 命题作业

为什么学习总是停在开头两页?

Nydia

重大事故!IO问题引发线上20台机器同时崩溃

AI乔治

Java 架构 多线程 io 并发

Flink周期性水位线分配器-6-3

小知识点

scala 大数据 flink

ClickHouse最佳实战之分布表写入流程分析

京东科技开发者

数据库

程序员上班打工的认识误区

陆陆通通

程序员 打工

年轻代频繁ParNew GC,导致http服务rt飙高

AI乔治

Java 学习 架构 JVM GC

谋生的工作动机,永远是个打工者

陆陆通通

Java 程序员

让超宽带抵达产业互联网:UBBF上演智能联接全面落地

脑极体

程序员黄金年龄25-28岁,我们30+的人该去哪儿?附华为案例;

Java架构师迁哥

芯片破壁者(十七):“硅谷市长”罗伯特•诺伊斯开启的产业法则

脑极体

一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程

AI乔治

Java 编程 架构 JVM GC

架构师训练营第 1 期第四周课后练习题

Leo乐

极客大学架构师训练营

系统架构--作业

Nick~毓

架构师训练营第四周学习笔记

一马行千里

学习 极客大学架构师训练营

Pulsar 社区周报|09-19 ~ 09-25

Apache Pulsar

大数据 开源 Apache Pulsar 消息中间件

异步excel导出组件设计和实现

Wayne Chu

Java 微服务 EasyExcel SpringCloud 服务治理

Java-技术专题-JDK8-HashMap的实现原理

浩宇天尚

一次百万长连接压测 Nginx OOM 的问题排查分析

AI乔治

Java nginx 架构 服务端 高性能

如何优雅的搞垮服务器,再优雅的救活

MySQL从删库到跑路

Linux 升级glibc 启动异常 无法进入系统 抢救模式

架构师训练营第四周作业

脸不大

12张图带你彻底理解分布式事务产生的场景和解决方案!!

冰河

分布式事务 2PC 可靠消息最终一致 TCC 最大努力通知

苹果用LLVM JIT提升WebKit JS引擎的速度-InfoQ