到了 2017 年,Firefox 有速度問題,而且大家都知道。Chrome 進入瀏覽器市場時,讀到了 Mozilla 也看到的同一個硬體趨勢,然後加以利用:多核心 CPU 讓 Chrome 能把分頁拆成獨立行程,因此忙碌的背景分頁不會阻擋前景分頁。Firefox 較舊的程式碼庫讓同樣的粗粒度架構難以快速實現,使用者因此紛紛出走。

顯而易見的修法各有上限。壓榨既有的單執行緒 C++ 引擎無法利用閒置核心。複製 Chrome 的每分頁一程序設計只在同時開啟多個頁面時有幫助,因為載入一個新頁面的工作仍跑在單一核心上。而從頭重寫整個瀏覽器是多年的賭注,過程中還會弄壞產品。

Mozilla 的答案是先在獨立實驗室資助激進架構。它創造了 Rust——一種沒有資料競爭的語言——以及 Servo——一個建立在細粒度平行化之上的研究瀏覽器引擎,證明平行渲染更快且錯誤更少。接著 Quantum 把 Servo 元件逐一移植進 Firefox:CSS 引擎 Stylo 以工作竊取把樣式計算平行化到每個核心,換取線性加速;合成器移入自己的行程;Quantum DOM 為主要執行緒任務排定優先順序;Quantum Flow 突擊小組則追查緩慢社群動態等案例。

這種逐元件推進的路徑意味著 Firefox 在每次替換之間仍能運作,而且每個移植都帶來可量測的效益;Firefox 57 是第一個 Quantum 版本,於 2017 年 11 月 14 日推出,而多行程瀏覽自 2017 年中起已是所有使用者的預設。人們注意到 Firefox 又變快了,發布當天的評論描述使用者從 Chrome 回流,發布消息也在 Hacker News 引發 2,180 分的討論。

在研究專案中驗證激進引擎,然後把其無資料競爭的元件逐一移植進正式產品

Rust 消除了資料競爭這類錯誤,使細粒度共享記憶體平行化實用到足以讓瀏覽器押注其上。

Servo 在整合前就驗證了每個元件的架構,因此每次 Quantum 移植進 Gecko 都是經過測試的研究成果移植,而非在正式產品內做實驗。

逐一替換子系統避開了重寫懸崖:瀏覽器持續發布,而每個部分——例如樣式計算把耗時除以核心數——都帶來可量測的增益。

以使用情境為焦點的 Quantum Flow 突擊小組修好了使用者真正感受到的變慢,隨後成為由 CI 測試、遙測與回歸追蹤支撐的常態工作流程。

當競爭對手擁有你需要的架構時,不要重寫整個產品:另行打造並驗證新架構,然後逐步替換子系統,讓每次替換都帶來可量測的增益

Firefox Quantum(版本 57)於 2017 年 11 月 14 日推出;發布說明在 Hacker News 獲得 2,180 分與 687 則留言,文章留言也描述原本轉往 Chrome 的使用者回流。Mozilla 表示,GPU 渲染元件 WebRender 將在 2018 年內推出,並由 Advanced Layers 過渡填補空缺,而突擊小組流程正成為常態工具與追蹤機制,讓回歸能被自動捕捉。此版本也終止對舊式 XUL 附加元件的支援,部分留言者表示這使他們失去了所依賴的擴充功能。

追溯依據

參考來源

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