是什么让node.js SlowBuffers“慢”?
我使用node.js为一些存储在SQLite数据库中的PNG图像提供二进制BLOB。 这些图像很小,平均9500字节。
我正在使用sqlite3 npm软件包 ,它似乎将返回二进制BLOB对象作为SlowBuffers
。 我的node.js服务在内存中保存这些SlowBuffers
来缓解IO延迟,像这样服务它们:
response.send(slowBuffer);
看起来, SlowBuffer
有一个类似于Buffer
的接口; 转换成Buffer
是微不足道的:
var f = function(slowBuffer) { var buffer = new Buffer(slowBuffer.length); slowBuffer.copy(buffer); return buffer; }
我应该将这些SlowBuffers
转换为Buffers
?
帮我理解为什么他们被称为“缓慢”的缓冲区。
如果你会阅读这些post:
- https://groups.google.com/forum/?fromgroups=#!topic/nodejs-dev/jd52ZsVSZNo
- https://groups.google.com/forum/?fromgroups=#!topic/nodejs/s1dnFbb-Rj8
节点提供两种types的缓冲区对象。 Buffer
是一个本地的Javascript数据结构; SlowBuffer
是由一个C ++模块实现的。 在原生Javascript环境中使用C ++模块需要额外的CPU时间,因此“慢”。 Buffer
对象由SlowBuffer
对象支持,但是可以直接从Javascript读取/写入内容以获得更好的性能。
大于8 KB的任何Buffer
对象都由一个SlowBuffer
对象支持。 小于8 KB的多个Buffer
对象可以由一个SlowBuffer
对象支持。 当内存中有许多小于8 KB的Buffer
对象(由一个SlowBuffer
支持)时,如果您SlowBuffer
为每个Buffer
对象使用一个SlowBuffer
,则C ++模块的惩罚可能非常高。 小型Buffers
经常大量使用。
This class is primarily for internal use
意思是如果你想自己pipe理服务器上的缓冲区,那么使用SlowBuffer
(要使用更小的块,你必须自己对SlowBuffer
进行分区)。 除非你想在处理缓冲区中使用这个微小的级别控制,否则使用Buffer
对象应该没问题。