Leistung der OR-Operation (||) vs inArray ()

7

Angenommen, Sie möchten überprüfen, welche Eingabezeichenfolge ein Benutzer in ein Formularfeld eingegeben hat. Welches wäre die schnellste Möglichkeit, diese Eingabe anhand einer Liste möglicher Werte zu überprüfen?

Die folgenden Beispiele verwenden jQuery .

Erste Methode: mit ||

%Vor%

Zweite Methode: Verwenden von inArray()

%Vor%

Gibt es signifikante Unterschiede zwischen diesen beiden Methoden?

    
user1301428 07.05.2012, 08:38
quelle

4 Antworten

17

Sie wollen nicht die schnellste, aber die lesbarste Methode. Und das ist in_array() (JavaScript: array.indexOf(value) >= 0 ) für mehr als 2 oder 3 Werte.

Der Leistungsunterschied ist vernachlässigbar - während eine Funktionsaufruf- und Array-Erstellung sicherlich einen gewissen Mehraufwand hat, spielt es keine Rolle im Vergleich zu teuren Vorgängen wie Dateizugriff, Datenbankzugriff, Netzwerkzugriff usw. Am Ende wird das niemand tun bemerke den Unterschied.

Hier ist ein kurzer Benchmark mit jeweils 1 Million Iterationen:

%Vor%

Also, der schnellste, aber immer noch sehr lesbare Weg ist dies. Wenn Sie $arr nicht nur einmal erstellen und viele Mal verwenden, brauchen Sie das nicht und Sie können einfach bei in_array() bleiben.

%Vor%

Falls Sie nach JavaScript gefragt haben (in diesem Fall diese $ Präfixe loswerden! ), verwenden Sie Array.indexOf() :

%Vor%

Allerdings unterstützen nicht alle Browser bereits Array.indexOf() , daher sollten Sie z. die Funktion von Underscore.js :

%Vor%

jQuery hat auch eine Funktion dafür:

%Vor%

Der schnellste Weg wäre mit einem Objekt und dem Operator in , aber die Objektdefinition ist weniger lesbar als die Array-Definition:

%Vor%

Hier ist ein JSPerf-Benchmark für die verschiedenen Lösungen: Ссылка - aber wiederum ist der ziemlich große Leistungsunterschied in den meisten vernachlässigbar Fälle, da Sie den Code nicht Millionen Male in einer Schleife ausführen werden.

    
ThiefMaster 07.05.2012, 08:42
quelle
4

Die Antwort ist, es kommt darauf an ...

Wenn es nur ein paar Möglichkeiten gibt, verwenden Sie if (a || b || c) .

Wenn es bis zu 10 geben kann, verwenden Sie Array.indexOf()

Beachten Sie, dass die Auswahl für die beiden obigen Empfehlungen von Lesbarkeit und nicht wirklich von der Leistung abhängen sollte.

Wenn (viele) mehr als das sind, verwenden Sie Object mit den Schlüsseln gleich den Werten, dann können Sie if (myVar in myKeyObj) verwenden. Dies sollte im schlimmsten Fall O(log n) Leistung ergeben.

    
Alnitak 07.05.2012 08:42
quelle
2

Leistung ist in der Regel nicht viel von einem Problem, wenn Sie Javascript, und in der Regel sind schwierige Fragen zu beantworten.

In diesem Beispiel ist der Hauptunterschied zwischen Lösungen die Skalierung. Die erste Lösung wird immer eine vorbestimmte Anzahl von Vergleichen durchführen, die inArray-Lösung wird schlechter skaliert, da sie mehr vergleicht, wenn mehr Werte vorhanden sind.

Aber ich würde immer noch mit inArray gehen, 99,99% Zufallsperformance spielt wirklich keine Rolle. Sie möchten Ihren Code wartbar halten, das ist wichtiger.

    
TJHeuvel 07.05.2012 08:42
quelle
2

In den meisten Sprachen ist inArray () wie folgt implementiert:

%Vor%

Wenn Sie diese Schleife ausrollen würden, würden Sie am Ende

tun %Vor%

, das zu

verdichtet werden könnte %Vor%

ohne zu ändern, was unter der Haube geschieht.

Wenn Sie solche Sachen wiederholt nachschlagen müssen, empfehle ich Ihnen, Karten kennenzulernen. statt

%Vor%

Sie tun

%Vor%

Je mehr Elemente überprüft werden müssen, desto besser funktioniert die Karte im Vergleich zum Array.

    
rodneyrehm 07.05.2012 08:55
quelle

Tags und Links