10

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

2 回答 2

21

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

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

nextTick 实现也有一些性能工作,但我认为以上是主要原因。

于 2013-04-10T00:32:50.923 回答
5

我知道的原因是:

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

  2. 许多 nextTick 调用(已经在评论中提到)。然而,对于最新的 Node.js 版本(v0.10)来说,这种情况不应该如此,因为 nextTick 开销很小。

于 2013-03-28T13:13:58.160 回答