9

我正在使用node.js来提供一些 PNG 图像,这些图像作为二进制 BLOB 存储在 SQLite 数据库中。这些图像很小,平均为 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;
}

我应该将这些转换SlowBuffersBuffers吗?

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

4

1 回答 1

14

如果你会阅读这些帖子:

  1. https://groups.google.com/forum/?fromgroups=#!topic/nodejs-dev/jd52ZsVSZNo
  2. https://groups.google.com/forum/?fromgroups=#!topic/nodejs/s1dnFbb-Rj8

Node 提供了两种类型的缓冲区对象。Buffer是原生 Javascript 数据结构;SlowBuffer由 C++ 模块实现。在本机 Javascript 环境中使用 C++ 模块会花费额外的 CPU 时间,因此会“慢”。Buffer对象由SlowBuffer对象支持,但可以直接从 Javascript 读取/写入内容以获得更好的性能。

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

This class is primarily for internal use意味着如果您想自己管理服务器上的缓冲区,则使用SlowBuffer(要在较小的块中使用,您必须SlowBuffer自己分区)。除非您希望在处理缓冲区时进行细微级别的控制,否则您应该可以使用Buffer对象。

于 2013-02-13T04:08:10.360 回答