今日(2013/1/8)稍早釋出的 Firefox 18 中搭載了 IonMonkey,我們最新的 JavaScript JIT 編譯器。它的效能跟架構都大幅進步,對一個為期一年且高度專注的專案來說,我們帶著超級興奮的心情看著它終於順利誕生!
先前的 SpiderMonkey 已經是個有點年紀的JIT編譯器了,一路走來,我們一直缺少一個重要的元件,一個通常在其他典型的編譯器,例如 Java 或 C++ 上都能看到的元件。我們舊的 TraceMonkey* 跟稍微新一點的 JägerMonkey,都是以直接轉譯的方式將 JavaScript 轉成機器碼,一路到底,沒有中間的步驟,因此編譯器無法後退一步,對編譯的結果進行分析,來進行最佳化。
IonMonkey 提供全新的架構,讓我們達到這個目的,它有三個步驟:
- 把 JavaScript 轉譯成 IR(中介碼,intermediate representation)。
- 用各種演算法對 IR 作最佳化。
- 再把 IR 轉譯成機器碼。
除了效能跟可維護性讓我們興奮,這也讓未來對 JavaScript 編譯器的研究更加容易。現在只要隨時寫個最佳化演算法,置入 Pipeline 中,馬上就可以看到結果如何!
效能測試
那究竟 IonMonkey 增加了多少效能指標呢?IonMonkey 以長時間執行的應用程式為主要目標(執行極短時間的應用程式將會切回 JägerMonkey 處理),我在執行 Windows 7 Pro 的 Mac Pro 上進行了 Kraken 以及 Google V8 測試。
在 Kraken 測試上,Firefox 17 為 2602ms、Firefox 18 為 1921ms,大約增進了 26% 的效能。在以下圖表中轉換成每分鐘執行次數,越高表示效能越好:
在 Google V8 測試上,Firefox 15 得到 8474 分、Firefox 17 得到 9511 分、Firefox 18 得到 10118 分,約比 Firefox 17 快了 7%,比 Firefox 15 快了 20%。
前面還有漫漫長路:未來幾個月,隨著新的帥氣架構到位,我們將繼續調整它,看看在其他指標跟市面中的應用程式上的執行狀況如何。
團隊
對我們來說 IonMonkey 最酷的地方就是:它是個極度群策群力的結晶!2011 年 6 月我們擬了個稍具細節的計畫,並推估約需一年的時間來完成。我們從 Andrew Drake、 Ryan Pearl、 Andy Scheff 與 Hannes Verschore 四位實習生開始,他們各自負責實作出 IonMonkey 架構中的關鍵元件,他們所撰寫的程式碼片段仍然留存在最後的程式庫中!
2011 年 8 月底我們逐漸組成全職團隊,包含 Jan de Mooij、Nicolas Pierron、Marty Rosenberg、Sean Stangl、Kannan Vijayan 跟我(David Anderson)自己(喔!忘了補上 SpiderMonkey 的成員 Chris Leary 以及 2012 年的夏季實習生 Eric Faus)。在過去一年中,我們專注在持續開發 IonMonkey、建構整個架構、確保設計跟程式品質上達到我們能達到的最佳水準,同時持續提昇 JavaScript 效能。
當大家有共同目標,一同讓這個案子成功,實在是一件非常有成就感的事!我由衷感謝每位參與其中的同伴!
技術
接下來在 JavaScript Blog 中,我們將陸續介紹 IonMonkey 的主要元件及其運作原理,我將會特別強調目前 IonMonkey 中使用的最佳化技術:
- Loop-Invariant Code Motion (LICM),用來盡可能將程序移出迴圈外。
- Sparse Global Value Numbering (GVN),一個強大的冗餘程式移除器。
- Linear Scan Register Allocation (LSRA),在 HotSpot JVM 與近來的 LLVM 中使用的一種暫存器配置(register allocation)演算法。
- Dead Code Elimination (DCE),用來移除執行不到的程序。
- Range Analysis,減少邊界檢查(bounds checks)。
其中特別要提的是,IonMonkey 已經在我們所有的一級平台上運作(譯註:一級平台包含 Android Linux/ARMv7 與 ARMv6 (gcc)、Linux/x86 與 x86-64 (gcc)、OS X/x86 與 x86-64 (clang)、 Windows/x86 (msvc),各級平台詳見此)。IonMonkey 編譯器的抽象架構,僅需要最低程度的程式移植就能在不同 CPU 上運作。這代表著 IonMonkey 編譯器大部分的程式可以直接於 x86、x86-64、以及 ARM(大部分的手機及平板所使用)上執行。大部分情況下,只有核心的組譯器介面界面得是不同的。因為大部分 CPU 的程式集都不同,ARM 又跟 x86 完全不一樣,所以我們特別驕傲能夠有這樣的成果!
何時與何地?
IonMonkey 在 Firefox 18 桌面版與 Android 版上都已經預設啟用。
* 備註:TraceMonkey 的確擁有中介層,只是它非常侷限。最佳化必須即時執行,且資料結構無法應付編譯之後的最佳化(after-the-fact optimizations)。
原文 / IonMonkey in Firefox 18 | JavaScript
授權 / 創用 CC 姓名標示-相同方式分享-3.0
φ Robert Wang 翻譯 - petercpg、Irvin 編輯