Java:将ByteBuffer复制到byte []数组是不是没有性能?

时间:2012-07-17 19:46:48

标签: java sockets memory bytebuffer

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

  1. 服务器将数据从客户端连接流式传输到名为 inQueue ByteBuffer对象。这包含最新的数据流
  2. 服务器必须处理每个流中的数据,并期望获得特定格式的数据包
  3. 数据的有效负载将被读入byte[]对象,然后单独处理
  4. 现在我的问题归结为: 将剩余的缓冲区数据(有效负载)复制到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. 只要有效负载转到单独的byte[]对象
    3. ,就复制inQueue的内容
    4. 将完整缓冲区的位置设置为我们刚读取的有效负载之后,以便我们可以读取更多数据包
    5. 我担心的是,在这样做时,我通过复制缓冲区来浪费内存。请记住使用的数据包永远不会超过500个字节,通常不到100个字节

      我的担忧是否有效,或者我是表现偏执狂? :P

2 个答案:

答案 0 :(得分:1)

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

这里的“处理有效负载”究竟是什么意思?

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

答案 1 :(得分:0)

这不仅是不必要的,而且,为了回答你的问题,即使在扩大规模时也不会发现性能变化。