Frage

Ich arbeite an einem Projekt, das einige ziemlich komplizierte JavaScript-Verarbeitung erfordert. Dazu gehören viele verschachtelte if-elses in ganz wenigen Orten. Ich habe im Allgemeinen gesorgt JavaScript-Code so weit wie möglich zu optimieren, indem die anderen Spitzen auf Stack-Überlauf zu lesen, aber ich frage mich, wenn die folgenden zwei Konstrukte einen Unterschied in Bezug auf die Geschwindigkeit allein machen würde:

if(some_condition) {
    // process
    return ;
}

// Continue the else condition here

vs

if(some_condition) {
    // Process
}

else {
   // The 'else' condition...
}
War es hilfreich?

Lösung

ich immer mit der ersten Methode. Leichter zu lesen und weniger Vertiefung. Soweit die Ausführungsgeschwindigkeit, dies über die Umsetzung abhängen, aber ich würde erwarten, dass sie beide identisch sind.

Andere Tipps

In vielen Sprachen ist eine gängige Praxis href="https://stackoverflow.com/questions/268132/invert-if-statement-to-reduce-nesting"> Invertzucker if Aussagen zum oder Verwendung Voraussetzungen .

Und in Ihrem Code weniger Verschachtelung mit verbessert die Lesbarkeit des Codes und Wartbarkeit.

"Profil, spekuliert nicht!"

  1. Sie den Wagen vor das Pferd (Wartbarkeit durch den Menschen übertrumpft Maschinengeschwindigkeit)
  2. Sie sollten durch Ihre Optimierungsbemühungen fahren Messungen , was bedeutet,

    • Sie sollten die Ausführungszeit selbst; es wird offensichtlich in verschiedenen Browsern und Versionen unterscheiden
    • Sie sollten nur für Geschwindigkeit optimieren der Hotspots Ihre Anwendung
    • (Punkt 1 sehen)

Es gibt keinen Unterschied in der Leistung sein, die ich das zweite Beispiel für Wartbarkeit empfehlen würde. Im Allgemeinen ist es empfehlenswert, ein und nur ein möglicher Ausgangspunkt für eine Routine zu haben. Es hilft dem Debuggen und Verständnis.

Ich werde den ersten Ansatz verwenden, wenn die ungültigen Situationen auszuschließen.

Eg. verwenden ersten Ansatz, wenn einige Validierungen tun, und zurück, wenn die Überprüfung fehlschlägt. Es hat keinen Sinn weiter zu gehen, wenn eine der Voraussetzungen scheitern. Dasselbe wird von Martin Fowler in seinem Refactoring Buch erwähnt. Er nennt es „die Bedingungen mit Schutz Klauseln austauschen“. Und es kann wirklich den Code leicht verständlich machen.

Hier ist ein Java-Beispiel.

  public void debitAccount(Account account, BigDecimal amount) {
    if(account.user == getCurrentUser()) {
      if(account.balance > amount) {
           account.balance = account.balance - amount
       } else {
          //return or throw exception
       }
    } else {
        //return or throw exception
    }
  }

VS

 public void debitAccount(Account account, BigDecimal amount) {
    if(account.user != getCurrentUser()) return //or error
    if(account.balance < amount) return //or error
    account.balance = account.balance - amount    
}

Vielleicht ein wenig, aber ich glaube nicht, es messbar sein wird, es sei denn, der Rest der Funktion „schweren“ beinhaltet (und sonst überflüssig, da ich davon aus, dass eine Rückkehr gleichen Ergebnis führen würde) js Anrufe.

Als Randbemerkung, ich denke, die unnötige Mikro-Optimierung ist, und Sie sollten wahrscheinlich an andere Stelle für Leistungsverbesserungen, also das Profil des Skripts durch Chrome-Entwicklertools oder Firebug für Firefox aussehen (oder ähnliche Werkzeuge) und suchen langsam / langen Lauf Anrufe / Funktionen.

Während es auf der JavaScript-Implementierung des laufenden Browser hängt es keinen nennenswerten Unterschied zwischen ihnen sein sollte (in Bezug auf die Geschwindigkeit).

Die zweite Form ist vorzuziehen, da die Strömung zu brechen keine gute Programmier Gewohnheit ist. Denken Sie auch an, dass bei der Montage, der Sprungbefehl (Mikro-Betrieb) immer unabhängig von der Auswertung ausgewertet wird.

Testen Sie selbst. Wenn dies JavaScript im Browser ausgeführt wird, wird es mit ziemlicher Sicherheit hängt von dem JavaScript Parsing-Engine des Browsers.

Mein Verständnis ist, das würde keinen Unterschied machen, weil Sie mit der if-Bedingung verzweigen. Also, wenn some_condition wahr ist, wird der andere Teil nicht berührt werden, auch ohne die Rückkehr.

Angenommen, die return 1ms im Vergleich zu dem verschachtelten if nimmt unter 0,1 ms (oder umgekehrt).

Es ist schwer, entweder ein, sich vorzustellen, fast so langsam zu sein.

Nun, tun Sie es mehr als 100-mal pro Sekunde?

Wenn ja, vielleicht sollten Sie sich interessieren.

Wenn es nur eine einzige if..else die Leistung ist fast die gleiche und es keine Rolle spielt. Verwenden Sie, was in Ihrem Fall am besten lesbar ist. Aber kommen zu verschachtelten Anweisungen return mit der performanten im Vergleich zu if...else und case switch

von meinen Erfahrungen sprechen hängt es von der Bedingung Sie überprüfen.

  1. if .. return ist fein und leicht zu lesen, wenn Sie einigen boolean Zustand überprüfen (vielleicht Einstellung), dass der ganze folgende Code überflüssig machen würde überhaupt ausgeführt werden.

  2. if .. else ist viel einfacher zu lesen, wenn Sie einige Wert erwarten eine von zwei (oder mehr) möglich, Werte zu sein, und Sie wollen für beide Fälle unterschiedlichen Code auszuführen. Bedeutung die beiden möglichen Werte Bedingungen gleich interpretierbare Wert darstellen und sollten daher auf dem gleichen logischen Ebene geschrieben werden.

Meiner Meinung nach, Rückkehr und andere ist gleich für den obigen Fall aber im Allgemeinen if-else und if()return; sind sehr unterschiedlich. Sie können return-Anweisung verwenden, wenn Sie von dem gegenwärtigen Umfang zu übergeordnetem Bereich verschieben mögen, während bei if-else Sie weiter im gleichen Umfang if-else überprüfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top