2014-09-25 20 views
5

Tôi đã tự hỏi liệu chúng ta có thể đo thời gian cần cho một yêu cầu http được hoàn thành bằng cách sử dụng node.js. Sửa đổi một chút ví dụ từ tài liệu (here), người ta có thể dễ dàng viết xuống đoạn mã sau. Thời gian đo trên các yêu cầu http node.js http

var http = require('http'); 
 
var stamp1 = new Date(); 
 
var stamp2, stamp3, stamp4; 
 
var options = { 
 
    hostname: 'www.google.com', 
 
    port: 80, 
 
    path: '/upload', 
 
    method: 'POST' 
 
}; 
 

 
var req = http.request(options, function(res) { 
 
    stamp3 = new Date(); 
 
    console.log('STATUS: ' + res.statusCode); 
 
    console.log('HEADERS: ' + JSON.stringify(res.headers)); 
 
    res.setEncoding('utf8'); 
 
    res.on('data', function (chunk) { 
 
    console.log('BODY: ' + chunk); 
 
    }); 
 
    res.on('end', function() { 
 
    stamp4 = new Date(); 
 
    console.log ("Stamp 3: " + stamp3); 
 
    console.log ("Stamp 4: " + stamp4); 
 
    }); 
 
}); 
 
req.on('error', function(e) { 
 
    console.log('problem with request: ' + e.message); 
 
}); 
 

 
// write data to request body 
 
req.write('data\n'); 
 
req.write('data\n'); 
 
req.end(); 
 

 
stamp2 = new Date(); 
 
console.log ("Stamp 1: " + stamp1); 
 
console.log ("Stamp 2: " + stamp2);

Bây giờ hãy để tôi đến quan điểm của tôi. Trên phản ứng người ta có thể dễ dàng đo thời gian cần thiết cho phản ứng, kể từ khi bắt đầu stamp3 được thiết lập và trên tem kết thúc 4 được thiết lập. Vì vậy, về nguyên tắc cho lượng dữ liệu tương đối lớn, hai dấu thời gian này sẽ khác nhau.

Tuy nhiên, câu hỏi tôi có là tem 1 và 2 thực sự đo lường những gì đang xảy ra khi yêu cầu đang được chuẩn bị và gửi đi. Nói cách khác, là req.write (....) một hoạt động đồng bộ? Dựa trên nguyên lý node.js, tôi mong đợi req.write (...) là một hoạt động không đồng bộ, nơi người ta có thể chuyển một tài liệu lớn tùy ý và sau khi hoàn thành thành công, chúng ta có thể gọi lại khi biết rằng yêu cầu đã kết thúc.

Nhận xét?

+2

bạn có thể muốn tạo một hàm tiện ích để thực hiện các phép đo và bạn có thể nhận được một thực tế d uration bằng cách sử dụng 'Date.now()' trong khi trừ dấu thời gian thứ hai từ dấu thời gian đầu tiên. Cũng lưu ý rằng bạn có thể đo bằng nano giây với [process.hrtime] (http://nodejs.org/api/process.html#process_process_hrtime). –

+0

Cảm ơn, tôi thích đề xuất process.hrtime vì tôi không biết về nó! Theo phép trừ, đó chính là điểm của tôi cuối cùng cho phép đo thực tế. – MightyMouse

Trả lời

0

docs không đề cập đến gọi lại, vì vậy tôi giả sử req.write cũng như res.end để đồng bộ.

Vì vậy, trong trường hợp của bạn nếu bạn đang đề cập đến chỉ một yêu cầu mà bạn đang khởi tạo, tôi nghĩ rằng việc đo thời gian phải chính xác. Tôi không mong đợi sự khác biệt thời gian là rất lớn mặc dù (có lẽ ngay cả trong cùng một milisecond).

+0

Đây là lý do tại sao tôi đã sử dụng cụm từ "cho số lượng dữ liệu tương đối lớn", để các phép đo có thể được tắt hơn một phần nghìn giây. Mặt khác, res.on ('end', function() {....}); các công trình và tem4 nhận được dấu thời gian và tôi có thể thấy câu lệnh in. Mặt khác, một tuyên bố của form req.on ('end', function() {....}); không đặt tem2 đúng (giả sử stamp2 được đặt trong hàm xử lý sự kiện cho 'kết thúc' của yêu cầu và ngược lại với trình xử lý sự kiện cho 'kết thúc' của phản hồi). Vì vậy, có vẻ là một sự khác biệt nhỏ về cách yêu cầu và phản ứng được xử lý. – MightyMouse

1

Hai chức năng đã tồn tại cho rằng:

  • console.time (id), bắt đầu hẹn giờ
  • console.timeEnd (id) chấm dứt cuộc hẹn giờ, in id tiếp theo là thời gian tính bằng ms

Vì vậy, trong trường hợp của bạn:

var req = http.request(options, function(res) { 
    console.time('Requete: '); //Begin to count the time 
    stamp3 = new Date(); 
    console.log('STATUS: ' + res.statusCode); 
    console.log('HEADERS: ' + JSON.stringify(res.headers)); 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
     console.log('BODY: ' + chunk); 
    }); 
    res.on('end', function() { 
     stamp4 = new Date(); 
     console.log ("Stamp 3: " + stamp3); 
     console.log ("Stamp 4: " + stamp4); 
     console.timeEnd('Requete: '); //Will print "Requete: X" with X being the time in ms 
    }); 
}); 
+0

Tôi không nghĩ rằng bạn hiểu câu hỏi của tôi và tôi tự hỏi ai upvoted. Vì nó được đưa ra có thể tính toán thời gian thực hiện cho các phản ứng (res) chỉ đơn giản là vì dấu thời gian 4 được xác định trên các cuộc gọi lại có sẵn. Quan điểm của tôi là tôi không thể làm điều tương tự với yêu cầu (req). Nói cách khác, viết ra một cái gì đó dọc theo dòng req.on ('end', function() {....}); Làm cho cảm giác vấn đề mà tôi đang cố gắng mô tả? – MightyMouse

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