2012-11-21 20 views
5

在閱讀the recent smashing magazine關於優化的文章之後,我運行了一些測試,以查看從我的數組中間刪除元素的最有效方法。刪除第一個元素後,數組遍歷的幅度更快

運行我自己的測試,關於從數組中間拼接一個數值與刪除數組/將其設置爲空,我遇到了一個意想不到的結果,即將該數組與數組拼接後,幅度快於遍歷。

更多調查導致我到this

由於某種原因,.shift()從數組中移出第一條記錄使其遍歷速度提高了300倍(在v8中看到的最大性能,但它對於我嘗試過的所有瀏覽器都是有效的它在)。

我懷疑我會濫用這個,因爲我不認爲實際的遍歷是一個瓶頸,但有誰知道爲什麼會出現這種行爲?

編輯:不正確的使用jsPerf是這裏的根本問題,請參閱下面的答案。

回答

0

好吧,事實證明這實際上是我對jsPerf工作方式的誤解。

腳本的安裝部分是在每組循環的開始處運行的,而不是在每次嘗試腳本時都運行它。

如圖所示here數字實際上是你想象的結果。

0

所以我試圖從每個函數中刪除for循環,比較核心數組函數和for循環本身。

http://jsperf.com/spliced-vs-non-spliced/3

的基準是由於在每個功能的內部工作這些簡單的差異縮放數量級。通過簡化到最低限度的零件,我們能夠隔離真正的差異。我懷疑這是因爲for循環實際上是以更快或更慢的速度遍歷 - 這只是因爲測試中的其他功能而出現。

儘管存在誤解,但它仍然非常有助於闡明Array函數的工作方式以及JavaScript開發人員應如何應用它們。

+0

我不這麼認爲,如果是這樣的話,那麼這個測試用例http://jsperf.com/spliced-vs-non-spliced/6就應該拿出來,兩者的速度大致相同,拼接的速度非常快,看起來並非如此。 – Doug

1

性能測試充滿了無數的錯誤。
最重要的是採樣長度爲1000.使用今天的處理器,可以立即遍歷1000個物品陣列,並且您可以更多地測量您調用的第一個陣列方法(移位,切片...)所用的時間。比實際的數組遍歷。
所以你必須
1)使用更長的陣列,
2)做切片/轉換/ ...在循環之前,因爲這不是你想要測量。

然後你會看到沒有魔法,並且該陣列需要遍歷所有陣列的同時

我開始於http://jsperf.com/spliced-vs-non-spliced/4,適用於normal/sliced(0,0)和shift()的情況。性能差異不如測量誤差。