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.

9voto

Mats Fredriksson Punkte 19007

Für C, C++, C#, Java und andere .NET-Sprachen werden boolesche Ausdrücke so optimiert, dass nichts weiter ausgewertet wird, sobald genug bekannt ist.

Ein alter Trick, um verschleierten Code zu erstellen, war die Verwendung dieser Methode, um if-Anweisungen zu erstellen, wie zum Beispiel:

a || b();

wenn "a" wahr ist, würde "b()" nie ausgewertet werden, also können wir es umschreiben in:

if(!a)
    b();

und ähnliches:

a && b();

werden würde

if(a)
    b();

Bitte beachten Sie dass dies nur für die Operatoren || und && gültig ist. Die beiden Operatoren | und & sind bitweise oder bzw. und und werden daher nicht "optimiert".

EDIT: Wie bereits von anderen erwähnt, ist der Versuch, Code mit Hilfe von Kurzschlusslogik zu optimieren, nur selten gut investierte Zeit.

Entscheiden Sie sich zunächst für Klarheit, weil sie leichter zu lesen und zu verstehen ist. Wenn Sie versuchen, zu clever zu sein, könnte eine einfache Umordnung der Begriffe zu einem völlig anderen Verhalten führen, ohne dass ein Grund ersichtlich wäre.

Zweitens sollten Sie sich für die Optimierung entscheiden, aber erst nach der Zeitmessung und der Erstellung von Profilen. Viel zu viele Entwickler optimieren vorschnell ohne Profiling. Die meiste Zeit ist das völlig nutzlos.

3voto

NotMe Punkte 86089

So gut wie jede Sprache führt eine Kurzschlussbewertung durch. Das bedeutet, dass die zweite Bedingung nur dann ausgewertet wird, wenn dies unbedingt erforderlich ist. Damit dies funktioniert, verwenden die meisten Sprachen die doppelte Pipe, ||, nicht die einfache, |.

Ver http://en.wikipedia.org/wiki/Short-circuit_evaluation

3voto

Anders Sandvig Punkte 20204

In C, C++ und Java wird die Anweisung:

if (condition1 | condition2) {
  ...
}

wertet jedes Mal beide Bedingungen aus und ist nur wahr, wenn der gesamte Ausdruck wahr ist.

Die Erklärung:

if (condition1 || condition2) {
  ...
}

wird bewertet condition2 nur wenn condition1 falsch ist. Der Unterschied ist signifikant, wenn condition2 eine Funktion oder ein anderer Ausdruck mit einem Nebeneffekt ist.

Es besteht jedoch kein Unterschied zwischen dem || Fall und der if / else Fall.

2voto

Michael Haren Punkte 101002

Ich habe in letzter Zeit viele Fragen dieser Art gesehen - Optimierung bis zum n-ten Grad.

Ich denke, dass dies unter bestimmten Umständen sinnvoll ist:

  1. Die Berechnung der Bedingung 2 erfolgt nicht in konstanter Zeit.
  2. Sie fragen ausschließlich zu Bildungszwecken - Sie wollen wissen, wie die Sprache funktioniert, nicht um 3us zu sparen.

In anderen Fällen ist es unsinnig, sich Gedanken über den "schnellsten" Weg zur Iteration oder Prüfung einer Bedingung zu machen. Anstatt Tests zu schreiben, die Millionen von Durchläufen erfordern, um einen feststellbaren (aber unbedeutenden) Unterschied zu sehen, sollten Sie sich auf die Klarheit konzentrieren.

Wenn in einem Monat oder in einem Jahr jemand anderes (das könnten Sie sein!) diesen Code übernimmt, wird es vor allem auf Klarheit ankommen.

In diesem Fall ist Ihr erstes Beispiel kürzer, klarer und Sie müssen sich nicht wiederholen.

2voto

Farinha Punkte 16906

Nach Angaben von dieser Artikel PHP führt eine Kurzschlussauswertung durch, d.h. wenn die erste Bedingung erfüllt ist, wird die zweite gar nicht ausgewertet. Es ist auch recht einfach zu testen (aus dem Artikel):

<?php
/* ch06ex07 – shows no output because of short circuit evaluation */

if (true || $intVal = 5) // short circuits after true
{

echo $intVal; // will be empty because the assignment never took place
}

?>

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