是什么让node.js SlowBuffers“慢”?

时间:2012-12-23 06:10:15

标签: performance node.js buffer

我正在使用node.js来提供一些存储在SQLite数据库中的PNG图像作为二进制BLOB。这些图像很小,平均为9500字节。

我正在使用the sqlite3 npm package,它似乎将二进制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吗?

帮助我理解为什么它们被称为“缓慢”缓冲区。

1 个答案:

答案 0 :(得分:14)

如果您阅读帖子:

  1. https://groups.google.com/forum/?fromgroups=#!topic/nodejs-dev/jd52ZsVSZNo
  2. https://groups.google.com/forum/?fromgroups=#!topic/nodejs/s1dnFbb-Rj8
  3. Node提供两种类型的缓冲区对象。 Buffer是一个原生的Javascript数据结构; SlowBuffer由C ++模块实现。使用本机Javascript环境中的C ++模块会花费额外的CPU时间,因此“慢”。 Buffer个对象由SlowBuffer个对象支持,但可以直接从Javascript读取/写入内容以获得更好的性能。

    大于8 KB的任何Buffer对象都由单个SlowBuffer对象支持。小于8 KB的多个Buffer对象可以由单个SlowBuffer对象支持。当内存中存在多个小于8 KB的Buffer个对象时(由单个SlowBuffer支持),如果您要为每个SlowBuffer使用Buffers,则C ++模块的惩罚可能非常高。小SlowBuffer经常被大量使用。

    This class is primarily for internal use表示如果您想自己管理服务器上的缓冲区,请使用SlowBuffer(要在较小的块中使用,您必须自己对Buffer进行分区)。除非您在处理缓冲区时需要那个微小的级别控制,否则使用{{1}}个对象应该没问题。