2010-07-01 71 views
4

它似乎已經很快了,我只是想知道如果有人知道它是否使用NIO。我試圖搜索整個NIO的源代碼(好吧,它的搜索方式:)大聲笑);但沒有碰到任何東西。另外,如果它不使用NIO;你認爲修改log4j以使用NIO也值得它更快嗎?任何指針建議和鏈接到一些資源會很有幫助。log4j是否使用NIO將數據寫入文件?

回答

3

此外,如果它不使用NIO;你 認爲它值得修改 log4j使用NIO也使它更快 更快?

不,除非日誌記錄是應用程序活動的重要組成部分,在這種情況下通常會出現錯誤。

你似乎覺得NIO'更快',但這通常並不正確。只要嘗試創建兩個文件,一個使用標準IO,一個使用NIO,向他們寫入一堆數據並關閉它們。你會看到性能幾乎不同。 NIO只會在某些使用情況下表現更好;通常情況下很多連接。

+0

是的;這些是在一種模式下應用程序的重要組成部分,我希望該模式也可以更好地執行,我從一個應用程序寫入,所以我不知道如何在這裏關聯連接。嘗試編寫日誌記錄的線程數量是多少?是的,有很多線程試圖寫入內容。我知道從應用程序寫入大量日誌並不是最好的解決方案,但我只是想確保它不是最壞的:)也是。非常感謝您的見解。我會嘗試將IO和NIO與一些例子進行比較。 – vpram86 2010-07-01 07:18:14

3

查看FileAppender source。幾乎只是標準java.io

+0

感謝您的來源。是否值得實施與這些相同的NIO appender?它會使它更快嗎? – vpram86 2010-07-01 07:11:46

+3

號與Java標準IO中的單線程每個連接模型相反,NIO是非阻塞IO。這不是速度問題。 – SteveD 2010-07-01 07:27:19

+0

@stevendick:我正在考慮使用FileChannel和MBB的RandomAccessFile。它會幫助一點嗎? :( – vpram86 2010-07-01 08:24:44

1

在這種情況下,我看不出任何FileChannel比FileOutputStream更快的原因。

也許通過使用MappedByteBuffer?但在追加模式下,行爲取決於操作系統。

最終,性能取決於您的硬盤驅動器,您的代碼很重要。

+0

是的,我只是在考慮MBB。這就是爲什麼我自己問這個問題!謝謝!記住這些要點。 – vpram86 2010-07-02 13:14:26

1

詳細闡述了Confusion的答案,還有File NIO塊。這就是爲什麼它不會比傳統的文件IO在某些的情況下更快。引述O'Reilly's Java NIO book

文件通道總是阻塞和不能被置於 非阻塞模式。現代操作系統具有複雜的緩存 和預取算法,通常會給本地磁盤I/O帶來很低的延遲。網絡文件系統通常具有較高的等待時間,但經常會受益於相同的優化。由於文件I/O具有根本不同的性質,面向流的I/O的非阻塞範例對於面向文件的操作沒有多大意義。 對於文件I/O,真正的贏家是異步I/O,它允許 進程從操作系統 請求一個或多個I/O操作,但不會等待它們完成。過程在稍後通過 通知所請求的I/O已完成。異步I/O是 許多操作系統上不具備的高級功能。作爲未來的NIO增強,正在考慮的 。

編輯:這樣說,如果您使用File NIO和MappedByteBuffer,您可以獲得更好的讀/寫效率。請注意,在Log4j 2中使用MappedByteBuffer在consideration之下。

+0

哇很混亂,兩年半後還是這樣嗎? – matanster 2016-06-10 09:05:11