使用Node.js优化缓冲区大小?

我有一种情况,我需要采取一个stream,并把它组装成缓冲区。 我打算编写一个对象转换stream,它将定期input数据,并输出缓冲区对象(其中缓冲区都是相同的大小)。 也就是说,如果我的chunker转换configuration为8KB,并且写入了4KB,那么在输出8KB的Buffer实例之前,它将等待直到写入额外的4KB。

我可以select缓冲区的大小,只要在8KB到32KB的范围内。 有一个最佳尺寸可供select吗? 我很好奇的原因是Node.js文档提到使用SlowBuffer来备份缓冲区,并分配最小8KB:

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

这是否意味着8KB是一个有效的大小,如果我使用了12KB,将会分配两个8KB SlowBuffers? 还是仅仅意味着最小的有效大小是8KB? 那么简单地使用8KB的倍数呢? 或者,这根本不重要?

基本上这就是说,如果你的Buffer小于8KB,它会试图将它装入预先分配的8KB内存块。 它将继续把Buffer s放在那个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); } 

看这个,看起来好像它只会把Buffer放到一个预先分配的区块,如果它小于或等于4KB( Buffer.poolSize >>> 1 ,当Buffer.poolSize = 8 * 1024时是4096 ) 。

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