亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么array.push有時比array [n] = value更快?

為什么array.push有時比array [n] = value更快?

Go
波斯汪 2019-11-23 15:15:26
為什么array.push有時比array [n] = value更快?作為測試一些代碼的副作用,我編寫了一個小函數來比較使用array.push方法與直接尋址(array [n] = value)的速度。令我驚訝的是,推送方法通常表現得更快,特別是在Firefox中,有時在Chrome中。只是出于好奇:任何人都有解釋嗎?您可以在此頁面找到測試(單擊“數組方法比較”)
查看完整描述

3 回答

?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

這些是我通過測試得到的結果

在Safari上:

  • Array.push(n)1,000,000個值:0.124秒

  • 數組[n .. 0] =值(降序)1,000,000個值:3.697秒

  • 數組[0 .. n] =值(升序)1,000,000個值:0.073秒

在FireFox上:

  • Array.push(n)1,000,000個值:0.075秒

  • 數組[n .. 0] =值(降序)1,000,000個值:1.193秒

  • 數組[0 .. n] =值(升序)1,000,000個值:0.055秒

在IE7上:

  • Array.push(n)1,000,000個值:2.828秒

  • 數組[n .. 0] =值(降序)1,000,000個值:1.141秒

  • 數組[0 .. n] =值(升序)1,000,000個值:7.984秒

根據你的測試,推送方法似乎在IE7上更好(差異很大),并且由于在其他瀏覽器上差異很小,似乎推送方法確實是向陣列添加元素的最佳方式。

但是我創建了另一個簡單的測試腳本來檢查快速將值附加到數組的方法,結果讓我感到驚訝,使用Array.length似乎比使用Array.push要快得多,所以我真的不知道是什么再說一遍,我一無所知。

順便說一句:在我的IE7上你的腳本停止了,瀏覽器問我是否要讓它繼續下去(你知道典型的IE消息說:“停止運行這個腳本?...”)我會重新嘗試減少一點循環。



查看完整回答
反對 回復 2019-11-24
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

push() 是更普遍的[[Put]]的特例,因此可以進一步優化:

在數組對象上調用[[Put]]時,必須首先將參數轉換為無符號整數,因為所有屬性名稱(包括數組索引)都是字符串。然后必須將其與數組的長度屬性進行比較,以確定是否必須增加長度。推送時,不需要進行這樣的轉換或比較:只需使用當前長度作為數組索引并增加它。

當然還有其他一些會影響運行時的東西,例如調用push()應該比調用[[Put]] via慢,[]因為必須檢查原型鏈的前者。


正如olliej指出的那樣:實際的ECMAScript實現將優化轉換,即對于數字屬性名稱,不會進行從字符串到uint的轉換,只需進行簡單的類型檢查?;炯僭O應該仍然有效,盡管其影響將小于我原先假設的影響。



查看完整回答
反對 回復 2019-11-24
  • 3 回答
  • 0 關注
  • 865 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號