2011-09-10 20 views
15

Quali sono le caratteristiche delle prestazioni dell'accesso alle proprietà JavaScript (sulle attuali implementazioni)?Prestazioni di accesso alle proprietà big-O Javascript

  • È sicuro assumere l'accesso di matrice è O (1)?
  • Se utilizzo un oggetto come tabella hash (con chiavi stringa), posso tranquillamente dedurre O (1) o O (log n) tempo di accesso?

  • Ci sono browser o ambienti comuni che sono significativamente più veloci/lenti degli altri e che dovrei tenere d'occhio?

  • Gli standard JavaScript hanno qualcosa da dire?

E, soprattutto:

  • Dove posso trovare buone referenze per questo tipo di asintotica problemi di prestazioni JavaScript?
+0

Che cosa ti ha detto la ricerca che hai fatto da solo su una di queste domande? –

+2

Non voglio fare molte ricerche da solo su qualcosa che a) Probabilmente mi sbaglierò comunque eb) È molto probabile che sia stato già fatto da qualcuno più esperto sull'argomento di me. Aggiornamento – hugomg

+0

: [C'è qualcosa che garantisce il tempo costante per accedere a una proprietà di un oggetto in JavaScript?] (Http://stackoverflow.com/q/34292087/1048572) – Bergi

risposta

6

Ogni oggetto in JavaScript è implementato come un hash dell'oggetto, quindi non c'è alcuna differenza funzionale.

Ad esempio, controlla questo test:

var arr = []; 
arr[5] = 5; 
arr['5'] = 'not 5'; 
console.log(arr.length, arr); 
// output: 6 [undefined, undefined, undefined, undefined, undefined, "not 5"] 

numeri sono stringata quando usato come posizioni.

Vedere Crockford's website su JavaScript per ulteriori informazioni. La parte particolarmente importante è sotto la voce "array":

Arrays in JavaScript are also hashtable objects.

prestazioni non è davvero un problema a meno che non si dispone di una tonnellata di oggetti per tenere traccia di (come 500.000+), nel qual caso si' probabilmente stai facendo qualcosa di sbagliato.

Ci sono ottimizzazioni che puoi fare, ma non hanno senso se non stai facendo qualcosa di innaturale con JavaScript (come gli algoritmi di compressione ... ho lavorato su un'implementazione LZMA in JS ... cattiva idea).

Nota:

Se si dispone di un set di ricambio (come si definisce solo 10 indici su 10.000), probabilmente si dovrebbe essere utilizzando un oggetto normale. Gli array inizializzeranno tutti i 10.000 indici su "non definito", mentre lo Object.keys(obj) segnalerà solo il 10 che hai impostato. Questa è un'ottimizzazione minore che in realtà ha senso.

+1

So come si comportano gli oggetti e gli array, ma io voglio davvero sapere cosa succede con i grandi numeri. Probabilmente non avresti comunque bisogno di andare a 500000 - se qualcosa si rivelasse essere O (N^2) basterebbero poche migliaia per iniziare a preoccuparti. – hugomg

+2

Leggi il link. Le matrici sono tabelle hash. Ciò significa che probabilmente è O (logn) per le ricerche (c'è molta ottimizzazione lì).Il mio collega ha eseguito alcuni test e ha scoperto che non era significativo fino a quando non si superava i 50.000 o qualcos'altro. – tjameson

Problemi correlati