14

以前は でコードを書いたり開発したりしていましsystem.out.println()た。通常、値と問題が発生している場所を追跡するのに役立ちます。また、アプリケーションを開発した後は削除しsystem.out.println()ません。ユーザーが問題を見つけたときに役立つ可能性があるためです。これにより、問題が発生した場所を簡単に追跡できます。しかし、私の上司の 1 人はsystem.out.println()、コードの効率レベルに影響するため、コードから削除することを提案しました。これは正しいです?

私の観点からSystem.out.print()すると、メモリ上でバイトを取ることはほとんどないので、開発者はあまり使用すべきではないというのは本当system.out.printlnですか??

前もって感謝します。

4

9 に答える 9

19

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

Putting System.out.println a lot will make the entire project to run almost single-threaded, because all thread will waiting for synchronization lock, and make your application begin to crawl.

This means your superior is right.

Alternatively, Use logging framework like log4j instead. You can still configure your log4j to still output to System.out.println by just minor changes in the appender configuration.

于 2013-05-28T05:58:42.083 に答える
3

ロガーを使用して問題を解決できます。

コードの開発中にログ記録のレベルを指定すると、本番環境でログ記録のレベルを設定できます。

レベルのリスト:

DEBUG Level

INFO Level

WARN Level

ERROR Level

FATAL Level

Log4j は一般的に使用されるものです。こちらを参照してください。

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

println を使用することの短所について:

反対の主な理由は、printlnがプログラムの速度を低下させることです。

于 2013-05-28T05:55:36.790 に答える
3

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

例 - 開発者の DEBUG レベル -- 本番環境で警告するため、重要な情報のみが本番環境に記録されます。

于 2013-05-28T05:56:46.110 に答える
2

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

于 2013-05-28T05:59:58.783 に答える
2

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

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

于 2013-05-28T06:00:09.133 に答える
2

はい、System.out.println() の呼び出しを最小限に抑える必要があるのは事実です。これは、コンソールへの出力が IO 操作であり、IO が完了するまでに比較的長い時間がかかるためです。これが、可能な限り StringBuilder を使用して、印刷したいものをメモリに連結する理由です。印刷したいものをすべてメモリにプールした後、これが System.out.println() を呼び出す時間です。

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

于 2013-05-28T06:00:10.043 に答える
1

ログ ファイルを維持するのではなく、ログ ファイルを維持するsystem.out.printlnことをお勧めします。これを使用すると、開発者のみがコンソールで見ることができます。これ以上のメッセージを表示することはできません。

ただし、将来の使用のためにそれを使用することはできません。ロギングを使用すると、メッセージをデータベースまたはファイルに保存できます....etc

于 2013-05-28T05:54:54.430 に答える
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.

お役に立てれば。

于 2013-05-28T05:57:11.060 に答える
1

非常System.out.printlnに最悪の練習をします。ロギングの概念を実装してみてください。システムのログを維持するには、log4jORを使用します。log4j2コードのトレースまたはデバッグ用。

于 2013-05-28T05:58:41.807 に答える