我有两种在不同地方使用节点js Buffer
的情况:
很自然,对于第一种情况,我将使用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])
我不知道concat
和copy
在节点js中如何内部工作。所以,
哪种方法最适合两种情况?
答案 0 :(得分:0)
查看implementation of Buffer.concat
:似乎完全按照您在实施2 /第一种情况下的建议进行了替换:创建一个具有计算出的总长度的新缓冲区,然后将所有缓冲区复制到输出中。
因此,基于此,继续直接使用Buffer.concat
似乎是合理的,因为该代码更加简洁,易于理解并且可以更好地描述您想要执行的操作(“连接所有这些缓冲区!”)
对于编写者而言:您建议的实现并不等效-第一个实现将在末尾留出空间以添加新数据,而第二个实现恰好提供了现有缓冲区所需的空间。如果您需要额外的空间(例如,为将来的预期写入进行优化),请坚持使用第一个变体,否则将使用相同的参数:使用concat
更简洁,更易于阅读。