JavaScriptFor循環(huán)中的array.length該不該緩存

JS中絕大多數(shù)的for循環(huán)都會(huì)和指定數(shù)組長(zhǎng)度(array.length)打交道,將數(shù)組長(zhǎng)度(array.length)緩存至變量里可以在每次for循環(huán)判斷時(shí)直接獲取數(shù)組的長(zhǎng)度,而不是每次判斷時(shí)都重新計(jì)算一遍,從而達(dá)到節(jié)省資源的目的。

// 不緩存 
for (var i = 0; i < arr.length; i++) {  
//代碼
}

// 緩存
var len = arr.length;
for (var i = 0; i < len; i++) {  
//代碼
}

可這個(gè)小小的優(yōu)化措施對(duì)于性能的提升到底如何?

直接上圖:

來(lái)源:[Shoud I have to cache my array’s length?](http://blogs.msdn.com/b/eternalcoding/archive/2015/01/07/javascript-shoud-i-have-to-cache-my-array-s-length.aspx)
來(lái)源:[JavaScript's .length Property is a Stored Value](http://www.erichynds.com/blog/javascript-length-property-is-a-stored-value)

從圖中可以看出緩存length屬性的話,對(duì)性能的確是有小幅度提升的,可是在使用了v8引擎的瀏覽器中(google chrome),由于v8引擎的Loop-invariant code motion特性,循環(huán)體中那些不會(huì)發(fā)生變化的語(yǔ)句將會(huì)被直接移到循環(huán)體外:

for (var i = 0; i < n; i++) { 
x = y + z; a[i] = 6 * i + x * x;
}

將會(huì)在編譯時(shí)自動(dòng)優(yōu)化成:

x = y + z;
t1 = x * x;
for (var i = 0; i < n; i++) { 
a[i] = 6 * i + t1;
}

以優(yōu)化性能。
由于這個(gè)特性,即便沒(méi)有緩存length屬性,由于length屬性不會(huì)隨著循環(huán)次數(shù)的增多而變化,length屬性會(huì)被自動(dòng)移到循環(huán)體外并緩存起來(lái)(僅限使用了v8引擎的chrome瀏覽器),所以是否多寫一行代碼來(lái)緩存length屬性,并不會(huì)影響到chrome瀏覽器對(duì)于array.length的優(yōu)化,至于非v8的主流瀏覽器(特別是ie),緩存length屬性對(duì)于性能還是有比較客觀的提升的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容