2016-11-18 122 views
0

我正在編寫一個使用log4j進行日誌記錄的Java多線程應用程序。在我的基準測試期間,我發現每次輸出日誌時都會產生1或2毫秒的延遲。調查後,我發現問題只出現在控制檯輸出中,即使我擺脫了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來直接做到這一點嗎?

預先感謝你的幫助......

+1

在這種延遲是一個問題 - 每一項工作需要一些時間 - 然後可能創建一個新的線程,只是你的打印。 –

+0

寫入控制檯需要一點時間。就是那樣子。如果您記錄了很多事情來控制它,請減少日誌級別,或完全關閉控制檯日誌記錄。你總是可以「尾巴」你可能產生的日誌文件。 – Andreas

+0

@Andreas非常感謝您的回答。然而,我的CPU沒有飽和,並且在現代服務器上輸出一行2毫秒聽起來不合理。關閉控制檯確實修復了pb。 – deubNippon

回答

1

我不得不改變代碼的Nano看到的結果。在Eclipse中運行我獲得最終編號~120,000 ns。在Windows命令提示符下運行我在清除提示時(在cls命令之後)獲取~700,000 ns,但在需要滾動時獲得~2,000,000 ns

寫入控制檯是同步,並且必須等待滾動和打印才能完成,因此不要登錄到控制檯,或者只記錄非常小的輸出。

您在評論中說您正在登錄文件控制檯。在開發,但沒有在生產登錄到控制檯。你爲什麼?無論如何,生產代碼應該無人值守運行,並且沒有人正在監視控制檯,那麼爲什麼要浪費時間登錄?

如果您暫時需要實時查看生產日誌,請在日誌文件上使用tail。對於Windows,請參閱「Looking for a windows equivalent of the unix tail command」。

如果您堅持登錄到控制檯,請嘗試使用AsyncAppender

+0

Thx很多,我沒有意識到控制檯io是如此昂貴。你確實回答我的第一個問題。然而,log4j 2應該解決這些問題,任何想法如何確保控制檯io可以在低優先級的單獨線程中使用log4j來完成? (現在我按照你的建議去做,並關閉控制檯輸出) – deubNippon