Warum wurde && in java beim Vergleich von zwei Bools verwendet?

8

Ich habe Code in Guava durchsucht Ссылка und ich sehe viele coole Optimierungen.

Ich habe mich gefragt, ob & amp; über & amp; & amp; ist eine Optimierung und wenn ja, warum? Könnte es eine Stilwahl sein?

Wir quadrieren einen int b im IntMath .checkedPow-Funktion. Wir wollen überprüfen, dass b * b nicht überläuft:

%Vor%

In diesem Beispiel wurde & amp; & amp; verwendet über & amp; & amp;?

Bearbeiten: Matt ist richtig. Ich habe diesen Java-Code in Java 8 kompiliert:

%Vor%

Ich habe den Byte-Code mit Intellij gelesen. Ich sehe, dass wir Verzweigung in der "und" -Funktion verwenden, weil wir IFEQ und GOTO haben.

%Vor%

Um die Frage zu beantworten, & amp; ist schneller, wenn die Kosten für die Auswertung eines zusätzlichen & lt; = schneller sind als die Verzweigung.

Erwins Kommentar ließ mich die tatsächliche While-Schleife genauer betrachten. b * = b ist in einer while-Schleife, die sich oft wiederholen kann. Jedoch kann b in der ersten Schleife nur negativ sein, weil, wenn wir b * = b passieren, b von da an positiv sein wird.

    
Eric Cherin 25.12.2017, 03:34
quelle

1 Antwort

5

Da bedingte Verzweigungen etwas teuer sind, aber der Vergleich der Werte von Ganzzahlen sehr schnell ist, würde der schnellste Weg, diesen Ausdruck in Maschinenbefehlen zu implementieren, beide Unterausdrücke bewerten und würde nicht eine bedingte Verzweigung enthalten .

Wie es in Ihrem Code-Snippet geschrieben ist, zeigt die beste Möglichkeit, es zu implementieren. Wir erwarten normalerweise, dass der Compiler solche Dinge selbst herausfinden wird, aber vielleicht haben sie getestet und festgestellt, dass es nicht ...

ist

Oder vielleicht hat der Entwickler es einfach schneller geschrieben, weil die Alternative wäre, es langsamer zu schreiben - und dafür gibt es sicherlich keinen Grund!

    
Matt Timmermans 25.12.2017, 03:46
quelle

Tags und Links