2013-03-27 22 views
10

Vì vậy, tôi đã tạo máy chủ thử nghiệm đơn giản này trong Node.js
Bất cứ khi nào tôi trả lời trực tiếp, tôi nhận được yêu cầu yêu cầu/giây (nhanh!). Khi tôi chỉ quấn Q đơn giản được hoãn lại, nó giảm xuống còn yêu cầu/giây (4 lần chậm hơn!). Ai có thể giải thích rằng sự khác biệt lớn?Làm thế nào để Q trì hoãn quá chậm trên Node.js?

// 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

Dường như lời hứa Q thực sự chậm, tôi chỉ đọc [this] (http://dailyjs.com/2013/03/27/node-roundup/) đề cập đến [Thư viện nguyện] (https: // github. com/dfilatov/jspromise) dường như nhanh hơn 50 lần so với Q. – robertklep

+1

Tôi đang kiểm tra https://github.com/medikoo/deferred vào lúc này, và dường như không có phí nào (hoặc nhận được ở mức 2200) reqs/giây đều đặn). Tôi thực sự tò mò tại sao Q quá chậm ... –

+1

Duyệt qua mã Tôi nhận thấy nó sử dụng 'process.nextTick()' rất nhiều, điều này có thể làm chậm đáng kể mọi thứ. – robertklep

Trả lời

5

Những lý do tôi nhận thức, bao gồm:

  1. Q sử dụng Object.freeze, và điều đó làm chậm V8 bởi độ lớn

  2. Nhiều nextTick gọi (đã được đề cập trong ý kiến) . Tuy nhiên, điều này không phải là nhiều trường hợp với phiên bản Node.js mới nhất (v0.10), vì có chi phí tiếp theo là tối thiểu.

+2

: sử dụng một lib bị trì hoãn khác :) –

+8

Q đã trả lời vấn đề này một thời gian trước — nó không còn sử dụng Object.freeze nữa. Chúng tôi cũng hủy đăng ký 'nextTick' càng nhiều càng tốt. Tuy nhiên, chúng tôi vẫn sử dụng 'nextTick' thường xuyên. –

+0

@WillemMulder bất kỳ đề xuất nào? – mikeybaby173

21

Edit: Hiệu suất đã cải thiện rất nhiều kể từ khi stacktraces đã được tắt từ Q 0.9.6. (Chúng có thể được kích hoạt lại để gỡ lỗi với Q.longStackSupport = true;)

Bản gốc: Lời hứa Q rất chậm vì chúng ghi lại dấu vết ngăn xếp đầy đủ trên mọi lời hứa để giúp gỡ lỗi. Điều này rất chậm. Bạn có thể tắt chúng bằng Q.longStackJumpLimit = 0; (có thể là mặc định trong phiên bản tiếp theo). Chúng tôi đã tìm thấy khoảng 30 lần tăng tốc bằng cách tắt chúng đi. Bạn có thể tìm hiểu thêm tại đây https://github.com/kriskowal/q#long-stack-traces

Cũng có một số performance work on the nextTick implementation, nhưng tôi nghĩ rằng ở trên là lý do chính.

+0

Cảm ơn, thông tin tuyệt vời! :-) –

+0

Ứng dụng của tôi nhanh hơn gấp 3 lần với 1 dòng! * cung 3 lần * –

+3

Trong Q 0.9.6, dấu vết ngăn xếp dài hiện bị tắt theo mặc định. –

Các vấn đề liên quan