与传统I / O相比,Java NIO在阻塞模式下的优势是什么?

时间:2011-03-07 17:46:23

标签: java performance io nio blocking

我已经决定不使用异步,非阻塞的Java NIO。一般而言,复杂性与利益是非常值得怀疑的,我认为在这个项目中尤其不值得。

但是我读到的关于NIO的大部分内容,以及与旧版java.io. *的比较都集中在使用java.io. *的非阻塞,异步NIO与线程每连接同步I / O上。但是,NIO可以用于同步,阻塞,线程连接模式,这似乎很少讨论。

问题在于:同步阻塞NIO与传统同步阻塞I / O(java.io. *)有什么性能优势?两者都是线程连接。复杂性如何比较?

请注意,这是一个普遍的问题,但目前我主要关注TCP套接字通信。

3 个答案:

答案 0 :(得分:18)

NIO优于“传统”IO的一个优点是NIO可以使用direct buffers允许操作系统将DMA用于某些操作(例如,从网络连接直接读取到内存映射文件中),从而避免将数据复制到中间缓冲区。

如果您在此技术确实避免执行原本会执行的复制操作的情况下移动大量数据,则会对性能产生很大影响。

答案 1 :(得分:10)

它基本上归结了并发连接的数量以及这些连接的繁忙程度。阻塞(每个连接的标准线程)在延迟和吞吐量方面都更快(对于简单的回显服务器来说大约快两倍)。因此,如果您的系统可以处理为每个连接维护一个线程(根据经验而言<&lt; 1000个连接),则采用阻塞方法。如果您有大量空闲连接(例如Comet长轮询请求或IMAP空闲连接),那么切换到非阻塞架构可能有助于扩展您的系统。

答案 2 :(得分:0)

我不能特别谈论这项技术,但异步库提供同步操作以便于调试并不罕见。

例如,如果遇到问题,可以在不重写整个过程的情况下消除逻辑的异步部分。这特别有用,因为同步过程通常更容易使用。