4

在使用 NIO.2 AIO 功能进行项目时,我查看了“旧”NIO 选择器实现,发现在 Windows 上使用了默认的选择功能,由于内部实现不好,它在 Windows 上根本无法缩放。每个人都知道,在 windows 上 IOCP 是唯一真正的解决方案。当然,完成时回调模型不适合 NIO 选择器模型,但这是否实际上意味着在 Windows 上使用 NIO 基本上不是一个好主意?

例如:新的 AIO 功能包括 IOCP 实现。

在使用已放弃对 AIO 的支持的最新 Netty 框架时尤其如此。所以 Netty 在 Windows 上的速度不如它可能的快?

4

3 回答 3

4

NIO.2 使用 IOCP

下面的调用树通过在几个被调用的类名中使用“Iocp”来演示文件 i/o 的这一点,来自Java 7:NIO.2 File Channels on the test bench

另请参见sun.nio.ch.Iocp.javaAsynchronousChannelGroup ,“封装 I/O 完成端口的 Windows 实现”。

NIO 不使用 IOCP,因为它只支持“非阻塞 i/o”(选择器),而不支持仅在 NIO.2 中添加的“异步 i/o”(完成处理程序)。

在此处输入图像描述

于 2015-05-27T01:33:07.307 回答
3

我认为您将异步与更快混淆了。当然,NIO 缓冲区比序列化缓冲区中的相同数据要快,但是许多 AIO 技术会产生成本和延迟,这可以为同步 IO 带来优势。

不久前有一篇文章对各种 IO 技术进行了一些非常好的基准测试,结果(有点)令人惊讶。Netty 人可能决定与提到的性能更好(阻塞)的 IO 模型保持一致。

于 2014-05-21T19:08:53.893 回答
0

IOCP 和 Java 的问题在于 IOCP 创建和管理线程。我的理解是 IOCP 要在 Java 中工作,事件系统实际上必须通过 Windows IOCP 线程,然后调度到 Java ThreadPool 上执行。这使得 IOCP 在 Java 中与 C++/C# 相比非常昂贵。

AIO 可能已从 Netty 中删除,因为没有人愿意为了使用 AIO 而不是 NBIO 而牺牲 450,000 个潜在事务。AIO 和 NBIO 之间的事务性能差距是巨大的。

于 2017-10-04T15:00:06.327 回答