Aby uzyskać dostęp do danych w tablicy, utworzyłem zmienną podobną do enum
, aby uzyskać czytelne dla człowieka identyfikatory do pól.Dlaczego zamrażanie "enum" jest wolniejsze?
var columns = { first: 0, second: 1 };
var array = ['first', 'second'];
var data = array[columns.first];
Kiedy dowiedziałam się o Object.freeze
chciałem to wykorzystać do wyliczenia tak, że nie może być zmieniony, i spodziewałem VM aby skorzystać z tej informacji na jego korzyść.
Okazuje się, że testy są wolniejsze w Chrome i Node, ale nieco szybciej w Firefoksie (w porównaniu do bezpośredniego dostępu według numeru).
Kod jest dostępny tutaj: http://jsperf.com/array-access-via-enum
Oto odniesienia z węzła (odpowiadające testów JSPerf):
fixed Number: 12ms
enum: 12ms
frozenEnum: 85ms
Czy V8 po prostu jeszcze nie mają wielką realizację, czy jest tam coś nieoptymalne z tym podejściem do mojego przypadku użycia?
Wygląda na to, że statyczna analiza kodu V8 jest całkiem dobra i tłumaczy "kolumny" wyliczając dostęp do stałych liczb. Nie robi tego z 'zamrożonym' obiektem enum, ponieważ jest zmutowany przez' Object.freeze' - FF wydaje się być mądrzejszy. – Bergi