2

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

  1. 服务器将数据从客户端连接流式传输到ByteBuffer名为inQueue的对象。这包含最新的数据流
  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

4

2 回答 2

1

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

'在这里处理有效负载'到底是什么意思?

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

于 2012-07-18T04:07:26.873 回答
0

这不仅没有必要,而且为了回答您的问题,即使扩大规模,您也不会注意到性能变化。

于 2012-07-17T20:23:18.667 回答