if
In Java gibt es zwei Arten von Anweisungen: classic: if {} else {}
und shorthand : exp ? value1 : value2
. Ist einer schneller als der andere oder sind sie gleich?
Aussage:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
ternärer Operator:
int x = (expression) ? 1 : 2;
if
ist zur Verwendung in Anweisungen.?
ist zur Verwendung in Ausdrücken.Antworten:
Es gibt dort nur eine Art von "if" -Anweisung. Der andere ist ein bedingter Ausdruck. Was die bessere Leistung betrifft: Sie könnten mit demselben Bytecode kompiliert werden, und ich würde erwarten, dass sie sich identisch verhalten - oder so nah, dass Sie in Bezug auf die Leistung definitiv nicht übereinander wählen möchten.
Manchmal ist eine
if
Anweisung besser lesbar, manchmal ist der bedingte Operator besser lesbar. Insbesondere würde ich mit dem Bedingungsoperator empfehlen , wenn die beiden Operanden sind einfache und nebenwirkungsfrei, während , wenn der Hauptzweck der beiden Zweige sind ihre Nebenwirkungen, ich wahrscheinlich eine verwenden würdeif
Aussage.Hier ist ein Beispielprogramm und ein Bytecode:
Bytecode dekompiliert mit
javap -c Test
:Wie Sie sehen können, gibt es hier einen kleinen Unterschied im Bytecode - ob der
istore_1
innerhalb der Brance auftritt oder nicht (im Gegensatz zu meinem vorherigen äußerst fehlerhaften Versuch :), aber ich wäre sehr überrascht, wenn der JITter einen anderen nativen Code hätte.quelle
main
undmain2
genau gleich sein?Ihre beiden Beispiele werden wahrscheinlich zu identischem oder nahezu identischem Bytecode kompiliert, sodass es keinen Unterschied in der Leistung geben sollte.
Hätte es einen Unterschied in der Ausführungsgeschwindigkeit gegeben, sollten Sie immer noch die idiomatischste Version verwenden (die zweite zum Zuweisen einer einzelnen Variablen basierend auf einer einfachen Bedingung und zwei einfachen Unterausdrücken und die erste zum Ausführen komplexerer Operationen oder Operationen, die nicht in eine einzelne Zeile passen).
quelle
Das sind die gleichen. Beide sind ziemlich schnell, typischerweise um 10-30 Nano-Sekunden. (abhängig vom Nutzungsmuster) Ist dieser Zeitrahmen für Sie wichtig?
Sie sollten das tun, was Sie für am klarsten halten.
quelle
Nur um alle anderen Antworten zu ergänzen:
Der zweite Ausdruck wird oft als tertiärer / ternärer Operator / Anweisung bezeichnet. Dies kann sehr nützlich sein, da es einen Ausdruck zurückgibt. Manchmal wird der Code für typische kurze Anweisungen klarer.
quelle
final
Feldes können Sie Konstruktorblöcke verwenden, um einen Wert festzulegen (obwohl der bedingte Operator IMO milliardenfach besser aussieht), und mit lokalen Variablen können Sie einen Wert zuweisen, bevor Sie ihn später im Codeblock verwenden Ich denke, der einzige Fall, in dem ein Ternär einen Vorteil gegenüber dem Vorteil einesif-else
Aufrufssuper(...)
oderthis(...)
eines Konstruktors bietet .auch nicht - sie werden gleich kompiliert.
quelle
Der ternäre Operator ist schneller als die if-else-Bedingung.
Testergebnisse:
Spur 1:
Zeit für if-else: 63
Zeit für ternäre: 31
Trail-2:
Zeit für if-else: 78
Zeit für ternäre: 47
Trail-3:
Zeit für if-else: 94
Zeit für ternäre: 31
Trail-4:
Zeit für if-else: 78
Zeit für ternäre: 47
quelle