兩種JavaScript解析引擎性能對比談
隨著Google Chrome的發(fā)布,Web應(yīng)該說是老樹發(fā)新芽,在技術(shù)本身并沒有突破的情況下,每一個環(huán)節(jié)都在以更快的速度進行前進,譬如:
◆JavaScript。現(xiàn)在每一個瀏覽器都在比較誰的執(zhí)行速度更快,在你追我趕的過程中,毫無疑問,Web變得更加快速,應(yīng)用的能力也有越來越強大了。IE6、FF2的時代在現(xiàn)在回顧起來,已經(jīng)變成老牛拉車的"歷史"了。
◆Web標準化的速度也越來越快,CSS、HTML 5的普及越來越加速,手機也從WAP快速的向Web標準看齊。原來更多的Web開發(fā)向IE傾斜的趨勢,現(xiàn)在更多的向標準化傾斜。
◆與Flash的爭斗,尤其是apple的旗幟鮮明的不支持Flash,特別是在已經(jīng)開始預(yù)售的iPad上摒棄了Flash,促使HTML 5的職能從傳統(tǒng)的文字圖片迅猛的向2D、動畫、視頻等領(lǐng)域擴展,將對Flash這樣的私有技術(shù)構(gòu)成威脅。(51CTO編者注:近日Adobe高管曾回應(yīng)說,“HTML 5要想追上Flash,還要一段不短的時間;而且,也有可能永遠追不上”)
所有的這些,都意味著Web正在朝著第2春進行努力。本文則試圖收集一下目前各主流瀏覽器的JavaScript加速機制,嘗試探討未來JavaScript能走多遠?
Firefox 3.6 Trace JIT 技術(shù)
Firefox在Chrome的壓力之下,迅速的發(fā)布了TraceMonkey引擎,這個技術(shù)的特點是:
1、JS解釋器首先將源代碼轉(zhuǎn)變成為JavaScript字節(jié)碼(LIR),每一個字節(jié)碼都是SSA(Static Single Assignment)的。這個字節(jié)碼在某種格式上與Java Bytecode是類似的。不同的是,JavaScript字節(jié)碼缺乏類型信息,因此,在解釋的過程中,需要根據(jù)當前的數(shù)據(jù),進行選擇性的處理。因此,每條指令其實都是涉及到更為復(fù)雜的運行時類型檢查、動態(tài)分派的。
2、TraceMonkey首先以解釋的模式運行指令,但對loop(向后跳轉(zhuǎn))進行特殊關(guān)注:每一個向后跳轉(zhuǎn)指令意味著一次循環(huán)的開始,TraceJIT關(guān)注的是對循環(huán)的優(yōu)化,當一次循環(huán)開始時,TraceMoney試圖對一次循環(huán)的所有指令進行跟蹤,拉出一條平坦的執(zhí)行線索(trace tree)。
3、每一條執(zhí)行線索,對其內(nèi)部的類型信息,已經(jīng)進行了一個假設(shè),在這條線索執(zhí)行過程中,相關(guān)的字節(jié)碼實際上可以理解為已經(jīng)替換為類型化的字節(jié)碼(類似于Java的Bytecode)了。這個類型化的字節(jié)碼再經(jīng)過簡單的JIT編譯后,直接以機器碼的方式執(zhí)行。在線索執(zhí)行開始時,會對類型信息進行檢查,如果出現(xiàn)類型不匹配,則可能產(chǎn)生一個新的執(zhí)行線索。
4、執(zhí)行線索內(nèi)在的包含了method inline等技術(shù)。
應(yīng)該說,這種Trace技術(shù),與以往的method level JIT相比,是完全不同的。在適合的應(yīng)用里,Trace JIT相比V8等,還會有更大的執(zhí)行效率提高。
V8
Chrome V8毫無疑問是本次瀏覽器大戰(zhàn)的導(dǎo)火索,其功過還需要時間來驗證。V8的優(yōu)化機制:
◆Fast Property Access??焖賹ο髮傩栽L問。其特點是將JS對對象屬性的訪問,從一個動態(tài)的查找過程轉(zhuǎn)換成類似于Java/C++的靜態(tài)訪問。毫無疑問,在JavaScript中,對象屬性訪問是最為頻繁的一類操作,這個動態(tài)查找的過程其實是相當之消耗時間的。
◆動態(tài)機器碼生成。這個也是與快速屬性訪問相關(guān)的。它把動態(tài)的JS對象轉(zhuǎn)變?yōu)橐粋€類似于Java的靜態(tài)布局對象。
◆有效的GC。V8提供的是一個stop-the-world, generational, accurate的GC機制。而FF提供的則不是一個分代的GC。在實際應(yīng)用中,分代的GC相比不分代的GC顯然具有更高的效率。這一點,也是Java Hotspot所必須的。
其它的,Opera 10.50號稱推出了世界上那個最快速的JS引擎,不過,由于沒有文檔資料,暫時并不清楚其內(nèi)部機制。
預(yù)測:
FF的優(yōu)化機制和V8的優(yōu)化機制是不一樣的,兩者完全是可以互補的。因此,可以想象,如果將V8的優(yōu)化機制,如快速對象屬性訪問、分代GC等引入進來,結(jié)合Trace JIT技術(shù),相信速度會有更大的提升。同理,對于V8而言,如果將Trace技術(shù)引入進來,對運行時的類型進行更準確的預(yù)測,那么,執(zhí)行速度應(yīng)該也有更大幅度的提升。
綜上,這些優(yōu)化技術(shù)賦予了JavaScript更為強大的處理能力,使得瀏覽器可以更為快速的"下載執(zhí)行"更大型的應(yīng)用。使得原本需要在"native"語言中完成的功能,現(xiàn)在開始,可以在腳本語言中支持。
【編輯推薦】
- JavaScript最讓人費解的十件事
- JavaScript語法中12個需要繞開的陷阱
- JavaScript將增加本地操作API 可直接操作本地文件
- 探秘Google的JavaScript開發(fā)工具Closure
- 詳解Javascript框架中的全局變量