最近在玩弄JavaScript ,也一直在捉摸,腳本Engine怎麼解析你寫的Code,對Google興趣濃,索性就看了谷歌的腳本engine的官方資料,都是E文的,可是倒是最純的不是,看下來總結V8性能的幾點表現:編程
1.快速屬性訪問緩存
相比於其餘語言,JavaScript是動態編程語言,屬性可添可減,對象自由調用,意味着對象的屬性很容易改變,相比於其餘的腳本引擎,IE的JScript,FF的SpiderMonkey 和Safari的JavaScriptCore,大部分使用像字典結構的的存儲結構-每一個屬性訪問必須查找和解釋屬性在內存中的位置。這樣就致使要比像Java那樣的實例訪問要慢,爲了減小訪問屬性的時間,V8動態的建立隱藏類(Hidden Classes)在後臺,每次對象屬性的增減,都會在原來的Hidden Classes基礎上生成一個新的Hidden Classes. 編程語言
1 function Point(x, y){ 2 this.x = x; 3 this.y = y;} 4 }
定義一個這樣的函數,共有3個Hidden class的生成,初始化C0,無任何屬性,而後添加一個屬性x,Hidden Class從C0變成C1,添加了一個屬性x,同理C1到C2。這樣屬性訪問不須要字典查找,使用這樣一個經典的基於類的優化-內聯緩存。更多內聯緩存信息請看:ide
2.動態機器碼生成函數
V8針對Code,執行的時候是直接生成機器碼,而不是Byte Code ,例如,訪問上面Point的屬性x性能
point.x
在V8中,爲了訪問x,機器碼以下。優化
1 # ebx = the point object 2 cmp [ebx,<hidden class offset>],<cached hidden class> 3 jne <inline cache miss> 4 mov eax,[ebx, <cached x offset>]
若是point的隱藏類不匹配緩存的隱藏類,則跳過cmp,執行jne(針對丟失的內聯緩存,修補這個內聯緩存),而後再執行cmp,這樣的一個過程實現了屬性x的訪問。當有多個相同對象時,將會共享這個緩存的Hidden class.這樣極大加速了Code的執行。
3.高效分代垃圾回收機制this
衆所周知的垃圾回收,V8回收內存再也不是經過進程而是對象機制,對象會被分配到兩塊空間,一塊是對象建立的空間,一塊是在垃圾回收的空間,若是對象被移入到垃圾回收空間,V8會更新全部指向對象的指針,這樣避免了內存泄漏的風險。指針