Bra*_*rad 5 buffer memory-management allocation node.js
我有一种情况,我需要获取一个流并将其分块到缓冲区中。我计划编写一个对象转换流,它接受常规输入数据,并输出 Buffer 对象(其中缓冲区的大小都相同)。也就是说,如果我的 chunker 转换配置为 8KB,并且写入了 4KB,它会等待直到写入额外的 4KB,然后才会输出 8KB 的 Buffer 实例。
我可以选择缓冲区的大小,只要它在 8KB 到 32KB 的范围内即可。是否有最佳尺寸可供选择?我很好奇的原因是Node.js 文档提到使用 SlowBuffer来支持 Buffer,并分配至少 8KB:
为了避免在服务器的生命周期内为小块内存分配许多 C++ Buffer 对象的开销,Node 以 8Kb(8192 字节)的块分配内存。如果缓冲区小于此大小,则它将由父 SlowBuffer 对象支持。如果大于这个,那么Node会直接为其分配一个SlowBufferslab。
这是否意味着 8KB 是一个有效的大小,如果我使用 12KB,将分配两个 8KB 的 SlowBuffers?还是仅仅意味着最小的有效大小是 8KB?简单地使用 8KB 的倍数怎么样?或者,根本就没有关系?
基本上它是说,如果你的内存Buffer小于 8KB,它会尝试将其放入预先分配的 8KB 内存块中。它会不断地将Buffers 放入该 8KB 块中,直到无法容纳为止,然后它会分配一个新的 8KB 块。如果Buffer大于 8KB,它将获得自己的内存分配。
您实际上可以通过查看此处缓冲区的节点源来了解发生了什么:
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);
}
Run Code Online (Sandbox Code Playgroud)
看看这个,实际上看起来只有Buffer当它小于或等于 4KB 时才会将其放入预分配的块中(Buffer.poolSize >>> 1即4096当Buffer.poolSize = 8 * 1024)。
至于根据您的情况选择最佳尺寸,我认为这取决于您最终使用它的用途。但是,一般来说,如果您想要小于或等于 8KB 的块,我会选择小于或等于 4KB 的块,这些块将均匀地适合 8KB 预分配(4KB、2KB、1KB 等)。否则,大于 8KB 的块大小不会产生太大差异。
| 归档时间: |
|
| 查看次数: |
2400 次 |
| 最近记录: |