Ich habe zwei Matrizen von 1000
x 1000
generiert:
Erste Matrix: O
und #
.
Zweite Matrix: O
und B
.
Mit dem folgenden Code dauerte die Fertigstellung der ersten Matrix 8,52 Sekunden:
Random r = new Random();
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if(r.nextInt(4) == 0) {
System.out.print("O");
} else {
System.out.print("#");
}
}
System.out.println("");
}
Mit diesem Code dauerte die Fertigstellung der zweiten Matrix 259,152 Sekunden:
Random r = new Random();
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if(r.nextInt(4) == 0) {
System.out.print("O");
} else {
System.out.print("B"); //only line changed
}
}
System.out.println("");
}
Was ist der Grund für die dramatisch unterschiedlichen Laufzeiten?
Wie in den Kommentaren vorgeschlagen, dauert das Drucken von System.out.print("#");
nur 7.8871
Sekunden, während System.out.print("B");
still printing...
ergibt.
Als andere darauf hinwiesen, dass es für sie normal funktioniert, habe ich zum Beispiel Ideone.com versucht, und beide Codeteile werden mit der gleichen Geschwindigkeit ausgeführt.
Test-Bedingungen:
System.nanoTime()
für Messungen verwendet Reine Spekulation bedeutet, dass Sie ein Terminal verwenden, das versucht, Zeilenumbruch anstelle von Zeilenumbrüchen zu verwenden B
als Word-Zeichen, aber #
als Nicht-Word-Zeichen. Wenn es das Ende einer Zeile erreicht und nach einer Stelle sucht, an der die Zeile unterbrochen werden kann, wird fast sofort ein #
angezeigt. wohingegen beim B
länger gesucht werden muss und möglicherweise mehr Text umbrochen werden muss (was auf einigen Terminals teuer sein kann, z. B. das Ausgeben von Leerzeichen und das Ausgeben von Leerzeichen zum Überschreiben der umbrochenen Buchstaben).
Aber das ist reine Spekulation.
Ich habe Tests mit Eclipse vs Netbeans 8.0.2 durchgeführt, beide mit Java Version 1.8; Ich habe System.nanoTime()
für Messungen verwendet.
Ich habe die gleiche Zeit in beiden Fällen - um 1,564 Sekunden .
Es sieht also so aus, als ob Netbeans beim Drucken auf der Konsole eine schlechte Leistung erbringt.
Nach weiteren Recherchen stellte ich fest, dass das Problem Zeilenumbruch des maximalen Puffers von Netbeans ist (es ist nicht auf den Befehl System.out.println
beschränkt), der durch diesen Code demonstriert wird:
for (int i = 0; i < 1000; i++) {
long t1 = System.nanoTime();
System.out.print("BBB......BBB"); \\<-contain 1000 "B"
long t2 = System.nanoTime();
System.out.println(t2-t1);
System.out.println("");
}
Das Zeitergebnis beträgt weniger als 1 Millisekunde pro Iteration, mit Ausnahme von jeder fünften Iteration , wenn das Zeitergebnis etwa 225 Millisekunden beträgt. So etwas wie (in Nanosekunden):
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
.
.
.
Und so weiter..