由已分配的 ByteString 支持的高效 okio 源代码?
Efficient okio Source backed by an already allocated ByteString?
使用 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() 调用会很快,因此整体的整体效果仍然很好。
使用 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() 调用会很快,因此整体的整体效果仍然很好。