问题标签 [zero-copy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Netty 使用来自池化直接 ByteBuf 的 ByteBuffer
我试图了解有关 netty 的 ByteBuf 及其与 nio.ByteBuffer 的关系的一些事情。
我试图解决的问题是我的服务器必须返回位于服务器上的文件的随机部分——这是使用 nio.FileChannel 实现的,而 FChannel 取决于 nio.ByteBuffer。
据我了解,分配直接 ByteBuffer 应该是池化的 - 但 nio 中没有本机池实现 - 我的应用程序应该添加这样的层,所以我不会为每个请求创建直接缓冲区而付出代价。
我的应用程序使用 netty 作为服务器,所以我认为我可以使用 netty 的池化直接 ByteBuff 并访问它使用的 ByteBuffer
所以一切都按预期工作,但.nioBuffer
或.nioBuffers
创建缓冲区的副本 - 不仅仅是 ByteBuff 上的视图,因此在写入chunkHolder
位置/限制/等后byteBuf
保持不变!
我必须使用
所以再次创建对象,唯一的好处是没有复制该内存-如果我没记错的话。
问题:我可以做一些更聪明的事情,以便在 tcp 传输和文件读取之间没有数据复制,并且垃圾最少?nio 是否有助于维护直接的 ByteBuffers?
我想到的最好的想法是用类似 ByteBuffer 的实现包装 BytBuf,并将所有写操作代理回底层 byteBuf。
PS:我也看过io/netty/channel/DefaultFileRegion.java
它与 nio.FileChannel 一起使用,但在幕后 netty 直接使用 nio
java - 通过 FileChannel 将 Netty ByteBuf 零复制到文件中
我想使用FileChannels#transferFrom将从 SocketChannel 接收的Netty DirectByteBuf零复制到文件中。我利用 ReadableByteChannel 接口创建了一个 ByteChannel 来读取,如下所示:
调试它表明这ByteBuffer dst
是一个 HeapByteBuffer。这样零拷贝是不可能的。有没有机会在ByteBuf content
不触及用户空间的情况下让我进入文件?我真的必须将 SocketChannel 直接读入文件吗?
更新
调试FileChannel
使我意识到,这transferFrom
仅适用于文件到文件的传输。一个简单fileChannel.write(directBuffer)
的应该做零拷贝。唯一让我有点困扰的是我的 corretto java 无法加载write0
. 这是否意味着性能较低或是否意味着副本不是零副本?
c++ - 有没有办法制作一个引用外部提供的缓冲区但不拥有它的 std::string ?
基本上,如果一个人有一个空终止字符串的预加载缓冲区和要引用的长度,并且想要将对它的引用传递给一个采用 std::string & 但不复制字符串或拥有它的方法,是吗有可能吗?
这只会有一个有限的生命周期,它的管理方式是它只在缓冲区有效时才有效。
java - 如何使用java实现网络零拷贝到磁盘?
我想从网络下载文件,我可以使用零拷贝的java吗?