Node.js中的Buffer.concat与Buffer.copy

时间:2018-09-12 10:37:08

标签: node.js

我有两种在不同地方使用节点js Buffer的情况:

  1. 缓冲区累积,我有多个缓冲区,并将所有 他们在一起最后。
  2. 缓冲区编写器,我只需要在缓冲区大小调整时 不足以容纳更多数据。

很自然,对于第一种情况,我将使用Buffer.concat,对于第一种情况,我将使用Buffer.copy 第二种情况。但是,可以反向使用,我可以使用Buffer.copy 第一种情况,Buffer.concat用于第二种情况。

第一种情况的实现1 Buffer.concat,第二种情况的Buffer.copy

// first case: buffer accumulation
const result = Buffer.concat([arrayOfBuffers])

// second case: buffer writer
if (oldbuffer.length - offset < newdata.length) {
  const newsize = oldbuffer.length * growthFactor + newdata.length
  const newbuffer = Buffer.alloc(newsize)
  oldbuffer.copy(newbuffer)
  newdata.copy(newbuffer, offset)
  result = newbuffer
}
// newbuffer is the end result

实施2 Buffer.copy适用于第二种情况,Buffer.concat适用于第一种情况:

// first case: buffer accumulation
const totalSize = arrayOfBuffers.reduce((size, buff) => size + buff.length, 0)
const result = Buffer.alloc(totalSize)
let offset = 0
for (const buff of arrayOfBuffers) {
  buff.copy(result, offset)
  offset += buff.length
}

// second case: buffer writer
const result = Buffer.concat([oldbuffer, newdata])

我不知道concatcopy在节点js中如何内部工作。所以, 哪种方法最适合两种情况?

1 个答案:

答案 0 :(得分:0)

查看implementation of Buffer.concat:似乎完全按照您在实施2 /第一种情况下的建议进行了替换:创建一个具有计算出的总长度的新缓冲区,然后将所有缓冲区复制到输出中。

因此,基于此,继续直接使用Buffer.concat似乎是合理的,因为该代码更加简洁,易于理解并且可以更好地描述您想要执行的操作(“连接所有这些缓冲区!”)

对于编写者而言:您建议的实现并不等效-第一个实现将在末尾留出空间以添加新数据,而第二个实现恰好提供了现有缓冲区所需的空间。如果您需要额外的空间(例如,为将来的预期写入进行优化),请坚持使用第一个变体,否则将使用相同的参数:使用concat更简洁,更易于阅读。