While-Schleife schneller, solange die Abbruchbedingung nicht vom Schleifeninneren abhängt

mariane

Mitglied
Hallo,

eher durch Zufall bin auf folgendes Phänomen gestoßen, kann es mir nicht so recht erklären und möchte fragen, ob bekannt und was die Hintergründe sind / sein können ...

testA führt für den Wertebereich von Integer im Schnitt 5 Schleifendurchgänge aus und benötigt ca. 10000ms (auf meinem Rechner)

testB sieht zunächst etwas konfus aus, ist aber funktional mit testA identisch und demonstriert das Phänomen. Obgleich nun konstant 32 Schleifendurchgänge benötigt werden, werden nur 10ms benötigt, also Faktor 1000.

Wird testB "optimiert" (es geht nur um die Reduzierung der Schleifendurchgänge), indem im Else-Zweig die Dummy-Anweisung (++k,--k) durch ein return k ersetzt wird, erhöht sich die Laufzeit schlagartig auf ca. 15000ms, obgleich testB vom strukturellen Aufbau unverändert bleibt und nun wie testA im Schnitt nur noch 5 Schleifendurchgängen benötigt. Alternativ könnte man auch die While-Bedingung i++<32 durch n != 0 ersetzen, es hätte die selbe Auswirkung.

Wie kann das sein? Offenbar ist eine While-Schleife schneller, solange die Abbruchbedingung nicht vom Schleifeninneren abhängt.

Beste Grüße, mariane

Java:
public static int testA(int n)
{
    int k = 0;
    while( n != 0 ) {
        k++;
        n &= n << 1;
    }
    return k;
}
Java:
public static int testB(int n)
{
    int k = 0, i = 0;
    while( i++ < 32 ) {
        if( n != 0 ) {
            ++k;
        }
        else {
            // return k;
            ++k;
            --k;
        }
        n &= n << 1;
    }
    return k;
}
Java:
long start = System.currentTimeMillis();
for( int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++ ) {
    testA(i);
    // testB(i);
}
System.out.println((System.currentTimeMillis() - start));
 
Zuletzt bearbeitet:

Flown

Administrator
Mitarbeiter
Also bei mir läuft das ganze - mit JMH gebenchmarkt - so wie es soll:
testA - ca. 2,2 ns/op
testB - ca. 24,8 ns/op

Wenn das im Schnitt ~4 Durchläufe hat, dann müssen bei testB (32/4 = 8) ~8 mal soviele Operationen ausgeführt werden, bis die Schleife terminiert und das läuft so wie erwartet.
~4 Schleifendurchläufe laufen natürlich schneller als 32.

Bei solchen Benchmarks immer benchmark harness verwenden, sonst hast du eben JVM Optimierungen, GC, etc. mitgemessen.
 

JCODA

Top Contributor
Das ist sehr typisch. Java benutzt einen JustInTime (JIT)-Compiler und dieser optimiert sehr viel. Unter anderem kann er bei der zweiten Variante die Schleife wegoptimieren und einfach den Schleifencode 32 mal hintereinander ausführen (Loop unrolling). Zudem gibt es etliche Faktoren, die hier mit rein spielen, zum Beispiel, da die Bedingung unabhängig vom Code ist, lässt sie sich parallel zum Schleifencode testen, in zweiteren Fall muss dies sequenziell passieren. Außerdem werden solche k++;k--; auch sehr schnell wegoptimiert.

Zudem sind solche "Microbenchmarks" sehr fehleranfällig, weil dadurch viele Vorteile des JIT nicht genutzt werden. (Manchmal müssen Anweisungen sehr oft ausgeführt werden, damit der JIT die Notwendigkeit sieht, zu optimieren.) Es gibt gewisse Frameworks, die solche Benchmarks ermöglichen.

Gerne lasse ich mich verbessern, falls das was ich geschrieben habe nicht 100% korrekt ist, aber ganz falsch ist es nicht. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
D While-Schleife - if Zweig unterbrechen Allgemeine Java-Themen 1
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
J While Schleife ausführen bis Zahl = X Allgemeine Java-Themen 19
N Frage zur while-Schleife Allgemeine Java-Themen 18
G while Schleife ausführen solange eine Taste gedrückt ist Allgemeine Java-Themen 14
S for-Schleife, while-Schleife Problem Allgemeine Java-Themen 6
R while schleife auf 3 durchgänge beschränken Allgemeine Java-Themen 6
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
S Do-While Schleife bricht nicht ab Allgemeine Java-Themen 3
S Erste Schritte if-Anweisung in for- oder while-schleife umwandeln Allgemeine Java-Themen 3
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
J Thread pausieren, lange while-Schleife Allgemeine Java-Themen 8
W While-ESC-Schleife funktioniert nicht Allgemeine Java-Themen 3
H Threads.... ich will aus der While-Schleife raus Allgemeine Java-Themen 6
J Schachbrett mit for- oder while-Schleife Allgemeine Java-Themen 22
V Problem in While-Schleife Allgemeine Java-Themen 3
T getParameter in while schleife Allgemeine Java-Themen 3
O while - Schleife unterbrechen mit break; Allgemeine Java-Themen 5
M Problem mit while/do Schleife Allgemeine Java-Themen 12
B Try/Catch in While-Schleife mit Scanner - Hilfe! Allgemeine Java-Themen 3
F While(true)-Schleife im JPanel Allgemeine Java-Themen 9
N vergleich mit while und for schleife Allgemeine Java-Themen 7
M Keine weitere Eingabe in der Main möglich. Eventueller Ansatz über while. Allgemeine Java-Themen 8
C Schachbrett mit while-schleifen Allgemeine Java-Themen 7
A Swing Taschenrechner while Schlaufe Allgemeine Java-Themen 12
I NullPointer während while(){} Allgemeine Java-Themen 4
D ProcessBuilder und die while() Allgemeine Java-Themen 3
J Konsolen Anwendung mit while(true) Allgemeine Java-Themen 6
N while Schlauf und ActionEvent Allgemeine Java-Themen 2
L Exception auslösen, um while Schlaufe zu verlassen(rxtx.org) Allgemeine Java-Themen 6
B while mit BufferedReader beenden Allgemeine Java-Themen 5
T Verschachtelte For-Schleife gibt falschen Wert zurück, Abbruchbedingung evtl. falsch? Allgemeine Java-Themen 9
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
A For-Schleife Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
1 Klassen Variabel aus Schleife übergeben Allgemeine Java-Themen 8
D "Automatisierte", variable verschachtele for-Schleife Allgemeine Java-Themen 9
F Schleife funktioniert nicht richtig Allgemeine Java-Themen 13
K For-Schleife <> oder != Operator verwenden? Allgemeine Java-Themen 2
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
F Zweifache For-Schleife Allgemeine Java-Themen 6
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
S Variablen String[] Array per schleife in int[] einlesen Allgemeine Java-Themen 8
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
T for - Schleife Allgemeine Java-Themen 1
R Komplizierte Schleife Allgemeine Java-Themen 1
Q For-Schleife in String-Value Allgemeine Java-Themen 3
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F for-Schleife auf Kommandoebene ausgeben Allgemeine Java-Themen 9
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
P Erweiterte For Schleife Allgemeine Java-Themen 7
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
Y automatisierte for Schleife Allgemeine Java-Themen 13
B For schleife und weiter? Allgemeine Java-Themen 8
D Probleme bei for-Schleife Allgemeine Java-Themen 4
L einfache Verzinsung mit for-Schleife & Ausschluss von Werten beim Einlesen Allgemeine Java-Themen 5
M for Schleife mit Swing Button abbrechen Allgemeine Java-Themen 7
M PdfPTable per for-Schleife befüllen Allgemeine Java-Themen 3
F for-Schleife mit : Allgemeine Java-Themen 5
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
W Problem mit Index in einer for-Schleife Allgemeine Java-Themen 8
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
P Variablen Auf durch for-Schleife generierte JComboBox zugreifen Allgemeine Java-Themen 3
F Foreach und for - Schleife Allgemeine Java-Themen 10
W Berechnung Durchschnitt mit Schleife Allgemeine Java-Themen 9
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
A java.lang.NullPointerException bei Schleife Allgemeine Java-Themen 3
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
x22 for-Schleife Allgemeine Java-Themen 76
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
J Schleife mit : Allgemeine Java-Themen 18
S Klassen in einer Schleife durchlaufen Allgemeine Java-Themen 11
E Schleife wird nicht ausgeführt!!! Allgemeine Java-Themen 8
C Schleife mit leerem Anweisungsblock wird trotz erfüllter Bedingung nicht verlassen Allgemeine Java-Themen 9
K CheckBox schleife Allgemeine Java-Themen 2
D Methoden Thread Schleife Status Allgemeine Java-Themen 7
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
R In einer for Schleife bei einem Substring anfangen, wo man davor aufgehört hat Allgemeine Java-Themen 6
D Sterne Muster mit einer Schleife Allgemeine Java-Themen 5
Dragonfire Code Konvention for-Schleife / return Allgemeine Java-Themen 15
hdi Detail-Frage zur for-Schleife Allgemeine Java-Themen 9
Q Variable aus Schleife/Switch benutzen Allgemeine Java-Themen 7
J Erweiterte For-Schleife mit Vector Allgemeine Java-Themen 5
C Geschachtelte For-Schleife: Äußere Schleife wird nur einmal durchlaufen!? Allgemeine Java-Themen 3
W return Collection mit schleife durchsuchen Allgemeine Java-Themen 10
calzone Warum wird nicht aus der Schleife gesprungen ? Allgemeine Java-Themen 2
lacyuu Schleife hängt sich auf, wieso?? Allgemeine Java-Themen 2
ModellbahnerTT Problem: Schleife über Textdatei Allgemeine Java-Themen 5
S Wie gross ist die Laufzeit für diese Schleife?? Allgemeine Java-Themen 8
I For- Schleife falsch? Allgemeine Java-Themen 8
T Schleife kurzzeitig anhalten Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben