将原始二进制数据写入缓冲区
Write raw binary data to Buffer
我正在开发一个遍历 PCM data 的函数。我得到了不同大小的数据块,我目前正在通过缓冲区连接来处理这个问题。问题是,我很确定这种方法是性能杀手。
最简单的算法之一包括将 500 个 4800 字节的块(= grain)分块,并像这样重复它们 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
}
我觉得如果有某种方法可以直接将 "raw data" 从给定偏移量写入预先分配大小的缓冲区,则可以避免这些性能繁重的操作(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 似乎只适用于字符串,尽管这是理想的...
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);
}
我正在开发一个遍历 PCM data 的函数。我得到了不同大小的数据块,我目前正在通过缓冲区连接来处理这个问题。问题是,我很确定这种方法是性能杀手。
最简单的算法之一包括将 500 个 4800 字节的块(= grain)分块,并像这样重复它们 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
}
我觉得如果有某种方法可以直接将 "raw data" 从给定偏移量写入预先分配大小的缓冲区,则可以避免这些性能繁重的操作(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 似乎只适用于字符串,尽管这是理想的...
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);
}