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