I motori moderni useranno i veri array dietro le quinte anche se si pensa di poterlo fare, ricadendo su "array" di mappe di proprietà se si fa qualcosa che gli fa pensare di non poter usare un vero array.
noti inoltre che come radsoc points out, var buffer = new ArrayBuffer(0x10000)
quindi var Uint32 = new Uint32Array(buffer)
produce una matrice Uint32 cui dimensione è 0x4000 (0x10000/4), non 0x10000, perché il valore si dà ArrayBuffer
è in byte, ma naturalmente ci sono quattro byte per ogni Uint32Array . Tutti i seguenti usi new Uint32Array(0x10000)
invece (e sempre fatto, anche prima di questa modifica) per confrontare le mele con le mele.
Così iniziamo lì, con new Uint32Array(0x10000)
: http://jsperf.com/array-access-speed-2/11(purtroppo, JSPerf ha perso questo test e dei suoi risultati, e 'ora offline del tutto)

Ciò suggerisce che perché si' riempiendo l'array in un modo semplice e prevedibile, un motore moderno continua a utilizzare un vero array (con i relativi vantaggi in termini di prestazioni) sotto le coperte anziché spostarsi. Vediamo sostanzialmente le stesse prestazioni per entrambi. La differenza di velocità potrebbe riguardare la conversione del tipo prendendo il valore Uint32
e assegnandolo a sum
come number
(anche se sono sorpreso se quella conversione di tipo non viene differita ...).
Aggiungere un po 'di caos, però:
var Uint32 = new Uint32Array(0x10000);
var arr = [];
for (var i = 0x10000 - 1; i >= 0; --i) {
Uint32[Math.random() * 0x10000 | 0] = (Math.random() * 0x100000000) | 0;
arr[Math.random() * 0x10000 | 0] = (Math.random() * 0x100000000) | 0;
}
var sum = 0;
... in modo che il motore deve ripiegare su vecchio stile mappa proprietà "array", e si vede che gli array tipizzati marcatamente sovraperformare il vecchio stile genere: http://jsperf.com/array-access-speed-2/3(purtroppo, ha perso JSPerf questo test e dei suoi risultati)

Clever, questi JavaSc ingegneri del motore ripuliti ...
La cosa specifica che si esegue con la natura non di matrice dell'array Array
è importante; prendere in considerazione:
var Uint32 = new Uint32Array(0x10000);
var arr = [];
arr.foo = "bar"; // <== Non-element property
for (var i = 0; i < 0x10000; ++i) {
Uint32[i] = (Math.random() * 0x100000000) | 0;
arr[i] = (Math.random() * 0x100000000) | 0;
}
var sum = 0;
che è ancora riempiendo la matrice prevedibile, ma aggiungiamo una struttura non-elemento (foo
) ad esso. http://jsperf.com/array-access-speed-2/4(purtroppo, JSPerf ha perso questo test e dei suoi risultati) A quanto pare, i motori sono abbastanza intelligente, e mantenere la proprietà non-elemento a lato, pur continuando a utilizzare un vero array per le proprietà degli elementi:

sono a un po 'di una perdita per spiegare il motivo per cui le matrici normali dovrebbero ottenere più velocemente lì rispetto alla nostra prima prova di cui sopra. Errore di misurazione? Vagaries in Math.random
? Ma siamo ancora abbastanza sicuri che i dati specifici dell'array nello Array
siano ancora un array vero.
Mentre se facciamo la stessa cosa ma compilare in ordine inverso:
var Uint32 = new Uint32Array(0x10000);
var arr = [];
arr.foo = "bar"; // <== Non-element property
for (var i = 0x10000 - 1; i >= 0; --i) { // <== Reverse order
Uint32[i] = (Math.random() * 0x100000000) | 0;
arr[i] = (Math.random() * 0x100000000) | 0;
}
var sum = 0;
... noi tornare a vincere array tipizzati fuori — eccetto IE11: http://jsperf.com/array-access-speed-2/9(purtroppo, ha JSPerf perso questo test e dei suoi risultati)

Hai eliminato i test jsperf? Non riesco più ad accedervi – Bergi
No, non l'ho rimosso. Questo è strano. –
Molto, molto strano che sarebbero scomparsi in quel modo! Tutti loro ... Particolarmente strano alla luce di [questa voce delle FAQ] (http://jsperf.com/faq#test-availability). Ho cercato nel caso in cui l'URL fosse cambiato o qualcosa del genere, e ... niente. Posso trovare altri test sulle prestazioni dell'array, ma non su quelli di Sukhanov e dei miei. Ho sollevato un [problema per questo] (https://github.com/mathiasbynens/jsperf.com/issues/197). Certo, probabilmente non sarebbe male se più di noi [donati a jsPerf] (http://jsperf.com/faq#donate) (e ho appena fatto ... per la prima volta * la testa d'anatra *). –