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