摘要:可以更有效地處理密集數(shù)組。然后有人提出了一個疑問為什么先指定長度再初始化測試出來會快一點其實,兩者相比只是可能變慢。具體因素有很多,比如預(yù)分配一個很大的數(shù)組,這時可以變快,的函數(shù)就是這么做的。如果數(shù)組很大,預(yù)先分配大小后性能反而會提升。
在我的上一篇文章 JavaScript 在 V8 中的元素種類及性能優(yōu)化 中寫道:
V8 的類型轉(zhuǎn)換只能通過格子向下過渡。一旦將單精度浮點數(shù)添加到 Smi 數(shù)組中,即使稍后用 Smi 覆蓋浮點數(shù),它也會被標(biāo)記為 DOUBLE。類似地,一旦在數(shù)組中創(chuàng)建了一個洞,它將被永久標(biāo)記為有洞 HOLEY,即使稍后填充它也是如此。
一旦數(shù)組被標(biāo)記為有洞,它永遠是有洞的 - 即使它被打包了!從那時起,數(shù)組上的任何操作都可能變慢。如果您計劃在數(shù)組上執(zhí)行大量操作,并且希望對這些操作進行優(yōu)化,請避免在數(shù)組中創(chuàng)建空洞。V8 可以更有效地處理密集數(shù)組。
然后有人提出了一個疑問:
為什么先指定長度再初始化測試出來會快一點?
其實,兩者相比只是“可能”變慢。
具體因素有很多,比如預(yù)分配一個很大的數(shù)組,這時可以變快,lodash 的 map 函數(shù)就是這么做的。因為初始化的時候分配完空間,就可以避免在數(shù)組空間不夠用的時候反復(fù)的內(nèi)存申請和 GC 操作。而 FAST_ELEMENTS 和 FAST_HOLEY_ELEMENTS 都不太慢,至少在所有元素中可以排到前二。
https://cs.chromium.org/chrom...
數(shù)組分配完成后默認是 FAST_HOLEY_SMI_ELEMENTS,當(dāng)元素中添加了新的非 smi 值時,數(shù)據(jù)會進行類型轉(zhuǎn)換。--trace-elements-transitions 的輸出:
elements transition [FAST_HOLEY_SMI_ELEMENTS -> FAST_HOLEY_ELEMENTS]
我寫了一個性能測試,對于 HOLEY_ELEMENTS,讀取的時候 HOLEY 慢很多,寫入的時候性能一樣。如果數(shù)組很大,預(yù)先分配大小后性能反而會提升。
https://jsperf.com/array-elem...
https://jsperf.com/array-elem...
還有一個重要的性能提示就是:避免讀數(shù)超出數(shù)組的長度!這樣 V8 會在原型鏈上去找這個屬性。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/88659.html
摘要:整數(shù)類型整數(shù)類型有,分別使用位存儲空間。實數(shù)類型實數(shù)類型有,分別占用,字節(jié)。簡單數(shù)據(jù)類型的操作需要更少的周期。 1. 整數(shù)類型 整數(shù)類型有:tinyint、smallint、mediumint、int、bigint,分別使用 8、16、24、32、64 位存儲空間。它們可以存儲的值范圍從 -2 的 (n-1) 次方到 2 的 (n-1) 次方 -1,n 是存儲空間的位數(shù)。 整數(shù)有可選的...
摘要:沒有直接使用語言傳統(tǒng)的字符串表示以空字符串結(jié)尾的字符數(shù)組,而是構(gòu)建了一種名為簡單動態(tài)字符串的抽象類型,并將用作的默認字符串表示。對比字符串,有幾大優(yōu)點常數(shù)復(fù)雜度獲取字符串長度杜絕緩沖區(qū)溢出減少修改字符串時所需的內(nèi)存重分配次數(shù)。 Redis 沒有直接使用 C 語言傳統(tǒng)的字符串表示(以空字符串結(jié)尾的字符數(shù)組),而是構(gòu)建了一種名為簡單動態(tài)字符串(simple dynamic string)的...
摘要:假設(shè)我們需要在程序中計算一些數(shù)字的平方根。此外如果我們需要在程序中多次使用平方根函數(shù),代碼將會更整潔。然而在這個虛構(gòu)的例子中,只有的年齡超過歲。然后檢查這三個人的年齡是否滿足第二個條件。 作者:?Christopher Tao翻譯:王可汗校對:王雨桐本文約1800字,建議閱讀5分鐘本文...
閱讀 2977·2021-10-19 10:09
閱讀 3189·2021-10-09 09:41
閱讀 3456·2021-09-26 09:47
閱讀 2776·2019-08-30 15:56
閱讀 648·2019-08-29 17:04
閱讀 1038·2019-08-26 11:58
閱讀 2564·2019-08-26 11:51
閱讀 3425·2019-08-26 11:29