2010-08-09 20 views
6

Hat jemand Benchmarking getan, oder kann auf einen Artikel zu diesem Thema verlinken? Besonders interessiert an IE-Ergebnissen, da in der Regel JS-Performance kein Problem in anderen Browsern ist.Performance Implikationen der Verwendung von Functional style Javascript vs "prozedurale"

Ich möchte wissen, wie viel langsamer es so etwas wie zu tun ist:

var numbers = [1, 2, 3, 4, 5, 6, 7]; 
var results = numbers.map(function() { 
    // do some stuff 
}); 

anstelle der typischen:

var numbers = [1, 2, 3, 4, 5, 6, 7]; 
var results = []; 

for (var i = 0; i < numbers.length; i++) { 
    var number = numbers[i]; 
    var result; 
    // do some stuff 
    results.push(result); 
} 

ich natürlich den funktionalen Stil bevorzugen, aber ich nehme die extra Overhead des Aufrufs einer Extra-Funktion für jedes Element könnte die Dinge bei großen Sammlungen verlangsamen.

Danke!

+0

Möglicherweise ein strittiger Punkt, aber IE <9 implementiert nicht einmal '[] .map'. Sie patchen "Array.prototype" selbst, oder? –

+2

Joe Armstrong, von Erlang Ruhm, gibt immer den Rat, wenn Fragen wie diese gestellt werden, dass Programmierer die schönsten Programme schreiben sollten, die sie können. Codiere die Art und Weise, wie deine Ideen reflektiert werden sollen - natürlich mit guten und richtigen Grundalgorithmen! - und lassen Sie die Leute, die V8, Tracelemonkey und JScript auffüllen, mit Funktionsaufrufen schneller machen. Machen Sie sich nicht mit Code herum, der in einem Jahr die Dinge sowieso nicht schneller macht. – Pointy

+0

@Crescent yeah Patchen Array.prototype, oder mit etwas wie folgt: http://documentcloud.github.com/underscore/ – adamJLev

Antwort

3

Nicht zufrieden mit dem Mangel an Beweisen zu diesem Thema, schrieb ich einen kurzen Benchmark. Es ist bei weitem nicht perfekt, aber ich denke, es beantwortet die Frage.

Ich lief es in IE 8/win, und während die funktionale Methode langsamer ist, wird es nie der Flaschenhals in echten Code sein. (Es sei denn, Sie tun Dinge, die Sie sollten nicht ohnehin im Client tun)

Also werde ich den Reiniger Ansatz werden, wenn ich wählen muss (yay)

(Best of 5)
funktionale Methode: 453ms
Old school Ansatz: 156ms

Array.prototype.map = function(fun) { 
    var len = this.length >>> 0; 
    if (typeof fun != "function") 
    throw new TypeError(); 

    var res = new Array(len); 
    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) { 
    if (i in this) 
     res[i] = fun.call(thisp, this[i], i, this); 
    } 

    return res; 
}; 

/** 
* 
* 
*/ 

// Initialize test array 
var numbers = []; 
for (var i = 0; i < 100000; i++) numbers.push(i); 

// Benchmark! 
var start = +new Date(); 

// Test 1 
var results1 = numbers.map(function(num) { 
    return num + num; 
}); 

alert('1. Functional map:' + (start - new Date())); 
start = +new Date(); 

// Test 2 
var results2 = []; 
for (var j = 0, l = numbers.length; j < l; j++) { 
    var num = numbers[j]; 
    results2.push(num + num) 
} 

alert('1. Old school approach' + (start - new Date())); 
start = +new Date(); 
+0

Wann immer ich über Mikrooptimierung höre: https://www.youtube.com/watch?v=65-RbBwZQdU&feature=youtu.be – Memke

Verwandte Themen