5 Stimmen

Optimierung der Bedingungen der if-Anweisung

Ich habe eine if-Anweisung mit zwei Bedingungen (getrennt durch einen OR-Operator), eine der Bedingungen deckt +70% der Situationen und nimmt weit weniger Zeit zu verarbeiten/ausführen als die zweite Bedingung, so im Interesse der Geschwindigkeit, die ich nur die zweite Bedingung verarbeitet werden soll, wenn die erste Bedingung zu falsch ausgewertet wird.

Wenn ich die Bedingungen so anordne, dass die erste Bedingung (die schnellere) in der if-Anweisung zuerst erscheint, wird dann in den Fällen, in denen diese Bedingung erfüllt ist und als wahr bewertet wird, die zweite Bedingung überhaupt verarbeitet?

if ( (condition1) | (condition2) ){
  // do this
}

oder müsste ich zwei if-Anweisungen verschachteln, um die zweite Bedingung nur dann zu prüfen, wenn die erste als falsch bewertet wird?

if (condition1){
  // do this
}else if (condition2){
  // do this
}

Ich arbeite in PHP, gehe aber davon aus, dass dies sprachunabhängig sein kann.

2voto

Das Kurzschließen dient nicht der Optimierung. Ihr Hauptzweck besteht darin, den Aufruf von Code zu vermeiden, der nicht funktioniert, aber dennoch einen lesbaren Test ergibt. Beispiel:

if (i < array.size() && array[i]==foo) ...

Beachten Sie, dass array[i] sehr wohl eine Zugriffsverletzung erhalten kann, wenn i außerhalb des Bereichs liegt und das Programm abstürzt. Dieses Programm ist also durchaus auf einen Kurzschluss in der Auswertung angewiesen!

Ich glaube, dass dies der Grund dafür ist, dass ich Ausdrücke viel häufiger auf diese Weise schreibe als Optimierungsfragen.

1voto

Matt Dillard Punkte 14449

Auch wenn die Verwendung von Kurzschlüssen zu Optimierungszwecken oft übertrieben ist, gibt es sicherlich andere zwingende Gründe, sie zu verwenden. Ein solches Beispiel (in C++) ist das folgende:

if( pObj != NULL && *pObj == "username" ) {
    // Do something...
}

Hier wird durch Kurzschluss sichergestellt, dass pObj zugewiesen wurde, bevor es dereferenziert wird. Dies ist weitaus prägnanter als verschachtelte if Erklärungen.

0voto

dagorym Punkte 5395

Da dies als sprachunabhängig gekennzeichnet ist, werde ich mich einmischen. Zumindest für Perl ist die erste Option ausreichend, mit PHP bin ich nicht vertraut. Es wertet von links nach rechts aus und bricht ab, sobald die Bedingung erfüllt ist.

0voto

levand Punkte 8240

In den meisten Sprachen mit einer vernünftigen Optimierung funktioniert Ersteres ganz gut.

0voto

Brian Warshaw Punkte 21916

Le site | ist ein bitweiser Operator in PHP. Er bedeutet nicht $a OR $b genau. Sie werden die Double-Pipe verwenden wollen. Und ja, wie bereits erwähnt, führt PHP eine Kurzschlussauswertung durch. In ähnlicher Weise, wenn die erste Bedingung einer && Klausel zu false ausgewertet wird, wertet PHP auch den Rest der Klausel nicht aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X