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

2022-09-01 23:16:58

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

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

问题是:与传统同步相比,同步阻塞 NIO 与传统同步相比,是否有任何性能优势(java.io.*)?两者都是每个连接的线程。复杂性如何比较?

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


答案 1

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

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


答案 2

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


推荐