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消息說:“停止運行這個腳本?...”)我會重新嘗試減少一點循環。

TA貢獻1818條經驗 獲得超3個贊
push()
是更普遍的[[Put]]的特例,因此可以進一步優化:
在數組對象上調用[[Put]]時,必須首先將參數轉換為無符號整數,因為所有屬性名稱(包括數組索引)都是字符串。然后必須將其與數組的長度屬性進行比較,以確定是否必須增加長度。推送時,不需要進行這樣的轉換或比較:只需使用當前長度作為數組索引并增加它。
當然還有其他一些會影響運行時的東西,例如調用push()
應該比調用[[Put]] via慢,[]
因為必須檢查原型鏈的前者。
正如olliej指出的那樣:實際的ECMAScript實現將優化轉換,即對于數字屬性名稱,不會進行從字符串到uint的轉換,只需進行簡單的類型檢查?;炯僭O應該仍然有效,盡管其影響將小于我原先假設的影響。
- 3 回答
- 0 關注
- 865 瀏覽
添加回答
舉報