Node.js的最佳缓冲区大小?

时间:2014-07-02 04:33:07

标签: node.js memory-management buffer allocation

我有一种情况,我需要将一个流并将其组合成Buffers。我计划编写一个对象变换流,它接受常规输入数据,并输出Buffer对象(缓冲区大小都相同)。也就是说,如果我的chunker转换配置为8KB,并且向其写入4KB,它将等到写入额外的4KB之后再输出8KB缓冲区实例。

我可以选择缓冲区的大小,只要它在8KB到32KB的球场。是否有最佳尺寸可供选择?我很好奇的原因是the Node.js documentation speaks of using SlowBuffer支持一个缓冲区,并分配至少8KB:

  

为了避免在服务器的生命周期中为小块内存分配许多C ++ Buffer对象的开销,Node以8Kb(8192字节)块的形式分配内存。如果缓冲区小于此大小,则它将由父SlowBuffer对象支持。如果它大于此值,那么Node将直接为它分配一个SlowBuffer slab。

这是否意味着8KB是一个有效的大小,如果我使用12KB,那么会分配两个8KB的SlowBuffers?或者它只是意味着最小的有效尺寸是8KB?简单地使用8KB的倍数怎么样?或者,这根本不重要吗?

1 个答案:

答案 0 :(得分:2)

基本上它说如果你的Buffer小于8KB,它会尝试将它放入预先分配的8KB内存块中。它会继续将Buffer放入该8KB块中,直到一个不适合,然后它将分配一个新的8KB块。如果Buffer大于8KB,它将获得自己的内存分配。

通过查看缓冲区here的节点源,您实际上可以看到发生了什么:

if (this.length <= (Buffer.poolSize >>> 1) && this.length > 0) {
  if (this.length > poolSize - poolOffset)
    createPool();
  this.parent = sliceOnto(allocPool,
                          this,
                          poolOffset,
                          poolOffset + this.length);
  poolOffset += this.length;
} else {
  alloc(this, this.length);
}

考虑到这一点,实际上看起来它只会将Buffer放入预先分配的块中,如果它小于或等于4KB(Buffer.poolSize >>> 1 4096时为Buffer.poolSize = 8 * 1024

至于在你的情况下选择的最佳尺寸,我认为这取决于你最终使用它的原因。但是,一般来说,如果你想要一个小于或等于8KB的块,我会选择一个小于或等于4KB的东西,它将均匀地适合8KB的预分配(4KB,2KB,1KB等)。 )。否则,大于8KB的块大小不应该产生太大差异。