發(fā)布于2012年的Octane,是V8的基準(zhǔn)測試引擎,其主要用于驗證和優(yōu)化V8引擎執(zhí)行速度。但是由于Octane的測試結(jié)果和實際網(wǎng)頁測試有所偏差,V8將不再使用Octane作為基準(zhǔn)測試引擎。
Octane的起源
JavaScript基準(zhǔn)測試引擎是一段不斷進化的歷史。隨著網(wǎng)頁從原始靜態(tài)頁面到現(xiàn)在富客戶端應(yīng)用,都需要基準(zhǔn)測試引擎能夠與時俱進。SunSpider是其中比較早的基準(zhǔn)測試引擎,它為快速優(yōu)化JavaScript提供了基礎(chǔ)。但是,隨著虛擬機開發(fā)者意識到微基準(zhǔn)測試的局限性,基準(zhǔn)測試引擎隨之更新,針對SunSpider的短板進行優(yōu)化,同時瀏覽器社區(qū)也將SunSpider從推薦基準(zhǔn)測試引擎中剔除。
Octane基準(zhǔn)測試套件最早發(fā)布于2012年,旨在減輕早期微基準(zhǔn)測試引擎的一些缺陷。它源于V8的早期簡單測試用例,最終成為通用網(wǎng)頁性能的基準(zhǔn)測試。Octane包含17個不同的測試集,以覆蓋各種不同的工作場景。Octane的內(nèi)容代表它創(chuàng)建時度量JavaScript性能的主流方式。
收益遞減和過度優(yōu)化
在Octane最初發(fā)布的幾年中,它為JavaScript虛擬機生態(tài)提供了獨特的價值。它使得JavaScript引擎(包括V8),能夠在峰值壓力下優(yōu)化執(zhí)行性能。這些CPU敏感型工作場景,是JavaScript虛擬機最初實現(xiàn)時的弱項。Octane幫助引擎開發(fā)者針對計算密集型應(yīng)用程序進行調(diào)優(yōu),執(zhí)行速度的提升也促使JavaScript成為C++語言和Java語言之外的另一種選擇。另外,Octane也幫助提高了垃圾回收的性能,規(guī)避瀏覽器過長時間等待或意外卡頓。
然而到了2015年,大部分JavaScript引擎都針對Octane進行編譯器優(yōu)化,以獲取更高基準(zhǔn)測試得分。一些優(yōu)化使得Octane基準(zhǔn)測試分?jǐn)?shù)大大提升,但是針對真實網(wǎng)頁卻幾乎沒有什么效果。深入研究執(zhí)行Octane基準(zhǔn)測試和加載普通網(wǎng)站(如Facebook、Twitter等)發(fā)現(xiàn),基準(zhǔn)測試運行時沒有執(zhí)行V8的源碼解析或者瀏覽器的加載流程,而真實網(wǎng)頁會必須要執(zhí)行。此外,Octane中的JavaScript不符合目前大部分主流框架和庫文件使用的語法和格式(更不用說經(jīng)過轉(zhuǎn)換的代碼或者最新的ES2015+語言特性)。這意味著使用Octane來度量V8性能的時候,并沒有針對現(xiàn)代網(wǎng)頁框架相關(guān)的用例,例如這些框架的加載速度度量,新狀態(tài)管理模式的對比度量,亦或是ES2015+特性和ES5等效代碼執(zhí)行速度對比等。
不僅如此,還出現(xiàn)了一些在真實場景下沒有任何幫助,甚至起到反作用的優(yōu)化。例如根據(jù)Octane基準(zhǔn)測試得分,建議將JavaScript代碼聚合和內(nèi)聯(lián),以減少函數(shù)調(diào)用成本。但是聚合策略僅僅是為Octane基準(zhǔn)測試評分打造的,在現(xiàn)實場景下會導(dǎo)致編譯成本上升和更多的內(nèi)存開銷。一些場景的性能優(yōu)化對真實網(wǎng)頁所有幫助,但為了實現(xiàn)這些性能提升,必須要求開發(fā)者按照特定方式編碼,而在通用場景下卻沒有什么效果。一些面向Octane的優(yōu)化對類似Ember等現(xiàn)代框架還可能導(dǎo)致性能下降。instanceof操作符就是一個很好的例子,它的優(yōu)化方案局限在Octane特定的情況,而沒有針對Node.js應(yīng)用程序進行回歸測試。
另外一個問題是,隨著時間的推移,一些Octane本身的小bug會大大影響優(yōu)化結(jié)果。例如在Octane中的Box2DWeb基準(zhǔn)測試?yán)昧耸褂?lt;和>=操作符比較對象的bug,使得性能提升大約15%。而在這項優(yōu)化在真實網(wǎng)頁中沒有效果,還會使得針對一般類型的比較變得更加復(fù)雜。其他JavaScript虛擬機開發(fā)者還發(fā)現(xiàn),一些針對Octane的優(yōu)化在真實網(wǎng)頁場景下會起到反效果:例如懶解析技術(shù)能夠幫助大部分真實網(wǎng)頁提高加載速度,并增加無效代碼的發(fā)現(xiàn)率,但是該技術(shù)在Octane基準(zhǔn)測試中卻處于不利位置。
Octane和其他合成基準(zhǔn)測試引擎之后
前面列舉了幾個可以提高Octane分?jǐn)?shù),但是對運行真實網(wǎng)頁有害的優(yōu)化。不幸的是,這類問題在其他靜態(tài)或者合成基準(zhǔn)測試引擎(例如Kraken、JetStream)同樣存在。簡單地說,類似這些基準(zhǔn)測試引擎無法有效的度量真實網(wǎng)頁運行速度,并且可能讓JavaScript虛擬機開發(fā)者針對一些特定場景做過度優(yōu)化,最終導(dǎo)致通用場景下的性能下降。也正是在這種沖突下,V8團隊決定不再使用Octane基準(zhǔn)測試引擎。
Octane讓JavaScript生態(tài)圈針對計算密集型進行了大量優(yōu)化。接下來應(yīng)該在提升真實網(wǎng)頁速度上開疆?dāng)U土了,包括現(xiàn)代JavaScript庫和框架、ES2015+語言特性、新狀態(tài)管理模式、不可變對象分配和模塊化打包等方面。由于V8使用才許多不同場景,包括服務(wù)端的Node.js,因此還需要加上針對服務(wù)端應(yīng)用(例如AcmeAir)的性能度量。
目前V8引擎已經(jīng)開始是使用真實數(shù)據(jù)進行性能度量,也期待V8團隊能為用戶和開發(fā)者提供更好的性能體驗。