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
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: