2016-11-18 10 views
0

ログにlog4jを使用して、Javaでマルチスレッドアプリケーションを作成しています。私のベンチマークでは、ログを出力するたびに1または2 msの遅延が発生することがわかりました。調査の結果、問題はコンソール出力にしかないことがわかりました。私がlog4jを取り除いてSystem.out.printを使って直接印刷しても問題は発生しました。そのスレッドでは、私は次のテストに使用:JavaマルチスレッドアプリケーションSystem.out.printlnが待ち時間を生成します

 System.out.println("==============================================================="); 
     long ts = java.lang.System.currentTimeMillis(); 
     String toPrint = "### TEST 1 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n"; 
     toPrint = toPrint + "### TEST 2 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n"; 
     toPrint = toPrint + "### TEST 3 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n"; 
     toPrint = toPrint + "### TEST 4 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n"; 
     System.out.print(toPrint); 
     System.out.println("==============================================================="); 

     System.out.println("### TEST 1 " + (java.lang.System.currentTimeMillis() - ts) + " ms"); 
     System.out.println("### TEST 2 " + (java.lang.System.currentTimeMillis() - ts) + " ms"); 
     System.out.println("### TEST 3 " + (java.lang.System.currentTimeMillis() - ts) + " ms"); 
     System.out.println("### TEST 4 " + (java.lang.System.currentTimeMillis() - ts) + " ms"); 
     System.out.println("==============================================================="); 

をし、出力は次のようになります。

=============================================================== 
### TEST 1 0 ms 
### TEST 2 0 ms 
### TEST 3 0 ms 
### TEST 4 0 ms 
=============================================================== 
### TEST 1 7 ms 
### TEST 2 9 ms 
### TEST 3 10 ms 
### TEST 4 11 ms 
=============================================================== 

レイテンシーを作成せずに、コンソールに直接出力する、マルチスレッドアプリケーションのための正しい方法だろうか?

log4jを直接セットアップすることはできますか?私は結果を確認するためにnanos値にコードを変更しなければならなかったあなたの親切な助けを事前に

おかげで...

+1

このレイテンシには問題があります。作業のたびに時間がかかります。次に印刷するだけの新しいスレッドを作成してください。 –

+0

コンソールに書き込むのに少し時間がかかります。仕方ないよ。コンソールに大量にログを記録して問題が発生した場合は、ログレベルを下げるか、コンソールログを完全に無効にしてください。生成する可能性が高いログファイルを常に「テール」することができます。 – Andreas

+0

@アンドレアスあなたの答えをありがとう。しかし、私のCPUのどれも飽和していないし、現代のサーバで1行を出力するのに2ミリ秒は妥当ではない。本当にコンソールをオフにしてpbを修正してください。 – deubNippon

答えて

1

。 Eclipseで実行すると最終的に~120,000 nsが得られます。 Windowsのコマンドプロンプトで実行する私は~700,000 nsをクリアプロンプト(clsコマンドの直後)に表示しますが、スクロールするときは~2,000,000 nsになります。

コンソールに書き込むのは同期です。スクロールと印刷が完了するまで待つ必要があるため、コンソールにログを記録しないでください。

あなたは、というファイルをコンソールに記録していると言っています。 の開発ではですが、はコンソールにはログに記録されません。どうしてですか?とにかくプロダクションコードは無人で実行する必要があります。誰もコンソールを見ていないので、なぜそこに時間を浪費していますか?

一時的に運用ログを見る必要がある場合は、ログファイルにtailを使用してください。 Windowsの場合は、「Looking for a windows equivalent of the unix tail command」を参照してください。

コンソールへのロギングをお勧めする場合は、AsyncAppenderを試してみてください。

+0

Thxたくさん、私はコンソールioが非常に高価であることに気付かなかった。あなたは本当に私の最初の質問に答えます。しかし、log4j 2は、これらの問題に取り組むことになっています。どのようにすれば、console ioをlog4jで優先度の低い別のスレッドで行うことができますか? (今のところ私はあなたがアドバイスしてプロダクトのコンソール出力をオフにしています) – deubNippon

関連する問題