【问题标题】:Write raw binary data to Buffer将原始二进制数据写入 Buffer
【发布时间】:2019-04-21 11:58:16
【问题描述】:

我正在开发一个迭代 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
}

我觉得如果有某种方法可以将“原始数据”从给定偏移量直接写入预先分配大小的缓冲区,那么这些性能繁重的操作(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 似乎只适用于字符串,虽然这将是理想的......

【问题讨论】:

    标签: javascript node.js buffer


    【解决方案1】:

    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);
      }
    

    【讨论】:

    • 我选择了 Buffer.copy,这正是我想要的……我想我被方法名称误导了。谢谢!
    • 请注意,您在Buffer.copy 上反转了参数(在我的例子中是source.copy(target, ...),所以grain.copy(buf, ...))。我猜只是一个错字。
    猜你喜欢
    • 2017-06-03
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多