2013-04-17 15 views
6

Per accedere ai dati in un array, ho creato una variabile simile a enum per avere identificativi leggibili dall'uomo nei campi.Perché un "enum" congelato è più lento?

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

Quando ho scoperto Object.freeze ho voluto usare questo per l'enumerazione in modo che non può essere cambiato, e mi aspettavo la VM di utilizzare queste informazioni a suo vantaggio.

Come risulta, i test diventano più lenti su Chrome e Node, ma leggermente più veloci su Firefox (rispetto all'accesso diretto per numero).

Il codice è disponibile qui: http://jsperf.com/array-access-via-enum

Ecco i parametri di riferimento dal nodo (corrispondenti alle prove JSPerf):

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

non V8 non solo ancora una grande realizzazione, o c'è qualcosa non ottimale con questo approccio per il mio caso d'uso?

+1

Sembra che l'analisi del codice statico di V8 sia abbastanza buona e traduca l'accesso enum delle colonne ai numeri fissi. Non lo fa con l'oggetto enum "congelato" dato che è mutato da "Object.freeze" - FF sembra essere più intelligente lì. – Bergi

risposta

4

Ho provato il test in Firefox 20, che è molto più veloce su tutta la linea, e IE 10 che è leggermente più veloce e consistente.

Quindi la mia risposta è No, V8 non ha ancora una grande implementazione

+0

E per alcuni motivi tecnici, le persone del nodo a volte rimandano alcune nuove funzionalità/miglioramenti V8 per un po 'di tempo. Potrebbe cambiare nella funzionalità. – TheHippo

1

Secondo questa bugreport, il congelamento di un oggetto attualmente lo mette in "Dizionario-mode", che è lento.

Quindi, invece di migliorare le prestazioni, diventa un deciso rallentamento per "enum"/piccoli array.