最近看到了一篇論文: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默認使用的模式,數組會存儲在連續的空間中,並且空間是會動態生長的,由於其內部實現是C數組,因此速度很是快。數組
那麼何時會使用這種模式呢?瀏覽器
var a = new Array()
var a = new Array(100)
var a = new Array(1,2,3);
var a = []
var a = [1,2,3]
複製代碼
這種模式的數組也是存在一個連續的存儲空間,而且空間能夠動態生長。性能優化
這種模式適合於數組中只有某些索引存有元素,而其餘的索引都沒有賦值的狀況。bash
在 Fast Holey Elements模式下,沒有賦值的數組索引將會存儲一個特殊的值(有必定的時間代價),這樣在訪問這些位置時就能夠獲得 undefined。ide
這種模式數組存儲在不連續的空間中,實際上就是使用 Hash方式存儲。性能
此方式最適合於存儲稀疏數組。優化
它不用開闢大塊連續的存儲空間,節省了內存,可是因爲須要維護這樣一個 Hash- Table,其存儲特定值的時間開銷通常要比 Fast Elements 模式大不少。spa
Fast Element -> Fast Holey Element: 當對數組上不連續的索引位置賦值時,由於這時會出現空洞。.net
Fast Element -> Dictionary Element: 對數組賦值時使用遠超當前數組大小的索引值,由於這時候要對數組分配大量空間則將可能形成存儲空間的浪費。