gpt4 book ai didi

javascript - 将原始二进制数据写入缓冲区

转载 作者:行者123 更新时间:2023-12-02 23:47:37 25 4
gpt4 key购买 nike

我正在开发一个迭代 PCM data 的函数。我正在获取不同大小的数据 block ,目前我正在通过缓冲区串联来处理它。问题是,我非常确定这种方法是性能 killer 。

最简单的算法之一是对 500 个 4800 字节(=grain)的 block 进行分块,然后重复它们 3 次:

buf = <grain1, grain1, grain1, ..., grain500, grain500, grain500>
function(){
// ...
let buf = Buffer.alloc(0) // returned buffer, mutated

// nGrains is defined somewhere else in the function
// example: nGrains = 500
for(let i=0;i<nGrains;i++){
// a chunk of PCM DATA
// example: grain.byteLength = 4800
const grain = Buffer.from(this._getGrain())

// example: nRepeats = 3
for(let j=0;j<nRepeats;j++)
buf = Buffer.concat([buf, grain])
}

return buf
}

我觉得如果有某种方法可以直接将给定偏移量的“原始数据”写入预先分配大小的缓冲区,则可以避免这些性能繁重的操作(1500 个变异串联)。我制作了以下辅助函数,这给我带来了巨大的性能改进,但我觉得我做错了什么......

function writeRaw(buf, rawBytes, offset) => {
for(i=0;i<rawBytes.byteLength;i++){
buf.writeUInt8(rawBytes.readUInt8(i), offset + i)
}

return buf
}

我的函数现在看起来像这样:

function(){
// ...
const buf = Buffer.alloc(len) // returned buffer, immutable

for(let i=0;i<nGrains;i++){
const grain = Buffer.from(this._getGrain())

for(let j=0;j<nRepeats;j++)
writeRaw(buf, grain, (i * nRepeats + j) * grainSize)
}

return buf
}

我的问题是:是否有更干净的方法(或更标准的方法)来执行此操作,而不是迭代字节? Buffer.write似乎只适用于字符串,尽管这是理想的......

最佳答案

Buffer.copy .

const buf = Buffer.alloc(len);

for(let i = 0; i < nGrains; i++){
const grain = Buffer.from(this._getGrain());

for(let j=0;j<nRepeats;j++)
grain.copy(/*to*/ buf, /*at*/ (i * nRepeats + j) * grainSize);
}

您还可以使用 Buffer.fill :

  const buf = Buffer.alloc(len);

for(let i = 0; i < nGrains; i++) {
const grain = Buffer.from(this._getGrain());
buf.fill(grain, i * nRepeats * grainSize, (i + 1) * nRepeats * grainSize);
}

关于javascript - 将原始二进制数据写入缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55782503/

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