2011-09-10 5 views
1

мне было интересно о скорости различных способов модификации встроенного класса массива в JavaScript, поэтому я сделал небольшой тест:Почему пользовательский массив медленнее, чем версия ванили?

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

Это сравнивает три различные способ добавления функции УДАЛИТЬ к массиву. Функция remove(), добавленная с Object.create(), кажется, дико (~ 90% в Chrome) медленнее той же функции с .call() или добавлена ​​в Array.prototype. Они все делают одно и то же, и на самом деле это одна и та же функция, поэтому мне любопытно, почему существует разница в скорости.

ответ

0

Мое предположение - это время поиска функции.

В первом случае вы уже просмотрели адрес remove, поэтому просто позвонить функции.

Метод Object.create() должен сначала посмотреть в Array.prototype, а затем найти его в свойствах нового объекта.

Последний способ замены прототипа требует времени поиска для функции в прототипе.

Я не уверен, как проверить эту гипотезу, но я видел что-то подобное раньше, когда оптимизирую код python.

+0

Интересно .. Я изменил тест, чтобы включить пример монетного двора, где я просто установил add remove на массив после его создания. Это кажется самым быстрым и функционально идентичным методу шоколада Object.create(), но с недостатком, что .remove будет перечислимым .. http://jsperf.com/array-vs-custom-array/3 – notlion

+0

Кроме того, я возникло впечатление, что вызов функции сначала рассмотрит непосредственный объект и _then_ на прототипе. Так что шоколад и ваниль не должны быть одинаковыми? Hrm .. – notlion

+0

Если вы все еще интересуетесь этим тестом, я думаю, что часть проблемы заключается в том, что у вас было слишком много времени в разделе времени. Если вы переместите push-вызов в тестовую настройку, производительность для удаления будет одинаковой для всех трех типов. http://jsperf.com/array-vs-custom-array/4 – myeeshen

Смежные вопросы