【问题标题】:How come Q deferreds are so slow on Node.js?为什么 Q 延迟在 Node.js 上这么慢?
【发布时间】:2013-03-18 03:21:39
【问题描述】:

所以我在 Node.js 中创建了这个简单的测试服务器
每当我进行直接响应时,我都会收到 2200 个请求/秒(快!)。 当我只在它周围包裹一个简单的 Q 延迟时,它会下降到 580 个请求/秒(慢 4 倍!)。谁能解释一下这种巨大的差异?

// Requires
var server = require('http');
var q = require('q');

// Start server
var http = require('http');
http.createServer(function(request, response) {

    // Comment out either of two below sections

// Without deferred
// 2200 reqs/second
response.writeHead(200, {"Content-Type": "text/html"});
response.write("test");
response.end();

// Q deferred
// 580 reqs/second
var deferred = q.defer();
deferred.promise.then(function() {
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write("test");
    response.end();
});
deferred.resolve();
}).listen(1234);

【问题讨论】:

  • 显然 Q 承诺真的很慢,我刚刚读到 this 提到 Vow library 显然比 Q 快约 50 倍。
  • 我现在也在检查github.com/medikoo/deferred,它似乎也没有开销(稳定地达到 2200 请求/秒)。我真的很好奇为什么 Q 这么慢...
  • 浏览代码时我注意到它大量使用process.nextTick(),这可能会大大减慢速度。
  • node-jquery 怎么样,我很想知道它在性能方面的比较?
  • 我很想看看这些数据块刚刚包裹在 process.nextTick 中。

标签: node.js deferred promise q


【解决方案1】:

编辑:自从 Q 0.9.6 以来堆栈跟踪已关闭,性能已大大提高。 (可以使用Q.longStackSupport = true; 重新启用以进行调试)

原文:Q Promise 很慢,因为它们会在每个 Promise 上捕获完整的堆栈跟踪以帮助调试。这是非常缓慢的。您可以使用Q.longStackJumpLimit = 0; 关闭它们(这可能是下一版本的默认设置)。通过关闭它们,我们发现了大约 30 倍的加速。你可以在这里找到更多https://github.com/kriskowal/q#long-stack-traces

也有一些performance work on the nextTick implementation,但我认为以上是主要原因。

【讨论】:

  • 我的应用只用了 1 行就快了 3 倍! *鞠躬3次*
  • 在 Q 0.9.6 中,长堆栈跟踪现在默认关闭。
  • @Geert-Jan Mine 的速度提高了 10 倍!这个答案真的帮助了我。当我发现这篇文章时,我想知道哪里出了问题,并且即将重写我的应用程序的一个重要部分。谢谢!
【解决方案2】:

我知道的原因是:

  1. Q 使用 Object.freeze,这会大大降低 V8 的速度

  2. 许多 nextTick 调用(已在 cmets 中提及)。然而,最新的 Node.js 版本 (v0.10) 不应该是这种情况,因为 nextTick 开销很小。

【讨论】:

  • 建议:使用另一个延迟库 :)
  • Q 前段时间回应了这个问题——它不再使用 Object.freeze。我们也尽可能展开nextTick。然而,我们仍然经常使用nextTick
  • @WillemMulder 有什么建议吗?
  • @mikeybaby173 github.com/medikoo/deferred 很快,但可能还有很多其他产品更适合您的需求
猜你喜欢
  • 1970-01-01
  • 2013-03-03
  • 2012-11-13
  • 1970-01-01
  • 2019-06-28
  • 2016-10-24
  • 2021-09-26
  • 2016-04-19
  • 2010-10-29
相关资源
最近更新 更多