是什么让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:

  1. https://groups.google.com/forum/?fromgroups=#!topic/nodejs-dev/jd52ZsVSZNo
  2. 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对象应该没问题。