具有以简单直接的方式解释复杂事物的天赋的人可以解决这个问题吗?使用 Java NIO 进行网络 I/O 时,为了获得最佳性能,何时应使用直接 ByteBuffer 与常规 ByteBuffer?
例如:我应该读入堆缓冲区并从那里解析它,执行多次 get() (逐字节)还是应该将其读入直接缓冲区并从直接缓冲区解析?
使用 Java NIO 进行网络 I/O 时,为了获得最佳性能,何时应使用直接 ByteBuffer 与常规 ByteBuffer?
直接缓冲区有许多优点
- 避免在 Java 和本机内存之间传递额外的数据副本。
- 如果重新使用它们,则只有使用过的页面才会变成真实内存。这意味着您可以将它们设置得比需要的大得多,而且它们只会浪费虚拟内存。
- 您可以有效地按本机字节顺序访问多字节原语。 (基本上是一条机器代码指令)
我应该读入堆缓冲区并从那里解析它,执行多次 get() (逐字节)还是应该将其读入直接缓冲区并从直接缓冲区解析?
如果您一次读取一个字节,您可能不会获得太多优势。但是,使用直接字节缓冲区,您可以一次读取 2 或 4 个字节,并一次有效地解析多个字节。
[实时] [选择器]
如果您正在解析实时数据,我会避免使用选择器。我发现使用阻塞 NIO 或忙等待 NIO 可以为您提供最低的延迟性能(假设您的连接数量相对较少,例如最多 20 个)
编辑:这是一个相对易于使用的高性能库,它使用您可以利用的阻塞 NIOhttps://github.com/OpenHFT/Chronicle-Wire/tree/ea/src/main/java/net/openhft/chronicle/wire/channel
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)