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

Cha*_*N B 23 java io performance nio blocking

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

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

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

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

Mic*_*rdt 20

在"传统" IO NIO的一个优点是,NIO可以使用直接缓冲区允许OS使用DMA对某些操作(从网络连接读取例如直接进入存储器映射文件),从而避免数据复制到中间缓冲器.

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


Mic*_*ker 11

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


Guv*_*nte 0

我不能具体谈论这项技术,但异步库提供同步操作以方便调试的情况并不罕见。

例如,如果您遇到问题,您可以消除逻辑的异步部分,而无需重写整个流程。这特别有用,因为同步进程通常更容易使用。