it-swarm.com.de

Warum ist das Drucken von "B" dramatisch langsamer als das Drucken von "#"?

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:

  • Ich habe diesen Test von Netbeans 7.2 mit der Ausgabe in die Konsole ausgeführt
  • Ich habe System.nanoTime() für Messungen verwendet
2629
Kuba Spatny

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.

3959
T.J. Crowder

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:

Ich habe die gleiche Zeit in beiden Fällen - um 1,564 Sekunden .

Netbeans:

  • Mit "#": 1,536 Sekunden
  • Mit "B": 44,164 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..

Zusammenfassung:

  1. Eclipse funktioniert perfekt mit "B"
  2. Netbeans hat ein Zeilenumbruchproblem, das behoben werden kann (da das Problem in Eclipse nicht auftritt) (ohne Leerzeichen nach B ("B")).
186
Roy Shmuli