wake-up-neo.com

Ist es effizienter, if-return-return oder if-else-return zu verwenden?

Angenommen, ich habe eine if-Anweisung mit einer return. Aus Effizienzsicht sollte ich verwenden

if(A > B):
    return A+1
return A-1

oder

if(A > B):
    return A+1
else:
    return A-1

Soll ich die eine oder andere bevorzugen, wenn Sie eine kompilierte Sprache (C) oder eine Skriptsprache (Python) verwenden?

90
Jorge Leitão

Da die Anweisung return die Ausführung der aktuellen Funktion abbricht, sind die beiden Formen gleichwertig (obwohl die zweite möglicherweise lesbarer ist als die erste).

Die Effizienz beider Formen ist vergleichbar, der zugrunde liegende Maschinencode muss einen Sprung ausführen, wenn die if-Bedingung ohnehin falsch ist.

Beachten Sie, dass Python eine Syntax unterstützt, mit der Sie in Ihrem Fall nur eine return-Anweisung verwenden können:

return A+1 if A > B else A-1
127

Vom Chromium Style Guide:

Verwenden Sie nach der Rückkehr keine anderen Anwendungen:

# Bad
if (foo)
  return 1
else
  return 2

# Good
if (foo)
  return 1
return 2

return 1 if foo else 2
27
skeller88

Bezüglich des Codierungsstils:

Die meisten Codierungsstandards, egal in welcher Sprache, verbieten mehrere Rückgabeanweisungen aus einer einzigen Funktion als schlechte Praxis. 

(Obwohl ich persönlich sagen würde, gibt es mehrere Fälle, in denen mehrere return-Anweisungen sinnvoll sind: Text-/Datenprotokoll-Parser, Funktionen mit umfangreicher Fehlerbehandlung usw.)

Der Konsens aller Industriestandards ist, dass der Ausdruck wie folgt geschrieben werden sollte:

int result;

if(A > B)
{
  result = A+1;
}
else
{
  result = A-1;
}
return result;

In Bezug auf Effizienz:

Das obige Beispiel und die beiden Beispiele in der Frage sind alle in Bezug auf die Effizienz vollständig äquivalent. Der Maschinencode muss in allen diesen Fällen A> B vergleichen, dann zu der A + 1- oder A-1-Berechnung verzweigen und das Ergebnis in einem CPU-Register oder im Stack speichern.

BEARBEITEN:

Quellen:

  • MISRA-C: Regel 14.7 von 2004, die wiederum zitiert ...:
  • IEC 61508-3. Teil 3, Tabelle B.9.
  • IEC 61508-7. C.2.9.
4
Lundin

Bei jedem vernünftigen Compiler sollten Sie keinen Unterschied feststellen; Sie sollten zu identischem Maschinencode kompiliert werden, da sie gleichwertig sind.

3

Version A ist einfacher und deshalb würde ich es verwenden.

Wenn Sie alle Compiler-Warnungen in Java aktivieren, erhalten Sie in der zweiten Version eine Warnung, da diese unnötig ist und die Komplexität des Codes erhöht.

1
juergen d

Ich persönlich vermeide wenn möglich else-Blöcke. Siehe die Anti-if-Kampagne

Sie berechnen auch nicht "extra" für die Leitung, wissen Sie: p 

"Einfach ist besser als komplex" & "Lesbarkeit ist König"

delta = 1 if (A > B) else -1
return A + delta
0
percebus

Ich weiß, dass die Frage mit Python markiert ist, aber es erwähnt dynamische Sprachen. Ich dachte, ich sollte erwähnen, dass die if -Anweisung in Ruby tatsächlich einen Rückgabetyp hat, damit Sie so etwas tun können

def foo
  rv = if (A > B)
         A+1
       else
         A-1
       end
  return rv 
end

Oder weil es auch implizite Renditen hat 

def foo 
  if (A>B)
    A+1
  else 
    A-1
  end
end

was um die Stilfrage herumgeht, dass nicht mehrere Renditen ganz nett sind.

0
Jamie Cook

Stellen Sie es sich so vor:

if (a > b):
    output = a + 1

output = a - 1

return output

Versus this:

if (a > b):
    output = a + 1
else:
    output = a - 1

return output

Das erste Beispiel ist nicht funktionsfähig, während das zweite gut funktioniert. Sie haben die gleiche Leistung, daher empfehle ich Ihnen, Beispiel 2 zu verwenden, da es meiner Meinung nach einfacher ist, es zu lesen.

0
Juniorized