Frage Warum ist das Drucken von "B" wesentlich langsamer als das Drucken von "#"?


Ich habe zwei Matrizen generiert 1000 x 1000:

Erste Matrix: O und #.
Zweite Matrix: O und B.

Mit dem folgenden Code dauerte die erste Matrix 8,52 Sekunden, um abzuschließen:

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 zweite Matrix 259,152 Sekunden, um abzuschließen:

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, nur Drucken System.out.print("#"); dauert 7.8871 Sekunden, während System.out.print("B"); gibt still printing....

Wie andere, die darauf hingewiesen haben, dass es für sie normal funktioniert, habe ich es versucht Ideone.com zum Beispiel, und beide Teile des Codes werden mit der gleichen Geschwindigkeit ausgeführt.

Test-Bedingungen:

  • Ich habe diesen Test durchgeführt Netbeans 7.2, mit der Ausgabe in seine Konsole
  • ich benutzte System.nanoTime() für Messungen

2414
2018-02-21 23:45


Ursprung


Antworten:


Reine Spekulation ist, dass Sie ein Terminal verwenden, das zu tun versucht Zeilenumbruch anstatt Zeichenumbruch und behandelt B als ein Wortzeichen aber # als ein Nicht-Wort-Zeichen. Wenn es also das Ende einer Zeile erreicht und nach einem Ort sucht, an dem die Zeile unterbrochen werden kann, sieht es a # fast sofort und glücklich bricht dort; während mit dem Bes muss länger gesucht werden, und es muss mehr Text zu umbrechen sein (was an einigen Endgeräten teuer sein kann, z. B. Rückspeichern ausgeben und dann Leerzeichen ausgeben, um die umwickelten Briefe zu überschreiben).

Aber das ist reine Spekulation.


3720
2018-04-03 15:01



Ich habe Tests mit Eclipse vs Netbeans 8.0.2 durchgeführt, beide mit Java Version 1.8; ich benutzte System.nanoTime() für Messungen.

Finsternis:

ich habe das 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 hätte Netbeans eine schlechte Leistung beim Drucken auf der Konsole.

Nach mehr Forschung habe ich gemerkt, dass das Problem ist Zeilenumbruch der maximale Puffer von Netbeans (es ist nicht beschränkt auf System.out.println Befehl), demonstriert durch diesen Code:

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("");
}

Die Zeitresultate betragen bei jeder Iteration weniger als 1 Millisekunde jede fünfte Iteration, wenn das Zeitergebnis etwa 225 Millisekunden beträgt. 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 gelöst werden kann (weil das Problem nicht in der Eclipse auftritt) (ohne Leerzeichen nach B ("B") hinzuzufügen).

148