javanio在阻塞模式下相对于传统I/O的优势?

javanio在阻塞模式下相对于传统I/O的优势?,java,performance,io,nio,blocking,Java,Performance,Io,Nio,Blocking,我已经决定不使用异步、非阻塞的JavaNIO。总体而言,复杂性与效益之间的关系是非常值得商榷的,我认为在这个项目中不值得这样做 但我读到的关于NIO的大部分内容,以及与旧版本java.io.*的比较,都集中在非阻塞、异步NIO与使用java.io.*的每连接线程同步I/O之间。然而,NIO可以在同步、阻塞、每连接线程模式中使用,这似乎很少被讨论 问题是:与传统的同步阻塞I/O(java.io.*)相比,同步阻塞NIO有什么性能优势吗?两者都是每个连接的线程。复杂性如何比较 请注意,这是一个一般性

我已经决定不使用异步、非阻塞的JavaNIO。总体而言,复杂性与效益之间的关系是非常值得商榷的,我认为在这个项目中不值得这样做

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

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


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

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


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

它基本上可以归结为并发连接的数量以及这些连接的繁忙程度。阻塞(每个连接的标准线程)在延迟和吞吐量方面都更快(对于一个简单的echo服务器,速度大约是后者的两倍)。因此,如果您的系统能够为每个连接维护一个线程(NIO相对于“传统”IO的优势在于,NIO可以使用允许操作系统使用DMA进行某些操作(例如,从网络连接直接读取内存映射文件),从而避免将数据复制到中间缓冲区


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

+1注意-复杂性应该很可怕。不能将每个线程连接与阻塞操作一起使用,每个连接需要2个线程。(继续)…除非您只是执行请求/响应操作。如果使用socket.getInputStream.read(),您将失去直接缓冲区的所有好处,但impl.仍然使用选择器阻止读取。我不知道为什么(以及在哪个操作系统上)它应该有好处。提到NIO在阻塞模式下更快…我同意这取决于你想处理多少并发连接。我的阈值是100而不是1000。1000个线程是一个应用程序可以容纳的大量线程。(+1)@Michael Barker为什么在延迟和吞吐量方面每个连接阻塞线程的速度更快?不确定,可能是更短/更简单的内核转换。+1 NIO包使用的是
Buffer
s系统,而不是
InputStream
s和
OutputStream
s系统(java.io.*使用的)。