2011-09-10 60 views
1

我很好奇的修改JavaScript的內置數組類的方式不同的速度,所以我做了一個小測試:爲什麼自定義陣列比香草版本慢?

http://jsperf.com/array-vs-custom-array

與此相比增加了刪除功能,以陣列的三種不同的方式。使用Object.create()添加的remove()函數似乎非常狂野(在Chrome中約爲90%)比使用.call()或添加到Array.prototype的相同函數慢。他們都做同樣的事情,實際上是相同的功能,所以我很好奇爲什麼有一個速度差。

回答

0

我的猜測是函數查找時間加起來。

在第一種情況下,您已經查詢了remove的地址,因此調用該函數很簡單。

Object.create()方法將不得不先看Array.prototype,然後在新對象的屬性中找到它。

最後一個原型替換方法會導致原型中函數的查找時間。

我不知道如何測試這個假設,但是在優化一些python代碼之前我已經看到過類似的東西。

+0

有趣的..我修改了測試,以包括一個薄荷的例子,其中我創建它後,在數組中添加刪除。這似乎是巧克力的Object.create()方法最快和功能相同,但與不利的是,.remove將可枚舉.. http://jsperf.com/array-vs-custom-array/3 – notlion

+0

此外,我在這樣的印象中,函數調用將首先查看原型上的直接對象和_then_。所以巧克力和香草不應該一樣嗎? Hrm .. – notlion

+0

如果您仍然對這個測試感興趣,我認爲問題的一部分是您在時間段中有太多內容。如果將推送呼叫移動到測試設置中,則對於所有三種類型的刪除性能都是相似的。 http://jsperf.com/array-vs-custom-array/4 – myeeshen