2016-01-13 13 views

risposta

2

Poiché hai chiesto "più veloce", sembra che si può guadagnare un po 'di velocità con la creazione di un unico array initalized e quindi utilizzando .slice() per copiarlo invece di inizializzare ogni matrice stessa:

var nodes = new Array(ast.length); 
var copy = new Array(ast.length); 
for (var i = 0; i < ast.length; i++) { 
    copy[i] = 0; 
} 

for (var i=0; i < nodes.length; i++){ 
    nodes[i] = copy.slice(0); 
} 

prova jsperf: http://jsperf.com/slice-vs-for-two-d-array/2

Questo metodo sembra essere il 10-20% più veloce in tutti e tre i principali browser.

enter image description here

7

è possibile utilizzare il metodo Array.prototype.fill:

var nodes = Array(ast.length).fill(Array(ast.length).fill(0)); 

prova jsperf: http://jsperf.com/fill-array-matrix

+0

Nota di riempimento() non è pienamente supportato. – epascarello

+0

Penso che anche questo sarà più lento del codice OPs, ma è paragonabile. – Paulpro

+1

Nota per OP: '.fill()' non è ancora supportato universalmente. Sembra non esserci supporto in IE o iOS7 e non ottimo supporto in Android. Potresti usare un polyfill, ma non aspettarti che il polyfill sia veloce. Quindi, in pratica questo potrebbe velocizzarti su Chrome, Firefox e Edge. – jfriend00

2

È possibile creare serie di zeri, una volta e creare copie di esso:

var length = 10; 

var zeros = Array.apply(null, Array(length)).map(Number.prototype.valueOf, 0); 
var nodes = zeros.map(function(i) { 
    return zeros.slice(); 
}); 

console.log(nodes); 
+0

Il tuo codice mostra una lunghezza di 10, ma tu richiedi 1000x1000. Penso che sia necessario pubblicare la propria tecnica di misurazione per credere che il riempimento dell'array sia 0ms e che la soluzione sia 4ms vs. 1492ms per il ciclo double 'for'. Mi sembra una differenza troppo grande per avere ragione. Se è così, fantastico. Ma, senza ulteriore documentazione, è un po 'difficile da credere. – jfriend00

+0

Grazie. I tempi di esecuzione della tua soluzione e di @ jfriend00 sono quasi gli stessi. – SaadH

Problemi correlati