Ich habe zwei Matrizen von 1000
x erzeugt 1000
:
Erste Matrix: O
und #
.
Zweite Matrix: O
und B
.
Unter Verwendung des folgenden Codes 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, System.out.print("#");
dauert das Drucken nur 7.8871
Sekunden, während es System.out.print("B");
gibt still printing...
.
Als andere, die darauf hinwiesen, dass es für sie normal funktioniert, habe ich zum Beispiel Ideone.com ausprobiert und beide Codeteile werden mit der gleichen Geschwindigkeit ausgeführt.
Test-Bedingungen:
- Ich habe diesen Test von Netbeans 7.2 mit der Ausgabe in der Konsole ausgeführt
- Ich habe
System.nanoTime()
für Messungen verwendet
java
performance
loops
for-loop
system.out
Kuba Spatny
quelle
quelle
Antworten:
Reine Spekulation ist, dass Sie ein Terminal verwenden, das versucht, Wortumbruch statt Zeichenumbruch durchzuführen, und das
B
als Wortzeichen, aber#
als Nichtwortzeichen behandelt wird . Wenn es also das Ende einer Linie erreicht und nach einem Ort sucht, an dem die Linie unterbrochen werden kann, sieht es eine#
fast sofortige und glückliche Unterbrechung. Während mit demB
muss es länger suchen und muss möglicherweise mehr Text umbrechen (was an einigen Terminals teuer sein kann, z. B. das Ausgeben von Leerzeichen und das anschließende Ausgeben von Leerzeichen zum Überschreiben der umgebrachten Buchstaben).Aber das ist reine Spekulation.
quelle
B
Lösen.System.out.println
führt keine Wortumhüllung durch; Das, worauf es ausgegeben wurde, war das Umbrechen von Wörtern (und das Blockieren, alsoSystem.out.println
musste ich warten).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.Finsternis:
In beiden Fällen hatte ich die gleiche Zeit - ungefähr 1,564 Sekunden .
Netbeans:
Es sieht also so aus, als ob Netbeans beim Drucken auf der Konsole eine schlechte Leistung aufweist.
Nach weiteren Recherchen wurde mir klar, dass das Problem das Zeilenumbruch des maximalen Puffers von Netbeans ist (es ist nicht auf
System.out.println
Befehle beschränkt), was durch diesen Code demonstriert wird:Die Zeitergebnisse betragen weniger als 1 Millisekunde pro Iteration, außer bei jeder fünften Iteration , wenn das Zeitergebnis etwa 225 Millisekunden beträgt. So etwas wie (in Nanosekunden):
Und so weiter..
Zusammenfassung:
quelle
Ja, der Täter ist definitiv ein Wortwickler. Als ich Ihre beiden Programme getestet habe, hat mir NetBeans IDE 8.2 das folgende Ergebnis geliefert.
Wenn Sie sich Ihren Code genau ansehen, haben Sie am Ende der ersten Schleife einen Zeilenumbruch verwendet. In der zweiten Schleife haben Sie jedoch keinen Zeilenumbruch verwendet. Sie werden also in der zweiten Schleife ein Wort mit 1000 Zeichen drucken. Dies führt zu einem Problem mit dem Zeilenumbruch. Wenn wir nach B ein Nicht-Wort-Zeichen "" verwenden, dauert das Kompilieren des Programms nur 5,35 Sekunden . Und wenn wir in der zweiten Schleife nach Übergabe von 100 oder 50 Werten einen Zeilenumbruch verwenden, dauert dies nur 8,56 Sekunden bzw. 7,05 Sekunden .
Ein weiterer Rat ist, die Einstellungen der NetBeans-IDE zu ändern. Gehen Sie zunächst zu NetBeans Tools und klicken Sie auf Optionen . Klicken Sie anschließend auf Editor und wechseln Sie zur Registerkarte Formatierung . Wählen Sie dann Anywhere in Line Wrap Option. Das Kompilieren des Programms dauert fast 6,24% weniger.
quelle