Verwendung von Objektliteral anstelle von switch-Anweisung

8

Es gibt viele Diskussionen und Kommentare zu Best Practices in switch und if / else Statements. Ich habe Leute gesehen, die sagten, dass wir alle Objektliterale anstelle von switch verwenden sollten, wenn es möglich ist.

Also habe ich diesen Fall reproduziert und Ich habe einen kleinen und einfachen Test zwischen einem Schalter gemacht:

> %Vor%

und Übergabe durch ein Objektliteral:

%Vor%

Nach dem Ausführen dieses Tests ist es offensichtlich, dass die switch-Anweisung schneller ist als der getestete Wert in einem Objektliteral aufzurufen .

Ist mein Test falsch? Was sollte ich beachten, bevor ich in diesem Fall die eine oder andere Methode einsetze? Oder vielleicht eigensinnige Kommentare, die ich zu diesem Thema gesehen habe, sind einfach falsch und ich sollte nicht versuchen, die Grundlagen zu umgehen ...

    
rayfranco 14.11.2012, 17:16
quelle

2 Antworten

14

Sie werden wahrscheinlich Auswirkungen von Skalierung sehen: Eine switch-Anweisung ist O(n) , während eine Hash-Tabellensuche (vermutlich verwendet, um Methoden in Objektliteralen zu finden) ist (amortisiert) O(1) . Aber Big-O-Messungen beschreiben nur genau, wie die Leistung über sehr große Eingaben skaliert. In Ihrem Test ist es nicht überraschend, dass fünf if -Anweisungen schneller sind als eine Hash-Tabelle.

Also im Grunde: Wie viele Schlüssel werden Sie haben? Wenn Sie nur fünf Schlüssel haben, werden Sie durchschnittlich 2,5 pro Suche treffen, was Sie als schneller als bewiesen haben eine einzelne Hash-Tabellennachschlage Aber was ist, wenn du 500 hast? Das sind durchschnittlich 250 if -Aussagen - immer noch im Vergleich zu einer einzelnen Hash-Suche. Der Ansatz der Hash-Tabelle (objektliteral) ist an diesem Punkt fast sicher besser.

Aber die ultimative Antwort? Jeder hasst es, dies zu hören, aber es ist der einzige maßgebliche Weg: Mach den Benchmark mit deinem tatsächlichen Produktionscode. Es ist ein Schmerz, aber dann weißt du es genau.

Hoffe das hilft!

PS: Hier werden alle Überlegungen zur Codierungsstil-Präferenz weggelassen, aber ich möchte wirklich nicht darauf eingehen ...

    
Xavier Holt 14.11.2012, 17:29
quelle
2

Nun, ich habe Ihren Code geändert ( hier ), damit Sie sehen können, wann der Objektbegriff besser ist.

Genau wie Xavier es beschrieben hat, aber es musste nicht auf ungefähr 500 gehen. Ungefähr 40 Fälle enthüllten den Schalter ..

Neben der Größe der Liste ist noch zu beachten, dass die Suche nach einem Integral im Objektbegriff keinen Vorteil bringt, während der Schalter dieses Bit optimieren kann.

    
loxxy 14.11.2012 17:46
quelle