Vraag Waarom is het afdrukken van "B" aanzienlijk langzamer dan afdrukken "#"?


Ik heb twee matrices van gegenereerd 1000 X 1000:

Eerste matrix: O en #.
Tweede matrix: O en B.

Met behulp van de volgende code duurde de eerste matrix 8,52 seconden om te voltooien:

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

Met deze code duurde de tweede matrix 259,152 seconden om te voltooien:

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

Wat is de reden achter de dramatisch verschillende runtijden?


Zoals in de opmerkingen wordt gesuggereerd, alleen afdrukken System.out.print("#"); neemt 7.8871 seconden, terwijl System.out.print("B"); geeft still printing....

Zoals anderen die erop wezen dat het normaal voor hen werkt, heb ik het geprobeerd Ideone.com bijvoorbeeld, en beide stukjes code worden met dezelfde snelheid uitgevoerd.

Test voorwaarden:

  • Ik heb deze test uitgevoerd Netbeans 7.2, met de uitvoer in de console
  • ik gebruikte System.nanoTime() voor metingen

2414
2018-02-21 23:45


oorsprong


antwoorden:


Pure speculatie is dat je een terminal gebruikt die probeert te doen word-wrapping in plaats van het inpakken en behandelen van tekens B als een woordkarakter maar # als een niet-woordkarakter. Dus wanneer het einde van een regel wordt bereikt en naar een plaats zoekt om de lijn te verbreken, ziet het een # bijna onmiddellijk en gelukkig breekt daar; overwegende dat met de B, het moet langer zoeken en kan meer tekst bevatten om in te pakken (wat op sommige terminals duur kan zijn, bijv. het uitvoeren van backspaces en het dan uitvoeren van spaties om de in te pakken letters te overschrijven).

Maar dat is pure speculatie.


3720
2018-04-03 15:01



Ik heb tests uitgevoerd op Eclipse vs Netbeans 8.0.2, beide met Java-versie 1.8; ik gebruikte System.nanoTime() voor metingen.

Verduistering:

ik heb de dezelfde tijd in beide gevallen - in de omgeving van 1.564 seconden.

Netbeans:

  • Gebruik makend van "#": 1.536 seconden
  • "B" gebruiken: 44.164 seconden

Dus het lijkt erop dat Netbeans slechte prestaties heeft op print to console.

Na meer onderzoek besefte ik dat het probleem is line-verpakking van de maximale buffer van Netbeans (het is niet beperkt tot System.out.println commando), aangetoond door deze 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("");
}

De tijdresultaten zijn minder dan 1 milliseconde elke iteratie behalve elke vijfde iteratie, wanneer het tijdresultaat ongeveer 225 milliseconden is. Iets als (in nanoseconden):

BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
.
.
.

Enzovoort..

Overzicht:

  1. Eclipse werkt perfect met "B"
  2. Netbeans heeft een probleem met het omwikkelen van lijnen dat kan worden opgelost (omdat het probleem zich niet voordoet bij een eclips) (zonder ruimte toe te voegen na B ("B")).

148