gpt4 book ai didi

Java:将 ByteBuffer 复制到 byte[] 数组是性能禁忌吗?

转载 作者:行者123 更新时间:2023-11-30 11:42:46 27 4
gpt4 key购买 nike

基本上,我的情况是这样的:

  1. 服务器将来自客户端连接的数据流式传输到名为inQueueByteBuffer 对象。这包含最新的数据流是什么
  2. 服务器必须处理每个流中的数据并期待特定格式的数据包
  3. 数据的有效载荷将被读入byte[]对象,然后单独处理

现在我的问题归结为:将剩余的缓冲区数据(有效负载)复制到 byte[] 数组是否会影响性能?

这是它的样子:

// pretend we're reading the packet ID and length
// int len = LENGTH OF PACKET PAYLOAD

/*
* Mark the starting position of the packet's payload.
*/
int pos = inQueue.position();

byte[] payload = new byte[len];
inQueue.get(payload);

// Process the packet's payload here

/*
* Set the inQueue buffer to the length added to the previous position
* so as to move onto the next packet to process.
*/
inQueue.position(pos + len);

如您所见,我基本上是这样做的:

  1. 标记完整缓冲区的位置,因为它就在有效载荷之前
  2. 将 inQueue 的内容复制到一个单独的 byte[] 对象
  3. 将完整缓冲区的位置设置在我们刚刚读取的有效负载之后,以便我们可以读取更多数据包

我担心的是,在执行此操作时,我正在通过复制缓冲区来浪费内存。请记住所使用的数据包永远不会超过 500 字节并且通常低于 100 字节

我的担忧是否成立,或者我是表现偏执狂? :p

最佳答案

你应该避免它。这就是 ByteBuffer 设计的全部原因:避免数据复制。

“在这里处理负载”到底是什么意思?

只要稍微重新安排其中发生的任何事情,您应该能够直接在 ByteBuffer 中执行此操作,首先调用 flip(),一个或多个 get()s 获取您需要的数据,然后 compact()(clear() 如果您确定它是空的),没有中间副本进入另一个字节[] 数组。

关于Java:将 ByteBuffer 复制到 byte[] 数组是性能禁忌吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529801/

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