2013-05-28 14 views
13

私は&を開発コードsystem.out.println()で書きました。それは通常、私が価値観を追跡し、問題がどこに来るのかを助けます。また、開発されたアプリケーションの後では、system.out.println()は削除されません。ユーザーが問題を見つけた後に役立ちますので、間違った場所を簡単に追跡できるようになります。しかし、私の上司の一人は、system.out.println()をコードから削除するように提案しました。その効果はコードの効率的なレベルです。これは正しいです?System.out.println()はコード効率に影響しますか?

私の見解では、System.out.print()はメモリ上のバイトをほとんど取りませんので、開発者はあまり使わないほうが良いと言えますか?system.out.println ??

ありがとうございます。

+1

http://stackoverflow.com/questions/8601831/do-not-use-system-out-println-in-server-side-codeを参照してください。 – devnull

+0

sysoラインよりもロガーを使用する必要があります。 –

+1

Apacheのコモンのようなロギングフレームワークを使用している場合は、連結された文字列を記録する前にログレベルが有効かどうかを確認する必要があります。ログレベルがINFOだけの場合、Logger.debug( "x =" + 5)を呼び出すと文字列連結(重い)が発生しますが、ログに記録しようとしたメッセージは実際にログに記録されません。 –

答えて

16

System.outの実装には、の同期化されたブロックが出力ストリームに含まれています。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(); 
      } 
     } 

のSystem.out.printlnプロジェクト全体を行います多くは、すべてのスレッドの意志は同期ロックを待っているので、ほとんどのシングルスレッド実行、およびアプリケーションがクロールを開始するために置きます。

これはあなたの上司が正しいことを意味します。

代わりにlog4jのようなログフレームワークを使用してください。 appenderの設定を少し変更するだけで、log4jをSystem.out.printlnに出力するように設定できます。

+0

System.out実装の同期ブロックのリファレンスを教えてください。ありがとう! – Mingyu

+0

私の答えが更新されました。 – Rudy

1

あなたがこれでより多くのメッセージを見ることはできませんconsole.Youで見ることができるこの唯一devolopersを使用する.IFログファイルではなく、system.out.printlnを維持することが良いです。

しかし、あなたは、データベースやファイルにメッセージを保存することができますロギングを使用use.Ifあなたは将来のためにそれを使用することはできません....など

+0

いいえ。あなたは正しいです – PSR

3

あなたが問題を解決するためにロガーを使用することができます。

コードの開発中にロギングのレベルを指定し、プロダクションでロギングのレベルを設定できます。レベルの

一覧:

DEBUG Level 

INFO Level 

WARN Level 

ERROR Level 

FATAL Level 

Log4jのは、使用する一般的なもので、ここを参照してください:

主な理由:両論のprintlnを使用してのについて

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

をに対してprintln が遅くなりますあなたのプログラムの速度。

+0

ありがとうございます。はい私は知っているが、私はログファイルを開いて参照する必要があります。たとえば、system.out.print()の値をデバッグする際に値を出力するだけです。ログファイルよりも便利です。もっとs.o.pを使用すれば何が問題になりますか?それは私の主な目的ですか? –

+0

printlnはプロダクションでのプログラムの速度を遅くします – Mingyu

2

SLF4Jなどのロギングフレームワークの使用を強くお勧めします。このように設定することで、environementに基づいてこれらのロギングステートメントを実行することができます。

例: - 開発者のDEBUGレベル - 生産のWARN。このため、クリティカルなフォーマットのみがプロダクションに記録されます。

1

私はこのコンテキストでJavaについて話しており、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. 

希望します。

1

System.out.printlnは非常に最悪の方法です。ロギングの概念を実装しようとします。 システムのログを維持するには、log4jまたはlog4j2を使用してください。コードのトレースやデバッグを行います。

2

コンソールに出力すると、特に出力が過剰になると、アプリケーションのパフォーマンスが低下します。また、ユーザーだけが使用できる情報でユーザーに負担をかけないようにすることも、プログラミングスタイルの良さです。代わりに、Javaの組み込みのメカニズムを使用して、予期しないイベントを処理する必要があります。例外とアサーションのメカニズムです。また、コマンドライン引数として '冗長'オプションを選択することもできます。

2

マルチスレッド環境(Webアプリケーションでさえ)で広範囲に使用された場合、System.out.printlnは深刻なパフォーマンスの問題を引き起こす可能性があります。すべてのprintln呼び出しはロックを取得し、コンソールに表示されるメッセージが他のメッセージと混ざらないようにします。

また、ほとんどの場合、コンソールの出力はファイルにリダイレクトされます。したがって、パフォーマンスの低下につながる同期IO操作が多数発生します。

2

はい、System.out.println()への呼び出しを最小限に抑える必要があります。これは、コンソールへの印刷がIO操作であり、IOが完了するまでに比較的長い時間がかかるためです。このため、できるだけ多くの場合、StringBuilderを使用して、のの印刷対象を連結します。のメモリにを印刷したいものすべてをプールしたら、これはSystem.out.println()を呼び出すときです。

System.out.println()を呼び出すことはメモリに影響しません。

関連する問題