在Node.js上,Q延迟是如此之慢?

所以我在Node.js中创build了这个简单的testing服务器
每当我做出直接的回应,我就会得到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); 

我知道的原因是:

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

  2. 许多nextTick电话(已在评论中提到)。 然而,最新的Node.js版本(v0.10)不应该如此,因为nextTick的开销很小。

编辑:自Q 0.9.6以来,由于堆栈轨迹被closures,所以性能大大提高。 (可以使用Q.longStackSupport = true;重新启用它们以进行debugging)

原文:Q承诺速度很慢,因为它们在每一个承诺上捕获一个完整的堆栈跟踪来帮助debugging。 这很慢。 你可以用Q.longStackJumpLimit = 0;closures它们Q.longStackJumpLimit = 0; (这可能是下一个版本的默认设置)。 我们通过closures大约30倍的速度。 你可以在这里find更多https://github.com/kriskowal/q#long-stack-traces

下一步的实施也有一些performance工作 ,但我认为以上是主要原因。