上下文
我有一个使用NIO的应用程序。它有一个可插拔的传输机制,我正在根据传输基准测试各种底层传输的执行情况。 IO性能很重要,应用程序只能与同一台计算机上的其他进程通信,因此我使用TCP套接字,UDP套接字,FileChannel
和几个UNIX_AF套接字库的非阻塞包装器进行测试
为了获得这些基准测试,并对这个系统进行测试,最快可能的是"#34;控制组实现,使用标准NIO函数遍历整个服务器/处理堆栈,但以线程/内存访问的速度运行。
问题:
如何实现可以与NIO生态系统的其余部分一起使用的Channel
实现,但是只执行内存中的用户空间操作?基本上,我想要替换通过epoll
/ select
/ kevent
/等访问的底层传输系统。使用线程安全的数据结构访问。
我尝试过的事情:
我已使用Pipe
(通过默认创建的Pipe.SinkChannel
和Pipe.SourceChannel
个对象)设置解决方案,该解决方案可用于测试。
然而,Java告诉我管道由KQueue通道支持,strace
似乎证实了这一点。文档表明Pipes将根据使用它们的环境选择后端。因此,Pipes对于基准测试不会太有用,因为Pipe
实现的性能将根据我正在进行基准测试的操作系统而改变。
我知道管道可能比做老式学校更快/更有效率#34;通过队列结构在线程之间传递数据,但第二种方法在主机环境中的性能可能更加一致。
答案 0 :(得分:1)
我将实现ByteChannel,使用内部分配的字节数组作为缓冲区自己编写代码,同步访问以确保刷新到主内存。这将强制执行内存复制,这样可以避免nio的字节缓冲区类中的可能效率,并使时序更具可重复性。