2016-01-13 5 views

Antwort

2

Da Sie bat um „schneller“, sieht es aus wie Sie durch die Schaffung eines einzigen initialisiert Array etwas Geschwindigkeit gewinnen und dann .slice() verwenden, es zu kopieren, anstatt die Initialisierung jedes Array selbst:

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); 
} 

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

Diese Methode scheint in allen drei Hauptbrowsern um 10-20% schneller zu sein.

enter image description here

7

Sie die Array.prototype.fill Methode verwenden:

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

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

+0

Hinweis fill() wird nicht vollständig unterstützt. – epascarello

+0

Ich denke, das wird auch langsamer sein als der OPs Code, aber es ist vergleichbar. – Paulpro

+1

Anmerkung zu OP: '.fill()' wird noch nicht allgemein unterstützt. Es scheint keine Unterstützung in IE oder iOS7 und keine großartige Unterstützung in Android zu geben. Sie könnten ein Polyfill verwenden, aber erwarten Sie nicht, dass das Polyfill schnell ist. Im Grunde könnte dies Sie in Chrome, Firefox und Edge beschleunigen. – jfriend00

2

Sie können einmal Array aus Nullen erstellen und Kopien erstellen davon:

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

Ihr Code zeigt eine Länge von 10, aber Sie beanspruchen 1000x1000. Ich denke, dass Sie Ihre Messtechnik veröffentlichen müssen, um zu glauben, dass die Array-Füllung 0 ms ist und Ihre Lösung 4 ms gegenüber 1492 ms für die doppelte "for" -Schleife ist. Das scheint mir zu viel Unterschied zu sein, um richtig zu sein. Wenn ja, großartig. Aber ohne weitere Dokumentation ist es etwas schwer zu glauben. – jfriend00

+0

Danke. Die Laufzeiten Ihrer Lösung und @ jfriend00 sind fast gleich. – SaadH

Verwandte Themen