gpt4 book ai didi

java - 由已分配的 ByteString 支持的高效 okio 源?

转载 作者:太空宇宙 更新时间:2023-11-04 09:52:31 27 4
gpt4 key购买 nike

使用 OkHttp Websocket 时 listener使用 ByteString 向应用程序提供二进制有效负载。我想将这些字节输入到一些需要 okio.Source (在本例中为 GzipSource)的代码中,但我找不到任何有效的方法来做到这一点。

我当前的解决方案如下所示:

        @Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
Buffer gzipBuffer = new Buffer();
gzipBuffer.write(bytes);

GzipSource gzipSource = new GzipSource(gzipBuffer);
....
}

这个 Buffer.write 的缺点是它会产生额外的字节副本(在 Buffer 的情况下,会产生分段副本,即使合并起来也会产生额外的开销)。在这个 Websocket 示例中,只是为 ByteString 本身分配了一个字节数组(当从 WebSocketReader impl 移交时)。

我的问题是:是否有其他首选方式通过 Source 读取 ByteString ?由于 ByteString 应该是不可变的,而 Source 仅保存一些读取位置信息,我认为它应该是完全可行的(但不是来自外部代码,因为我无法访问 byte[])。所以感觉我在这里缺少一个明显的解决方案..:)

感谢您的任何提示或指示!

最佳答案

您编写的方式几乎是最佳的。

Okio 针对在转换层之间移动数据进行了优化:压缩、成帧、线程等。虽然在层之间移动数据的速度非常快(无副本),但最初将数据导入系统会产生前期成本。这通常是您需要执行的 I/O:加载文件或发送数据包。但在这种情况下,您必须复制才能将字节放入第一个缓冲区。这感觉效率低下,但好处是您的下一次 Source.read() 调用将会很快,因此整体效果仍然很好。

关于java - 由已分配的 ByteString 支持的高效 okio 源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54532432/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com