【问题标题】:Node.JS + Zlib + Q (promises) - How do I change compression performance in a sugar way?Node.JS + Zlib + Q (promises) - 如何以糖的方式改变压缩性能?
【发布时间】:2014-03-27 12:30:53
【问题描述】:

我是糖的忠实粉丝。以下是Node.JS 中 gzip 压缩语句的工作原理:

var q = require('qtree');
var zlib = require('zlib');

q(someData)
.then(q.nbind(zlib.gzip, zlib))
.then(function(gzippedData) {
    // play with gzipped data
})
.done();

现在zlib.gzip 是一种便捷方法,根据Node Documentation
便捷方法对所有选项使用默认设置。

现在,如何为这些便捷方法设置(默认)选项?因为我不能在第一次使用相同的糖写作风格时:

var gzip = zlib.createGzip({
    level : zlib.Z_BEST_COMPRESSION
});

这个新的gzip 不是gzip(input, callback) 形式的函数,所以我不能那样使用它。

【问题讨论】:

  • 在 gzip.createGzip 之上创建您自己的 promisified 方法,该方法通过管道连接到它并挂钩它完成。然后调用该方法而不是 q.nbind... :)
  • 这是我试图规避的解决方案,因为任何好的“框架”都应该开箱即用地完成“大量工作”。我想出了一个简单的解决方案,我将作为答案发布。

标签: node.js compression gzip zlib q


【解决方案1】:

我想出了一个技巧来做我想做的事,而不必为每个必要的事件将zlib.createGzip() 包装在defers 中。只需更改默认压缩即可。它没有记录,但可以更改默认值:

zlib.Z_DEFAULT_COMPRESSION = 6;

但请注意,默认设置为-1,根据zlib 文档,即“最佳”速度/压缩比设置,通常等于8。但我不知道那件事。在Node.js 中,我有时会发现默认设置的压缩效果很差。

【讨论】:

  • 默认值可以更改且未记录在案的事实意味着这很容易在节点版本、节点次要版本甚至安全更新之间中断。不要依赖未指定的 API 行为。改为编写一个 4 行包装器,或者使用一个可以让您轻松完成此操作的库,例如 Bluebird 而不是 Q。
  • 没有实现监听器的 4 行包装器。否则,请成为我的客人,我很乐意接受您的回答。 “蓝鸟而不是 Q” 不是答案,只是一种偏好。 Q 更接近于 Promise SpecBluebird 的 API 命名选择不准确。蓝鸟唯一的优点是速度。 Q2 将改变这一点。我很欣赏任何建议,但出于不相关的原因无耻地插入 Bluebird 并不是建议。 (虽然赞成您的初步建议。:))
  • 有点跑题了,但无论如何:Fwiw - Bluebird 严格遵守 A+ 规范并通过了整个测试套件 - 只要 Kris 无法让 Petka 工作,它也会比 Q 快关于 Q :P 现在很多人喜欢 RSVP 的 Stef 都在试图帮助 Kris,但老实说,Petka 是唯一一个对 V8 编译器有深入了解的承诺库方,它优化了什么,去优化等等 - 他也更清楚新的优化,部分原因是他自己在 v8 中编写了一些优化。更不用说 Bluebird 堆栈跟踪等......只需对 v2 Q 分支进行基准测试。
  • 赞成,因为有趣但仍然不相关。 :P 我记得一个线程有一些关于 API 命名和其他(次要)细节的好点,BB(最初?)似乎没有考虑,所以我现在站在 Kris 一边。即使我没有,为一整套会激怒多人的项目替换一个库也不是“设置 zlib 默认值”的好方法。
  • 哦,是的,当 Petka 和 Domenic 解决这些 API 问题并修复已完成/已解决的命名时,这些 API 问题得到了相当快的解决——那是很久以前的事了 :) A+ 规范的全部要点,如果你可以交换的话走出图书馆,仍然可以正确地与其他图书馆互操作,而不会大惊小怪。无论如何,您只需要一个 return new Promise(function(resolve,reject){... 为输入创建 readStream 的方法(可能使用 resumer,因为这很容易),将其通过管道传输到 createGZip ,然后执行 .on("data",function(){ /* accumulate */}).on("end",resolve.bind(null,data)).on("error",reject);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多