3 回答

TA貢獻1853條經(jīng)驗 獲得超6個贊
這些是我通過測試得到的結果
在Safari上:
Array.push(n)1,000,000個值:0.124秒
數(shù)組[n .. 0] =值(降序)1,000,000個值:3.697秒
數(shù)組[0 .. n] =值(升序)1,000,000個值:0.073秒
在FireFox上:
Array.push(n)1,000,000個值:0.075秒
數(shù)組[n .. 0] =值(降序)1,000,000個值:1.193秒
數(shù)組[0 .. n] =值(升序)1,000,000個值:0.055秒
在IE7上:
Array.push(n)1,000,000個值:2.828秒
數(shù)組[n .. 0] =值(降序)1,000,000個值:1.141秒
數(shù)組[0 .. n] =值(升序)1,000,000個值:7.984秒
根據(jù)你的測試,推送方法似乎在IE7上更好(差異很大),并且由于在其他瀏覽器上差異很小,似乎推送方法確實是向陣列添加元素的最佳方式。
但是我創(chuàng)建了另一個簡單的測試腳本來檢查快速將值附加到數(shù)組的方法,結果讓我感到驚訝,使用Array.length似乎比使用Array.push要快得多,所以我真的不知道是什么再說一遍,我一無所知。
順便說一句:在我的IE7上你的腳本停止了,瀏覽器問我是否要讓它繼續(xù)下去(你知道典型的IE消息說:“停止運行這個腳本?...”)我會重新嘗試減少一點循環(huán)。

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