V8引擎對JS陣列的一些實現優化

2021-09-01 18:45:20 字數 2444 閱讀 5472

vart=

newarray

(200000

);console

.time

('time1'

);for

(vari=

0;i<

200000;++

i)console

.timeend

('time1'

);

vart=

;console

.time

('time2'

);for

(vari=

0;i<

200000;++

i)console

.timeend

('time2'

);

各位可以在各個瀏覽器控制台下看看輸出情況, 我這的情況大概如下:

chrome

time1: 59109.000ms

time2: 379.000ms

firefox

time1: 509ms

time2: 461ms

ietime1: 351ms

time2: 356ms

在stackoverflow上看到的結論如下:

如果陣列索引從0到length-1,而又無洞(注:洞的意思即存在索引所指向的元素未賦值),那麼這個引擎會用c語言的陣列來實現,因此會非常快。

如果在陣列中有洞,引擎將會用雜湊表來實現,這會比c陣列慢許多。

例外情況是:如果預分配的陣列長度小於100000, 引擎依然會用c陣列實現,此時該陣列有洞又有速度0- -!

vart=

newarray

(99999

);console

.time

('time1'

);for

(vari=

0;i<

200000;++

i)console

.timeend

('time1'

);

vart=

newarray

(99999+1

);console

.time

('time2'

);for

(vari=

0;i<

200000;++

i)console

.timeend

('time2'

);

chrome下執行結果如下:

time1: 447.00ms

time2: 4110.000msms

vart=

newarray

(180000

);console

.time

('time1'

);for

(vari=

0;i<

200000;++

i)console

.timeend

('time1'

);

vart=

newarray

(181000

);console

.time

('time2'

);for

(vari=

0;i<

200000;++

i)console

.timeend

('time2'

);

chrome輸出如下:

time1: 4165.000ms

time1: 59034.000ms

對此解釋如下:

v8引擎的啟發式演算法會將符合條件的處於字典(雜湊表)模式的陣列轉化為快速(c陣列)模式。 當陣列處於字典模式,在它每次要增長時,v8會檢查陣列是否足夠緊縮,且使用連續的c陣列替代字典陣列是否能在空間上更有優勢。

在上面的2個例子中,第乙個例子被替換為了c陣列, 第二個例子在空間上不具備更大的優勢,則未回退。

v8對陣列的優化步驟如下:

預分配陣列長度小於等於100000,或陣列無洞,底層採用c陣列實現;空間換時間

預分配陣列長度大於100000,陣列有洞,底層採用雜湊表實現;時間換空間

處於字典模式(雜湊表實現)的陣列,在每次空間增長時,v8的啟發式演算法會檢查其空間佔用量, 若其空洞元素減少到一定程度,則會將其轉化為高速模式(c陣列)。

JS中V8引擎簡介

document 2020 09 29 v8引擎 認識v8 v8 策略 v8常用的gc演算法 新生代物件的垃圾 將新生代記憶體也分成兩個大小相等的空間 使用空間為from,空閒空間為to 活動物件儲存於from空間中 to一直是空閒的 當from空間應用到一定程度之後 觸發gc操作 標記整理後將活動...

v8引擎和v12引擎 深入V8引擎 AST 2

先宣告一下,這種長系列的大塊頭部落格只能保證盡可能的深入到每一行原始碼,有些 我不樂意深究就寫個注釋說明一下作用。另外,由於本地整理的比較好,部落格就隨心寫了。bool parseprogram parseinfo info,isolate isolate 所需要關心的核心 就是這些,非常簡單,pa...

Mac OS下V8引擎編譯方法

v8 的github位址 因為需要訪問到google的伺服器,所以下面做的一切都需要翻到牆外面。翻牆方法自行解決吧。v8的版本控制是有乙個叫depot tools的工具維護的,這個東西相當於的將git包了一層。具體安裝方法 mac 下編輯 bash profile檔案,在檔案最開頭新增下列 其中 u...