2013-04-17 12 views
6

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?

+1

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

Odpowiedz

4

Wypróbowałem twój test w Firefoksie 20, który jest znacznie szybszy we wszystkich dziedzinach, a IE 10, który jest nieco szybszy i bardziej spójny.

Więc moja odpowiedź jest Nie, V8 nie ma jeszcze wielką realizację

+0

A z pewnych przyczyn technicznych, ludzie w węźle czasami odkładają na jakiś czas nową funkcję/ulepszenia V8. Może się zmienić w funkcji. – TheHippo

1

Według tego bugreport, zamrażanie obiekt obecnie stawia go w trybie „słowniku”, który jest powolny.

Zamiast poprawiać wydajność, staje się wyraźnym spowolnieniem dla "wyliczeń"/małych tablic.

Powiązane problemy