2013-05-28 18 views
13

Ho usato per scrivere & sviluppare codici con system.out.println(). di solito mi aiuta a tenere traccia dei valori e dove sta arrivando il problema. E dopo l'applicazione sviluppata, non rimuovo lo system.out.println() perché potrebbe essere utile dopo che l'utente ha riscontrato eventuali problemi a cui tornerà da noi, il che rende così facile rintracciare dove è andato storto. Ma uno dei miei superiori ha suggerito di rimuovere system.out.println() dai codici perché ha effetto sul livello di efficienza del codice. È corretto?System.out.println() influisce sull'efficienza del codice?

Dal mio punto di vista, lo System.out.print() difficilmente porta in memoria i byte, quindi è vero che lo sviluppatore non dovrebbe usare molto system.out.println ??

Grazie in anticipo.

+1

Vedere http://stackoverflow.com/questions/8601831/do-not-use-system-out-println-in-server-side-code – devnull

+0

è necessario utilizzare il logger piuttosto che le linee syso –

+1

notare anche che quando si stanno usando un framework di logging come apache commons, dovresti controllare se il livello di log è abilitato prima di provare a registrare stringhe concatenate. Chiamando Logger.debug ("x =" + 5) se il livello di registro è solo INFO causerebbe una concatenazione di stringhe (che è pesante) mentre il messaggio che hai provato a registrare non viene realmente registrato. –

risposta

16

L'implementazione System.out contiene un blocco sincronizzato sul flusso di output.

Da PrintStream.java:

 /** 
     * Prints a String and then terminate the line. This method behaves as 
     * though it invokes <code>{@link #print(String)}</code> and then 
     * <code>{@link #println()}</code>. 
     * 
     * @param x The <code>String</code> to be printed. 
     */ 

     public void println(String x) { 
      synchronized (this) { 
       print(x); 
       newLine(); 
      } 
     } 

Mettere System.out.println molto farà l'intero progetto per eseguire quasi single-threaded, perché ogni volontà thread in attesa per il blocco di sincronizzazione, e rendere l'applicazione inizia a strisciare .

Questo significa che il tuo superiore ha ragione.

In alternativa, utilizzare la struttura di registrazione come log4j. È ancora possibile configurare log4j per l'output ancora su System.out.println apportando solo piccole modifiche nella configurazione dell'appender.

+0

Potresti fornire un riferimento del blocco sincronizzato dell'implementazione di System.out? Grazie! – Mingyu

+0

ha aggiornato la mia risposta. – Rudy

1

È buona norma conservare i file di registrazione anziché system.out.println. Se si utilizza questo, solo i devolpers possono vedere sulla console. Non è possibile visualizzare più messaggi con questo.

ma non è possibile utilizzarlo per il futuro use.If si utilizza la registrazione è possibile salvare i messaggi in database o file .... ecc

+0

no. Hai ragione. – PSR

3

È possibile utilizzare logger per risolvere il problema.

Specificare il livello di registrazione durante lo sviluppo del codice ed è possibile impostare il livello di registrazione in produzione.

Elenco dei livelli:

DEBUG Level 

INFO Level 

WARN Level 

ERROR Level 

FATAL Level 

Log4j è una comune l'uso, vedere qui:

http://logging.apache.org/log4j/2.x/

Per quanto riguarda i contro di utilizzare println:

Il motivo principale contro è che println rallenta la velocità del tuo programma.

+0

Grazie. Sì, lo so, ma per questo devo aprire un file di registro e vedere. per esempio durante il debug dei valori system.out.print() basta stampare i valori. quindi è più comodo dei file di registro. Qual è il danno se uso più s.o.p? questo è il mio obiettivo principale? –

+0

println rallenta la velocità del programma in produzione – Mingyu

2

L'uso di strutture di registrazione come SLF4J è altamente raccomandato. In questo modo, tramite la configurazione, è possibile eseguire queste istruzioni di registrazione in base all'ambiente.

es. - Livello DEBUG sullo sviluppatore - WARN su produzione, quindi solo la iformazione critica viene registrata in produzione.

1

Credo che stai parlando di Java in questo contesto e illustrerò un altro metodo contro system.out.println().

System.out.print(); // Prints a string of characters only 
System.out.println(); // Prints a string of character followed by a line break and that line break is the one which is taking up tons of space if I ain't wrong. 

Spero che questo aiuti.

1

mettere la System.out.println la sua pratica peggiore. prova ad implementare il concetto di registrazione. Utilizzare log4j O log4j2 per mantenere il registro del sistema. per tracciare o eseguire il debug del codice.

2

È vero che l'output sulla console, in particolare l'uscita eccessiva, ridurrà le prestazioni dell'applicazione. È anche uno stile di programmazione migliore per non sovraccaricare l'utente di informazioni che solo tu puoi utilizzare. Invece, dovresti utilizzare i meccanismi integrati di Java per gestire eventi imprevisti, ad es. eccezioni e il meccanismo di affermazione. Puoi anche scegliere di avere un'opzione 'verbose' come argomento da riga di comando.

2

System.out.println può causare seri problemi di prestazioni se utilizzato estesamente in un ambiente multi-thread (anche applicazioni web). Ogni chiamata println acquisisce un blocco in modo che il messaggio visualizzato sulla console non sia confuso con altri messaggi.

Anche nella maggior parte dei casi l'output della console viene reindirizzato su un file. Pertanto, incorre in operazioni di I/O sincrone che possono portare a un peggioramento delle prestazioni.

2

Sì, è vero che le chiamate a System.out.println() devono essere ridotte a icona. Ciò è dovuto al fatto che la stampa sulla console è un'operazione IO e che l'IO impiega un tempo relativamente lungo per il completamento. Questo è il motivo per cui, per quanto possibile, usiamo un StringBuilder per concatenare le cose che vogliamo stampare nella memoria. Dopo aver raggruppato tutto ciò che vogliamo stampare nella memoria, questo è il momento in cui si vorrebbe chiamare System.out.println().

Chiamare System.out.println() non ha alcun effetto sulla memoria.

Problemi correlati