Domanda Perché la stampa "B" è notevolmente più lenta della stampa "#"?


Ho generato due matrici di 1000 X 1000:

Prima matrice: O e #.
Seconda matrice: O e B.

Utilizzando il seguente codice, la prima matrice ha impiegato 8,52 secondi per il completamento:

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

Con questo codice, la seconda matrice ha richiesto 259.152 secondi per il completamento:

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

Qual è la ragione dietro ai tempi di esecuzione drammaticamente diversi?


Come suggerito nei commenti, solo stampa System.out.print("#"); prende 7.8871 secondi, mentre System.out.print("B"); dà still printing....

Come altri che hanno sottolineato che funziona normalmente per loro, ci ho provato Ideone.com per esempio, ed entrambi i pezzi di codice vengono eseguiti alla stessa velocità.

Condizioni di prova:

  • Ho eseguito questo test da Netbeans 7.2, con l'uscita nella sua console
  • ero solito System.nanoTime() per le misure

2413
2018-02-21 23:45


origine


risposte:


Pura speculazione è che stai usando un terminale che tenta di fare word-wrapping piuttosto che il character-wrapping e il treats B come un carattere di parole ma # come carattere non verbale. Quindi quando raggiunge la fine di una linea e cerca un posto in cui interrompere la linea, vede a # quasi immediatamente e felicemente si spezza; mentre con il B, deve continuare a cercare più a lungo e può avere più testo da avvolgere (che può essere costoso su alcuni terminali, ad esempio, l'output di backspaces, quindi l'output degli spazi per sovrascrivere le lettere da incapsulare).

Ma questa è pura speculazione.


3719
2018-04-03 15:01



Ho eseguito test su Eclipse vs Netbeans 8.0.2, entrambi con Java versione 1.8; ero solito System.nanoTime() per le misure.

Eclisse:

io ho il stessa ora in entrambi i casi - in giro 1.564 secondi.

Netbeans:

  • Utilizzando "#": 1.536 secondi
  • Utilizzando "B": 44.164 secondi

Quindi, sembra che Netbeans abbia delle cattive prestazioni su print to console.

Dopo ulteriori ricerche mi sono reso conto che il problema è line-wrapping del buffer massimo di Netbeans (non è limitato a System.out.println comando), dimostrato da questo codice:

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

I risultati di tempo sono meno di 1 millisecondo ogni iterazione tranne ogni quinto iterazione, quando il risultato temporale è di circa 225 millisecondi. Qualcosa come (in nanosecondi):

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

E così via..

Sommario:

  1. Eclipse funziona perfettamente con "B"
  2. Netbeans ha un problema di line-wrapping che può essere risolto (perché il problema non si verifica in eclissi) (senza aggiungere spazio dopo B ("B")).

148