2015-06-23 7 views
16

Der Artikel (Link unten) schlägt vor, dass die Verwendung der length -Eigenschaft für eine Zeichenfolge eine Objektreferenz erstellt, die die Funktion unnötig verlangsamt.Ist lodash _.size() schneller als JS length property?

http://www.webreference.com/programming/javascript/jkm3/2.html

In diesem Zusammenhang was ist der Vorteil von lodash _.size() verwenden? Funktioniert es anders als die (native ...?) Längeneigenschaft?

Wenn Sie ein Array oder Schlüssel in einem Objekt zählen, gibt es einen Vorteil für die Verwendung der Lodash-Größe anstelle der length-Eigenschaft?

+0

Ich war misstrauisch gegenüber der Schlussfolgerung in diesem Artikel, also habe ich versucht, den Benchmark zu reproduzieren, und ich habe kein vergleichbares Ergebnis erhalten; Die Zeiten, die ich bekomme, sind 2,25 und 2,14 Mikrosekunden. Ich vermute, dass der Autor seine Tests vor einiger Zeit ausgeführt hat und eine sehr langsame Maschine, eine sehr veraltete JavaScript-Implementierung oder beides verwendet hat. Das ist nicht etwas, worüber ich mir jetzt Sorgen machen würde. – goldfire

Antwort

15

Aus den lodash Quellen, _.size() wie implementiert:

function size(collection) { 
    var length = collection ? getLength(collection) : 0; 
    return isLength(length) ? length : keys(collection).length; 
} 

Für ein Array, wird die erste Zeile tut indirekt collection.length so dass _.size() ist das Bit, wenn überhaupt, dann langsamer ein wenig (winzige).

In dem Leistungsartikel besteht das Leistungsproblem darin, dass die Eigenschaftssuche von length verwandt wird, wenn eine Nummer auf dem Stapel verwandt worden sein könnte, um dasselbe Ziel zu erreichen. Mit anderen Worten, die Lösung bestand nicht darin, nach einer schnelleren Eigenschaft zu suchen, sondern die Eigenschaft vollständig zu vermeiden, wenn dies möglich wäre.

20

Die Funktion size() ist am nützlichsten in Ketten, wenn Sie die Größe des Ergebnisses benötigen. Es hat keinen Sinn, alles mit value() auszupacken, nur um die Größe zu bekommen. Zum Beispiel:

_(_.range(10)) 
    .filter(function(item) { return item % 2; }) 
    .size(); 

In Bezug auf die längere Form entgegengesetzt:

_(_.range(10)) 
    .filter(function(item) { return item % 2; }) 
    .value() 
    .length; 

Diese Funktion macht es auch einfacher, die Größe eines Objekts zu finden:

_.size({ a: 1, b: 2 }); 

Im Gegensatz zu:

Object.keys({ a: 1, b: 2 }).length; 

size() geht es um die Kürze von Code, nicht um die Leistung.