2013-04-17 3 views
6

Чтобы получить доступ к данным в массиве, я создал переменную enum, чтобы иметь человекообразные идентификаторы для полей.Почему замороженное «перечисление» медленнее?

var columns = { first: 0, second: 1 }; 
var array = ['first', 'second']; 
var data = array[columns.first]; 

Когда я узнал о Object.freeze я хотел бы использовать это для перечисления, так что он не может быть изменен, и я ожидал, что VM использовать эту информацию в своих интересах.

Как оказалось, тесты становятся медленнее в Chrome и Node, но немного быстрее в Firefox (по сравнению с прямым доступом по номеру).

код доступен здесь: http://jsperf.com/array-access-via-enum

Вот тесты из узла (соответствующие тесты JSPerf):

fixed Number: 12ms 
    enum: 12ms 
    frozenEnum: 85ms 

ли V8 просто еще не имеет большую реализацию, или есть что-то субоптимальный с этим подходом для моего прецедента?

+1

Похоже, что статический анализ кода V8 довольно хорош и переводит доступ к фиксированным номерам «столбцы». Он не делает этого с «замороженным» объектом enum, поскольку он мутирует «Object.freeze» - FF кажется более умным. – Bergi

ответ

4

Я пробовал ваш тест в Firefox 20, который значительно быстрее по всем направлениям, и IE 10, который немного быстрее и более последователен.

Так что мой ответ Нет, V8 еще не имеют большой реализацию

+0

И по некоторым техническим причинам пользователи узла иногда откладывают некоторые новые функции и улучшения V8 на некоторое время. Может быть изменено в функции. – TheHippo

1

Согласно этому bugreport, замораживание объекта в настоящее время ставит его в «Словаре-режим», который медленно.

Таким образом, вместо улучшения производительности он становится определенным замедлением для «перечислений»/небольших массивов.

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