2010-07-01 67 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