Ist die Kurzschlussauswertung wirklich schnell? Unterschied zwischen && und & in Java

Was ist Kurzschlussauswertung?

Wenn Sie ein wenig Java lernen, werden Sie etwas finden, das als "Kurzschlussbewertung" bezeichnet wird. das ist&&Oder||In einem logischen Operator, beispielsweise wenn die linke Seite ausgewertet wird, wird der Boolesche Wert des gesamten Ausdrucks bestimmt, und wenn die rechte Seite nicht ausgewertet werden muss, wird die rechte Seite nicht ausgewertet. Siehe folgendes Beispiel.

boolean flag1 = false;
boolean flag2 = false;
if(flag1 && flag2){
    System.out.println("Beide Variablen sind wahr.");
}

In diesem Programm müssen Flag1 und Flag2 beide wahr sein, damit der bedingte Zweig in der dritten Zeile innerhalb des Blocks in mittleren Klammern ausgeführt wird. Dieses Mal ist flag1 falsch, sodass Sie sehen können, dass Sie nicht in den Block der mittleren Klammer gehen müssen, ohne den booleschen Wert von flag2 zu überprüfen. In einer solchen Situation ist die Kurzschlussauswertung eine Funktion, die verhindert, dass die Auswertung von Flag2 automatisch durchgeführt wird.

Unterschied zwischen && und &

Java hat zwei ähnliche Operatoren, && und &. Die beiden Operatoren haben fast die gleiche Funktionalität, jedoch mit einigen Unterschieden. Wie bereits erwähnt, arbeitet der Bediener && als Kurzschlussauswertungsfunktion. Die Kurzschlussauswertung funktioniert jedoch nicht für &. Das heißt, & bewertet den Wert auf der rechten Seite auch in Situationen, in denen es nicht erforderlich ist, den Wert auf der rechten Seite zu bewerten.

Ist die Kurzschlussauswertung wirklich schnell?

Java-Nachschlagewerke und Websites sagen, dass && schneller ist, weil es keine zusätzliche Bewertung durchführt. Als ich diese Beschreibung las, fragte ich mich. "Da es sich um einen anderen Prozess handelt, ist es wirklich schneller, den Prozess nur auf der rechten Seite zu bestehen?" Also habe ich tatsächlich versucht, den Unterschied in der Verarbeitungsgeschwindigkeit zwischen && und & zu überprüfen.

Überprüfungsprogramm

Programm zur Bewertung des Kurzschlusses

Test1


long start = System.currentTimeMillis();
boolean flag1 = false;
boolean flag2 = false;

for(long i=0; i<10000000000l; i++) {
    if(flag1 && flag2) {
        System.out.print("");
    }
}

long end = System.currentTimeMillis();
System.out.println("Ausführungszeit" + (end - start)  + "ms");

&& wird im bedingten Ausdruck der if-Anweisung verwendet.

Programm, das keine Kurzschlussauswertung durchführt

Test2


long start = System.currentTimeMillis();
boolean flag1 = false;
boolean flag2 = false;

for(long i=0; i<10000000000l; i++) {
    if(flag1 & flag2) {
        System.out.println("");
    }
}

long end = System.currentTimeMillis();
System.out.println("Ausführungszeit" + (end - start)  + "ms");

& Wird im bedingten Ausdruck für if verwendet.

Prüfergebnis

Ich habe die beiden oben genannten Programmtypen ausgeführt und Statistiken zur Ausführungszeit jedes Programms erstellt. Die folgende Tabelle zeigt die Ergebnisse.

Programmausführungszeit (Einheit: ms)
Mit Kurzschlussauswertung(&&) Keine Kurzschlussauswertung(&)
1. Mal 3546 3500
Zweites Mal 3556 3595
3. Mal 3586 3565
4. Mal 3574 3564
5. Mal 3552 3636
6. Mal 3570 3620
7. Mal 3512 3568
8. Mal 3563 3597
9. Mal 3560 3565
10. Mal 3555 3500
durchschnittlich 3557.6 3571.0

Soweit der Durchschnitt in der Tabelle ersichtlich ist, wird angenommen, dass die Verarbeitungsgeschwindigkeit schneller ist, wenn die Kurzschlussbewertung durchgeführt wird. In diesem Experiment war jedoch die Anzahl der Abtastwerte gering und der Unterschied in der Ausführungszeit zwischen mit und ohne Kurzschlussbewertung gering, so dass die Verarbeitung unter Verwendung von && mit Kurzschlussbewertung schneller ist als mit & ohne Kurzschlussbewertung. Die Gründe sind etwas schwach zu schließen.

Zusammenfassung

In dem Experiment, das ich dieses Mal durchgeführt habe, habe ich das Ergebnis erhalten, dass die Verarbeitung bei Verwendung der Kurzschlussbewertung schneller ist. Derzeit ist es besser, && zu verwenden, wenn das logische Produkt mehrerer boolescher Werte in Java verwendet wird. In anderen Sprachen wie C hat & möglicherweise eine völlig andere Funktion, beide Seiten als Binärzahlen zu verwenden und das logische Produkt für jede Ziffer zu verwenden, sodass beim Wechseln der Sprache Fehler auftreten können. Es wird empfohlen, && zu verwenden, wenn Sie mit & und && in Java das gleiche Ergebnis erzielen können, um zu verhindern, dass es zunimmt.

Recommended Posts

Ist die Kurzschlussauswertung wirklich schnell? Unterschied zwischen && und & in Java
Unterschied zwischen int und Integer in Java
Unterschied zwischen next () und nextLine () in Java Scanner
[Java] Unterschied zwischen == und gleich
[Java] Unterschied zwischen statischem final und final in Mitgliedsvariablen
[JAVA] Was ist der Unterschied zwischen Schnittstelle und Zusammenfassung? ?? ??
[Java] Unterschied zwischen gleich und == in einer Zeichenfolge, die ein Referenztyp ist
[Java] Unterschied zwischen Hashmap und HashTable
[Java] Unterschied zwischen Array und ArrayList
[Java] Unterschied zwischen Closeable und AutoCloseable
[Java] Unterschied zwischen StringBuffer und StringBuilder
[Java] Unterschied zwischen Länge, Länge () und Größe ()
[Java] Was ist der Unterschied zwischen Form, Entität und dto? [Bohne]
Unterschied zwischen pop () und peek () im Stapel
[Für Anfänger] Unterschied zwischen Java und Kotlin
Unterschied zwischen getText () und getAttribute () von Selen
Unterschied zwischen "|| =" und "instance_variable_defined?" Im Ruby-Memo
Unterschied zwischen Arrylist und verknüpfter Liste in Java
Unterschied zwischen EMPTY_ELEMENTDATA und DEFAULTCAPACITY_EMPTY_ELEMENTDATA in ArrayList
[Java] Unterschied zwischen Intstream-Bereich und rangeClosed
Verstehen Sie den Unterschied zwischen int und Integer und BigInteger in Java und float und double
[Java] Verstehe den Unterschied zwischen List und Set
Was ist der Unterschied zwischen SimpleDateFormat und DateTimeFormatter? ??
Unterscheiden Sie in Java zwischen positiven und negativen Zahlen
[Java] Unterschied zwischen "endgültiger Variable" und "unveränderlichem Objekt"
Unterschied zwischen vh und%
Unterschied zwischen i ++ und ++ i
Was ist der Unterschied zwischen Systemspezifikation und Funktionsspezifikation?
Unterschiede zwischen Klassen und Instanzen in Ruby
Unterschied zwischen neu und in Rais Action Controller erstellen
[Rails] Was ist der Unterschied zwischen Redirect und Rendering?
Was ist der Unterschied zwischen Überspringen und Ausstehend? [RSpec]
[Java-Anfänger] Unterschied zwischen Länge und Länge () ~ Ich weiß nicht ~
Was ist der Unterschied zwischen den Verantwortlichkeiten der Domänenschicht und der Anwendungsschicht in der Zwiebelarchitektur [DDD]?
Unterschied zwischen Produkt und Variante
Unterschied zwischen redirect_to und render
[Rails] Was ist der Unterschied zwischen Bundle-Installation und Bundle-Update?
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
Unterschied zwischen redirect_to und render
Unterschied zwischen CUI und GUI
Unterschied zwischen Variablen und Instanzvariablen
Unterschied zwischen Mockito-Core und Mockito-All
Unterschied zwischen Element 0, Null und leerem Zeichen (Check-in-Liste)
[Java] Unterschied zwischen der Zuweisung der Basistypvariablen und der Zuordnung der Referenztypvariablen
Unterschied zwischen Klasse und Instanz
Unterschied zwischen Bundle und Bundle-Installation
Was ist der Unterschied zwischen einer Aktion und einer Instanzmethode?
[Java] Überprüfen Sie den Unterschied zwischen orElse und orElseGet mit IntStream
Unterschied zwischen ArrayList und LinkedList
Unterschied zwischen render und redirect_to
StringUtils.isNotBlank eignet sich für Leerurteile und Nullurteile in Java
Denken Sie über die Unterschiede zwischen Funktionen und Methoden nach (in Java)
Unterschied zwischen List und ArrayList
Java Generics T und? Unterschied
Jetzt im dritten Jahr ist das Missverständnis, das ich bemerkt habe, der Unterschied zwischen der Gleichheitsmethode und ==
Unterschiede im Umgang mit Zeichenfolgen zwischen Java und Perl