所以我在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);
答案 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)
我所知道的原因是:
Q使用Object.freeze,这会使V8减慢幅度
许多nextTick调用(已在评论中提及)。然而,对于最新的Node.js版本(v0.10),这应该不是那么多,因为nextTick开销很小。