前端程序員應知應會之JavaScript基準測試套件
本文來自公眾號活在信息時代。
對于前端程序員來說,V8引擎無疑是最為熟悉的工具之一了。V8是Google開源的JavaScript和WebAssembly引擎,用C++編寫。它用于Chrome和Node.js等。V8可以獨立運行,也可以嵌入到任何C++應用程序中。
為了測試V8作為JavaScript引擎的性能,Google隨后也開發了一套V8基準測試套件,在運行時,V8基準套件會載入一些特定的JavaScript代碼,從而測試引擎的內核、加密、解密、渲染等速度。而該套件也就成為了JavaScript引擎性能的標準。
在該套件的第七個版本中,一共包括了八項基準測試,最終得分為這八項測試得分的幾何平均數。得分越高表明速度越快。這八項測試的具體內容如下:
一、Richards基準
操作系統內核的模擬基準, 最早出現于Matin Richards開發的BCPL中(539 行)。
主要關注點:屬性加載/存儲、函數/方法調用
次要關注點:代碼優化、消除冗余代碼
二、DeltaBlue基準
單向約束求解,最早出現于 John Maloney 和 Mario Wolczko開發的Smalltalk中 (880 行)。
主要關注點:多態
次要關注點:OO 樣式編程
三、Crypto基準
Tom Wu開發的以代碼為基礎的加密解密基準(1698 行)。
主要關注點:位運算
四、RayTrace基準
Adam Burmister開發的以代碼為基礎的光線追蹤基準 (904 行)。
主要關注點:參數對象,應用
次要關注點:原型庫對象,創建模式
五、EarleyBoyer基準
經典Scheme 基準, 由Florian Loitsch的Scheme2Js編譯器翻譯為JavaScript (4684 行)。
主要關注點:快速創建、銷毀對象
次要關注點:閉包, 參數對象
六、RegExp基準
正則表達式基準,從50多個最流行的網頁中提取正則表達式操作所產生的(1761 行)。
關注點:正則表達式
七、Splay基準
數據操作基準,處理伸展樹和執行自動內存管理子系統 (394 行)。
主要關注點:快速創建、銷毀對象
八、NavierStokes基準
根據奧利弗·亨特的代碼,在2D上解決navierstokes方程,重操縱雙精度數組。(387 行).
主要關注點:讀取和寫入數字數組。
次要關注點:浮點數學運算。
V8基準測試在早期的JavaScript引擎開發過程中應用廣泛,很多JS引擎都使用該基準測試用于評測其性能。常用的JS引擎測試結果如下:
盡管V8基準測試套件非常經典,但是隨著技術的發展,Google又推出了新的基準測試套件Octane 1.0和2.0,陸續增加了下列九項測試基準:
pdf.js:在JavaScript中實現了Mozilla的PDF閱讀器。它可以測量解碼和解釋的時間(33,056行)。
主要關注點:數組和類型化數組操作。
次要關注點:數學運算和位運算,以及對未來語言功能(例如 promise)的支持
SplayLatency:Splay 測試側重于虛擬機的垃圾回收子系統。SplayLatency 對現有 Splay 代碼進行頻繁測量檢查點插樁。檢查點之間長時間暫停表示 GC 延遲時間較長。此測試衡量延遲暫停的頻率,將它們分類為分桶,并根據低分懲罰頻繁的長暫停。
主要關注點:垃圾回收延遲
Mandreel:運行3D Bullet物理引擎,該引擎通過Mandreel將C++移植到JavaScript (277377行)。
主要關注點:模擬
MandreelLatency:與SplayLatency 測試類似,此測試通過頻繁的時間測量點對 Mandreel 基準進行插樁。由于 Mandreel 對虛擬機編譯器施加壓力,因此該測試會提供編譯器引入的延遲指示。在測量點之間長時間暫停會降低最終得分。
主要關注點:編譯器延遲時間
GB Emulator:全部采用JavaScript模擬便攜式控制臺的架構,以及運行所需的3D模擬(11,097行)。
主要關注點:模擬
Code loading:測量Javascript引擎在加載了一段大型的Javascript程序后開始解碼的速度有多快,一個常見的實例為Social Widget。該測試的源代碼來自開源代碼庫(Closure, jQuery)(1,530行)。
主要關注內容:JavaScript 解析和編譯
Box2DWeb:基于流行的2D物理引擎Box2DWeb,最初由Erin Catto編寫,現被移植到JavaScript。(560行,9000+ 精簡版)
主要關注點:浮點數學運算。
次要關注點:包含 Double 的屬性、訪問器屬性。
Zlib:從 Mozilla Emscripten 套件執行的 zlib asm.js/Emscripten 測試(在工作負載 1 中運行)。代碼包含在 eval() 中,它保證我們測量的運行時間包括在所有瀏覽器上解析和編譯(2,585 行)。
主要關注點:代碼編譯和執行
Typescript:Microsoft&Type 39 TypeScript 編譯器是一款復雜的應用。此測試用于衡量 TypeScript 編譯本身所需的時間,它代表虛擬機在處理復雜、可調整大小的 JavaScript 應用(25918 行)方面的表現。
主要關注點:運行復雜、繁重的應用
除此之外,常用的JavaScript基準測試工具還有Mozilla發布的Kraken、蘋果的JetStream、以及Speedometer和Speed-Battle等。