为什么Q延迟在Node.js上如此之慢?

时间:2013-03-27 20:47:04

标签: node.js deferred promise q

所以我在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);

2 个答案:

答案 0 :(得分:21)

编辑:由于自Q 0.9.6以来已关闭堆栈跟踪,因此性能得到了极大提升。 (可以使用Q.longStackSupport = true;

重新启用它们以进行调试

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

找到更多信息

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

答案 1 :(得分:5)

我所知道的原因是:

  1. Q使用Object.freeze,这会使V8减慢幅度

  2. 许多nextTick调用(已在评论中提及)。然而,对于最新的Node.js版本(v0.10),这应该不是那么多,因为nextTick开销很小。