2009-06-04 14 views

risposta

33

Questo non ha assolutamente nulla a che fare con la JVM. Stampare il testo sullo schermo richiede semplicemente molto lavoro per il sistema operativo nel disegnare le lettere e soprattutto scorrere. Se si reindirizza System.out a un file, sarà molto più veloce.

+4

+1 per "disegnare le lettere e soprattutto scorrere". Grazie – DragonBorn

+1

Quindi dipende dalla velocità del terminale. Una volta ho usato un terminale con la trasparenza e altre cose per gli occhi. Sembrava carino ma si comportava molto male, il passaggio a un altro terminale risolveva questi problemi. – Philipp

+0

Su Linux, si può provare a eco bigfile.txt e poi destinarli eco bigfile.txt> anotherfile.txt per vedere la differenza. – Renaud

5

Ya, c'è una quantità enorme di spese generali per iscritto nella console. Molto maggiore di quello richiesto per scrivere su un file o un socket. Inoltre, se ci sono un numero elevato di thread, tutti si contendono sullo stesso blocco. Consiglierei di usare qualcosa di diverso da System.out.println per tracciare.

3

Questo non ha nulla a che fare con Java e JVM ma con il terminale della console. Nella maggior parte dei sistemi operativi, so che scrivere nell'output della console è lento.

12

Questo è molto dipendente dal sistema operativo. Ad esempio, in Windows, la scrittura sulla console è un'operazione di blocco ed è anche lenta, quindi la scrittura di molti dati sulla console rallenta (o blocca) l'applicazione. Nei sistemi operativi di tipo Unix, la scrittura nella console viene memorizzata nel buffer, quindi la tua app può continuare a essere sbloccata e la console si aggiornerà come può.

1

Alcuni terminali sono solo più veloci di altri. Questo può variare anche all'interno di un sistema operativo.

1

Questo potrebbe sembrare che non risponda direttamente alla tua domanda, ma il mio consiglio è di non usare mai System.out per tracciare (se intendi una sorta di debugging, per vedere solo l'anticipo della tua app)

I problemi con System.out per il debug sono molteplici:

  • una volta che l'applicazione si conclude, quando si chiude la console si perde il registro

  • dovrete rimuovere quelle dichiarazioni una volta che la tua app funziona correttamente (o commentali). In seguito, se si desidera riattivare loro, si dovrà rimuovere il commento/commentare di nuovo ... noioso

vi consiglio invece di usare log4j e "guardare" il file di log, o con un comando tail - c'è anche a Tail for Windows - con un plug-in Eclipse come LogWatcher.

-1

La lentezza è dovuta alla grande quantità di transizioni Java-Native che si verificano in ogni interruzione di linea o flusso. Se l'iterazione ha molti passaggi, System.out.println() non è di grande aiuto. Se la procedura di iterazione non è così importante da sola, è possibile chiamare System.out.println() solo ogni 10 o 100 passaggi. È anche possibile avvolgere System.out in BufferedOutputStream. E naturalmente c'è sempre la possibilità di asincronizzare la stampa tramite ExecutorService.

1

Una cosa interessante che ho notato della scrittura sul terminale (almeno in Windows). È in realtà eseguito molto più velocemente se la finestra è ridotta a icona. Questo è strettamente legato alla risposta di Michael Borgwardt sul disegno e sullo scrolling. In realtà se stai registrando abbastanza per notare il rallentamento probabilmente stai meglio scrivendo su un file.

2

Il buffering può aiutare enormemente.Prova questo:

System.setOut(new PrintStream(new BufferedOutputStream(System.out))); 

Ma attenzione: non vedrai l'output apparire gradualmente, ma tutto in un lampo. Il che è fantastico, ma se lo stai usando per il debug e il programma si blocca prima che termini, in alcune circostanze è possibile che il testo non venga stampato prima dell'arresto. Questo perché il buffer non è stato svuotato prima del crash. È stato stampato, ma è ancora nel buffer e non è uscito nella console dove è possibile vederlo. Ricordo che mi è successo, in una sconcertante sessione di debug. È preferibile eseguire occasionalmente lo svuotamento esplicito per assicurarti di visualizzarlo:

System.out.flush(); 
Problemi correlati