到2017年,Firefox的速度问题已众所周知。Chrome进入浏览器市场时,已经预见了Mozilla看到的硬件趋势,并加以利用:多核CPU让Chrome可以将标签页拆分为独立进程,这样后台繁忙的标签页就不会阻塞前台。Firefox较旧的代码库难以实现同样的粗粒度架构,因此用户纷纷弃用。

明显的修修补补都有瓶颈。在现有单线程C++引擎上压榨性能无法利用空闲核心。照搬Chrome的每标签页独立进程设计,只有在同时打开多个页面时才有效,因为加载一个新页面的工作仍然运行在单个核心上。从头重写整个浏览器则是多年的赌注,且会在过程中毁掉产品。

Mozilla的答案是在独立的实验室中先资助构建激进的新架构。它创造了Rust,一种没有数据竞争的语言,以及Servo,一个基于细粒度并行的研究型浏览器引擎,证明了并行渲染在减少bug的同时能提速。随后,Quantum将Servo组件逐个移植到Firefox中:CSS引擎Stylo将样式计算并行化到每个核心,并通过任务窃取实现线性加速;合成器移至独立进程;Quantum DOM优化主线程任务;量子流突击队则专项解决像社交信息流变慢这样的使用场景问题。

逐组件移植路径确保Firefox在交换期间始终可用,并且每个移植都带来了可衡量的性能提升。Firefox 57(Quantum首个版本)于2017年11月14日发布,而多进程浏览从2017年年中起已成为所有用户的默认选项。用户重新注意到Firefox变快了,发布当天的评论描述用户从Chrome切换回来,公告在Hacker News上获得了2180次讨论。

在研究项目中验证激进的新型引擎,然后将其无数据竞争的组件逐个移植到正式产品中

Rust消除了数据竞争这类bug,这让细粒度共享内存并行足够实用,值得用来赌一个浏览器。

Servo在集成之前验证了每个组件的架构,因此每次Quantum到Gecko的移植都是经过测试的研究成果,而非在正式产品中做实验。

逐个替换子系统避免了重写的悬崖:浏览器持续发布,每个组件(例如样式计算按核心数分割时间)都带来了可观的性能提升。

以用例为中心的Quantum Flow突击队解决了用户真正感受到的卡顿,后来成为辅以持续集成测试、遥测和回归追踪的常态化流程。

当竞争对手拥有你需要的架构时,不要重写整个产品:先单独构建并验证新架构,然后逐步替换子系统,使每次替换都能带来可衡量的收益

Firefox Quantum(版本57)于2017年11月14日发布;发布说明在Hacker News上获得了2180点评分和687条评论,文章评论中有人表示从Chrome回归。Mozilla表示,GPU渲染组件WebRender将在2018年上线,期间使用高级图层作为过渡;突击队的流程正在转变为常规工具和追踪,以便自动发现回归。该版本还停止支持旧式XUL附加组件,一些评论者称这使他们失去了依赖的扩展。

从这里,追溯依据

参考来源

  1. Entering the Quantum Era — How Firefox got fast again and where it's going to get faster hacks.mozilla.org
  2. Hacker News discussion: Entering the Quantum Era — How Firefox got fast again news.ycombinator.com