JS數組在V8引擎中的實現

最近看到了一篇論文:ChromeV8引擎中的Javascript數組實現分析與性能優化,看完以後感受收穫仍是挺多的,如今和你們分享一下。html

先說下主流的瀏覽器內核

主流瀏覽器 js引擎
IE -> Edge JScript(IE3.0-IE8.0)/ Chakra(IE9+以後,查克拉)
Chrome V8(大名鼎鼎)
Safari Nitro(4-)
Firefox SpiderMonkey(1.0-3.0)/ TraceMonkey(3.5-3.6) / GaegerMonkey(4.0-)
Opera LinerA(4.0-6.0)/ LinerB(7.0-9.2)/ Futhark(9.5-10.2)/ Carakan (10.5-)

V8對Javascript數組的實現模式

  • Fast Element (快速模式)
  • Fast Holey Element (快速空洞模式)
  • Dictionary Element(字典模式)

Fast Element

這種模式是V8默認使用的模式,數組會存儲在連續的空間中,並且空間是會動態生長的,由於其內部實現是C數組,因此速度很是快。數組

那麼何時會使用這種模式呢?瀏覽器

var a  = new Array()
var a = new Array(100)
var a = new Array(1,2,3);
var a = []
var a = [1,2,3]
複製代碼

Fast Holey Element

這種模式的數組也是存在一個連續的存儲空間,而且空間能夠動態生長。性能優化

這種模式適合於數組中只有某些索引存有元素,而其餘的索引都沒有賦值的狀況。bash

在 Fast Holey Elements模式下,沒有賦值的數組索引將會存儲一個特殊的值(有必定的時間代價),這樣在訪問這些位置時就能夠獲得 undefined。ide

Dictionary Element

這種模式數組存儲在不連續的空間中,實際上就是使用 Hash方式存儲。性能

此方式最適合於存儲稀疏數組。優化

它不用開闢大塊連續的存儲空間,節省了內存,可是因爲須要維護這樣一個 Hash- Table,其存儲特定值的時間開銷通常要比 Fast Elements 模式大不少。spa

模式轉換的典型場景

  • Fast Element -> Fast Holey Element: 當對數組上不連續的索引位置賦值時,由於這時會出現空洞。.net

  • Fast Element -> Dictionary Element: 對數組賦值時使用遠超當前數組大小的索引值,由於這時候要對數組分配大量空間則將可能形成存儲空間的浪費。

推薦閱讀:

相關文章
相關標籤/搜索