JavaNIO适合低延迟还是高吞吐量?

JavaNIO适合低延迟还是高吞吐量?,java,nio,nonblocking,throughput,low-latency,Java,Nio,Nonblocking,Throughput,Low Latency,我对JavaNIO还不熟悉,并且已经使用过一点。我有一个一般性的问题。如果您正在设计一个超低延迟应用程序与高吞吐量应用程序,那么这两个应用程序中的哪一个明显受益于使用非阻塞IO 我的理解是,非阻塞IO肯定有助于提高吞吐量,因为工作线程不会阻塞,因此不会等待响应,并且可以自由触发新请求,直到以前的请求得到服务。一旦我们得到以前触发的请求的响应,工作线程就可以异步处理它们,从而提高吞吐量 然而,我无法看到非阻塞IO如何直接为低延迟应用程序带来好处 我想“异步行为是避免争用的一个很好的方法。”如果是这

我对JavaNIO还不熟悉,并且已经使用过一点。我有一个一般性的问题。如果您正在设计一个超低延迟应用程序与高吞吐量应用程序,那么这两个应用程序中的哪一个明显受益于使用非阻塞IO

我的理解是,非阻塞IO肯定有助于提高吞吐量,因为工作线程不会阻塞,因此不会等待响应,并且可以自由触发新请求,直到以前的请求得到服务。一旦我们得到以前触发的请求的响应,工作线程就可以异步处理它们,从而提高吞吐量

然而,我无法看到非阻塞IO如何直接为低延迟应用程序带来好处

我想“异步行为是避免争用的一个很好的方法。”如果是这样,低争用意味着低延迟。因此,NIO可能有助于降低延迟。这有意义吗?

“异步行为是避免争用的一种很好的方法。”-仅当使用单线程时。如果线程太多,争用是不可避免的。您必须使用MultiThreading(有或没有NIO)来获得高吞吐量和/或低延迟

NIO只能帮助保持较低的线程数量(大约可用处理器的数量),从而节省内存(每个线程消耗大量内存),并允许大量的同时连接,但通常比阻塞IO的性能更差。

这一切都取决于…:)


  • 如果你同时有很多线程,那么你的帖子主要由非序列组成。这里很难找到一个可回答的问题。@EJP,如果不清楚,我道歉。我只是想知道使用NIO是否能使低延迟应用程序受益。如果是,怎么做?我会很惊讶的。对于阻塞I/O和线程,您可以使用操作系统实现的任何调度机制,并且可以打赌它是经过高度调优的。使用NIO,您可以通过对就绪选择键进行线性扫描的形式提供自己的调度,如果不十分小心,您也会在选择之间浪费时间。在大多数情况下,低延迟和高槽输出实际上是相互冲突的要求。您可以优化带宽使用(例如套接字连接),这将反过来恶化延迟(因为所有挂起的数据都需要在特定数据块通过之前传输),也可以优化延迟(在这种情况下,您希望限制发送的数据量,以确保其快速通过)。选择你的毒药。