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