मैं कॉलबैक के साथ जावास्क्रिप्ट कोड के निष्पादन समय को कैसे माप सकता हूं?


319

मेरे पास जावास्क्रिप्ट कोड का एक टुकड़ा है जिसे मैं node.jsदुभाषिया का उपयोग करके निष्पादित कर रहा हूं ।

for(var i = 1; i < LIMIT; i++) {
  var user = {
    id: i,
    name: "MongoUser [" + i + "]"
  };
  db.users.save(user, function(err, saved) {
    if(err || !saved) {
      console.log("Error");
    } else {
      console.log("Saved");
    }
  });
}

मैं इन डेटाबेस सम्मिलित कार्यों द्वारा लिए गए समय को कैसे माप सकता हूं? मैं कोड के इस टुकड़े के पहले और बाद की तारीख के मूल्यों के अंतर की गणना कर सकता था लेकिन कोड के अतुल्यकालिक स्वरूप के कारण यह गलत होगा।


8
बस db कॉल से पहले शुरू होने का समय, और अंत समय कॉलबैक
पढ़ें

एक संभावना है कि डीबी डालने का समय और कॉलबैक निष्पादित होने का समय समान नहीं है और यह माप में त्रुटि का परिचय देगा?
स्टॉर्मशॉ

1
नहीं, आपको इसकी चिंता नहीं करनी चाहिए, अगर db पुस्तकालय कोड अच्छी तरह से डिज़ाइन किया गया है और कॉलबैक फायरिंग से पहले किसी भी अन्य ऑपरेशन को नहीं करता है, तो आपको एक अच्छा उपाय प्राप्त करना चाहिए। आप लाइब्रेरी कोड के अंदर टाइमस्टैम्प लगाकर प्रविष्टि को प्रोफाइल भी कर सकते हैं, जहां डालने का प्रदर्शन वास्तव में आपके बजाय किया जाता है, लेकिन, फिर से, मैं इसके बारे में चिंता नहीं
करूंगा

मैं NodeTime की कोशिश करने की सलाह दूंगा जो आपको करने की कोशिश कर रहा है के लिए एक अच्छा फिट लगता है।
जूलियन नाइट

मैंने लिखा timerlogजो console.time()अतिरिक्त विशेषताओं के साथ समान है; github.com/brillout/timerlog
10

जवाबों:


718

Node.js console.time()और उपयोग करें console.timeEnd():

var i;
console.time("dbsave");

for(i = 1; i < LIMIT; i++){
    db.users.save({id : i, name : "MongoUser [" + i + "]"}, end);
}

end = function(err, saved) {
    console.log(( err || !saved )?"Error":"Saved");
    if(--i === 1){console.timeEnd("dbsave");}
};

31
नोड के लिए स्वच्छ और अंतर्निहित समाधान।
बहलुल उकार

45
> मैं जानना चाहता हूं कि इन डीबी इंसर्ट ऑपरेशंस द्वारा लिए गए समय को कैसे मापें। --- कंसोल.टाइम ईंड ("डीबीएसईवी") केवल टाइमिंग कंसोल के लिए आउटपुट करता है। आप इसका उपयोग आगे नहीं कर सकते हैं और कम लचीला है। यदि आपको वास्तविक समय मूल्य की आवश्यकता है, जैसे मूल प्रश्न में, आप कंसोल का उपयोग कर सकते हैं। समय (और "dbsave")
gogaman

@gogaman यह एक अच्छा बिंदु है, क्योंकि आप कंसोल से आउटपुट कैप्चर नहीं कर सकते हैं। समय (और)। शायद यह आउटपुट को एक फ़ाइल में पाइप करने और वहां से उपयोग करने के लिए उपयोगी हो सकता है?
डॉग मोलिनक्स

5
तो नीचे दिए गए उत्तर में कंसोल.टाइम () और प्रोसेस.ह्रेम () के बीच क्या अंतर है?
पीला-संत

3
एक नोट जोड़ने लायक होगा कि निष्पादन का समय तब प्रिंट किया जाता है, बस अब नए उपयोगकर्ता।
13:13 बजे janko-m

208

एक विधि है जो इसके लिए डिज़ाइन की गई है। प्रक्रिया की जाँच करें । समय ();

इसलिए, मैंने मूल रूप से इसे अपने ऐप में सबसे ऊपर रखा है।

var start = process.hrtime();

var elapsed_time = function(note){
    var precision = 3; // 3 decimal places
    var elapsed = process.hrtime(start)[1] / 1000000; // divide by a million to get nano to milli
    console.log(process.hrtime(start)[0] + " s, " + elapsed.toFixed(precision) + " ms - " + note); // print message + time
    start = process.hrtime(); // reset the timer
}

फिर मैं इसका उपयोग यह देखने के लिए करता हूं कि कार्यों में कितना समय लगता है। यहां एक मूल उदाहरण है, जो "output.txt" नामक एक पाठ फ़ाइल की सामग्री को प्रिंट करता है:

var debug = true;
http.createServer(function(request, response) {

    if(debug) console.log("----------------------------------");
    if(debug) elapsed_time("recieved request");

    var send_html = function(err, contents) {
        if(debug) elapsed_time("start send_html()");
        response.writeHead(200, {'Content-Type': 'text/html' } );
        response.end(contents);
        if(debug) elapsed_time("end send_html()");
    }

    if(debug) elapsed_time("start readFile()");
    fs.readFile('output.txt', send_html);
    if(debug) elapsed_time("end readFile()");

}).listen(8080);

यहाँ एक त्वरित परीक्षण है जिसे आप टर्मिनल (BASH शेल) में चला सकते हैं:

for i in {1..100}; do echo $i; curl http://localhost:8080/; done

3
यह किसी भी तरह से कंसोल.टाइम सॉल्यूशन से बेहतर है?
ख़ारिज

31
हां, यह बहुत अधिक सटीक है और आप परिणाम को एक चर में स्टोर कर सकते हैं
डलास क्लार्क

यह मेरे लिए काम करता है, क्योंकि मैं टाइमर को कई बार कॉल करना चाहता था
tbh__

2
आप process.hrtime(start)दो बार फोन क्यों करते हैं ? क्या इसकी कोई खास वजह है?
सोहेल सी

1
process.hrtime ([समय]), जहां समय एक वैकल्पिक पैरामीटर है जो पिछले प्रक्रिया का परिणाम होना चाहिए। वर्तमान समय के साथ अंतर करने के लिए कॉल () कॉल। यह वर्तमान कॉल और पिछले hrtime कॉल के बीच अंतर देता है।
नीलेश जैन

72

लागू console.time('label')मिलीसेकेंड में वर्तमान समय रिकॉर्ड करेगा, तो बाद में फोन कर console.timeEnd('label')उस बिंदु से अवधि को प्रदर्शित करेगा।

मिलीसेकंड में समय स्वचालित रूप से लेबल के साथ मुद्रित हो जाएगा, इसलिए आपको कंसोल प्रिंट करने के लिए एक अलग कॉल करने की आवश्यकता नहीं है: लेबल प्रिंट करने के लिए:

console.time('test');
//some code
console.timeEnd('test'); //Prints something like that-> test: 11374.004ms

अधिक जानकारी के लिए, मोज़िला के डेवलपर डॉक्स देखेंconsole.time


यह स्वीकृत उत्तर में क्या जोड़ता है ?
Dan Dascalescu

1
मेरे कोड का उपयोग करने के मेरे उत्तर के बाद स्वीकार किए गए उत्तर को संशोधित किया गया था
jfcorugedo

24

आश्चर्यचकित किसी ने अभी तक नए पुस्तकालयों में निर्मित का उल्लेख नहीं किया था:

नोड> = 8.5 में उपलब्ध है, और आधुनिक ब्राउजर में होना चाहिए

https://developer.mozilla.org/en-US/docs/Web/API/Performance

https://nodejs.org/docs/latest-v8.x/api/perf_hooks.html#

नोड 8.5 ~ 9.x (फ़ायरफ़ॉक्स, क्रोम)

// const { performance } = require('perf_hooks'); // enable for node
const delay = time => new Promise(res=>setTimeout(res,time))
async function doSomeLongRunningProcess(){
  await delay(1000);
}
performance.mark('A');
(async ()=>{
  await doSomeLongRunningProcess();
  performance.mark('B');
  performance.measure('A to B', 'A', 'B');
  const measure = performance.getEntriesByName('A to B')[0];
  // firefox appears to only show second precision.
  console.log(measure.duration);
  performance.clearMeasures(); // apparently you should remove entries...
  // Prints the number of milliseconds between Mark 'A' and Mark 'B'
})();

https://repl.it/@CodyGeisler/NodeJsPerformanceHooks

नोड 10.x

https://nodejs.org/docs/latest-v10.x/api/perf_hooks.html

const { PerformanceObserver, performance } = require('perf_hooks');
const delay = time => new Promise(res => setTimeout(res, time))
async function doSomeLongRunningProcess() {
    await delay(1000);
}
const obs = new PerformanceObserver((items) => {
    console.log('PerformanceObserver A to B',items.getEntries()[0].duration);
    performance.clearMarks();
});
obs.observe({ entryTypes: ['measure'] });

performance.mark('A');

(async function main(){
    try{
        await performance.timerify(doSomeLongRunningProcess)();
        performance.mark('B');
        performance.measure('A to B', 'A', 'B');
    }catch(e){
        console.log('main() error',e);
    }
})();

TypeError: performance.getEntriesByName is not a functionNode v10.4.1 में मुझे देता है
जेरेमी थिल

मैंने उदाहरण बनाया ताकि आप इसे ऑनलाइन चला सकें। यह नोड 9.7.1 है। यदि यह v10.4.1 में काम नहीं करता है, तो मुझे आश्चर्य है कि क्या बदल सकता है!
कोड़ी C

1
Stability: 1 - Experimentalशायद? :) nodejs.org/docs/latest-v8.x/api/…
जेरेमी थिएल

हाँ यकीन है कि यह बदल गया है। V10 में एक नया पर्यवेक्षक है, आप docs को njjs.org/docs/latest-v10.x/api/documentation.html पर देख सकते हैं । मौका मिलने पर अपडेट करूंगा!
कोड़ी C

19

किसी के लिए भी सांत्वना आउटपुट के बजाय समय व्यतीत करना चाहते हैं:

प्रक्रिया का उपयोग करें । () @ D.Deriso सुझाव के रूप में, नीचे मेरा सरल तरीका है:

function functionToBeMeasured() {
    var startTime = process.hrtime();
    // do some task...
    // ......
    var elapsedSeconds = parseHrtimeToSeconds(process.hrtime(startTime));
    console.log('It takes ' + elapsedSeconds + 'seconds');
}

function parseHrtimeToSeconds(hrtime) {
    var seconds = (hrtime[0] + (hrtime[1] / 1e9)).toFixed(3);
    return seconds;
}

16
var start = +new Date();
var counter = 0;
for(var i = 1; i < LIMIT; i++){
    ++counter;
    db.users.save({id : i, name : "MongoUser [" + i + "]"}, function(err, saved) {
          if( err || !saved ) console.log("Error");
          else console.log("Saved");
          if (--counter === 0) 
          {
              var end = +new Date();
              console.log("all users saved in " + (end-start) + " milliseconds");
          }
    });
}

5
मुझे यह पता लगाने के लिए सिंटैक्स '+ नई तिथि ()' देखना था कि इसका क्या मतलब था। इस उत्तर ( stackoverflow.com/a/221565/5114 ) पर टिप्पणियों के अनुसार , प्रदर्शन कारणों के साथ-साथ पठनीयता के लिए भी उस फॉर्म का उपयोग करना अच्छा नहीं है। मैं कुछ और अधिक क्रिया पसंद करता हूं ताकि यह पाठक के लिए स्पष्ट हो। इसका जवाब भी देखें: stackoverflow.com/a/5036460/5114
Mnebuerquo

3
मैं अक्सर var start = process.hrtime(); ... var end = process.hrtime(start);उच्च रिज़ॉल्यूशन समय प्राप्त करने के लिए उपयोग करता हूं (यदि मुझे उप मिलीसेकंड सटीकता की उम्मीद करने की आवश्यकता है)
एंड्री सिदोरोव

9

पुराने प्रश्न लेकिन एक साधारण एपीआई और हल्के वजन के समाधान के लिए; आप पूर्णता का उपयोग कर सकते हैं जो process.hrtimeआंतरिक रूप से उच्च-रिज़ॉल्यूशन वास्तविक समय ( ) का उपयोग करता है ।

var perfy = require('perfy');

function end(label) {
    return function (err, saved) {
        console.log(err ? 'Error' : 'Saved'); 
        console.log( perfy.end(label).time ); // <——— result: seconds.milliseconds
    };
}

for (var i = 1; i < LIMIT; i++) {
    var label = 'db-save-' + i;
    perfy.start(label); // <——— start and mark time
    db.users.save({ id: i, name: 'MongoUser [' + i + ']' }, end(label));
}

ध्यान दें कि प्रत्येक बार perfy.end(label)कहा जाता है, यह उदाहरण स्वतः नष्ट हो जाता है।

प्रकटीकरण: इस मॉड्यूल को लिखा, डीडारिसो के जवाब से प्रेरित है । यहां डॉक्स ।


2

आप एक कोशिश बेंचमार्क दे सकते हैं । यह उनके बीच कई प्लेटफार्मों का भी समर्थन करता है।


11
अच्छा होगा यदि आप एक उदाहरण जोड़ सकते हैं कि इस उपयोग के मामले के लिए बेंचमार्क।ज का उपयोग कैसे करें।
पेटा

2

आप एक्सटेकर को भी आजमा सकते हैं । यह आपको प्रतिक्रिया देता है जैसे:

var t = require("exectimer");

var myFunction() {
   var tick = new t.tick("myFunction");
   tick.start();
   // do some processing and end this tick
   tick.stop();
}

// Display the results
console.log(t.timers.myFunction.duration()); // total duration of all ticks
console.log(t.timers.myFunction.min()); // minimal tick duration
console.log(t.timers.myFunction.max()); // maximal tick duration
console.log(t.timers.myFunction.mean()); // mean tick duration
console.log(t.timers.myFunction.median()); // median tick duration

[संपादित करें] एक्सटेकर का उपयोग करने का एक सरल तरीका अब भी है क्योंकि अब इसे मापा जाने वाला कोड लपेट सकते हैं। आपका कोड इस तरह लिपट सकता है:

var t = require('exectimer'),
Tick = t.Tick;

for(var i = 1; i < LIMIT; i++){
    Tick.wrap(function saveUsers(done) {
        db.users.save({id : i, name : "MongoUser [" + i + "]"}, function(err, saved) {
            if( err || !saved ) console.log("Error");
            else console.log("Saved");
            done();
        });
    });
}

// Display the results
console.log(t.timers.myFunction.duration()); // total duration of all ticks
console.log(t.timers.saveUsers.min()); // minimal tick duration
console.log(t.timers.saveUsers.max()); // maximal tick duration
console.log(t.timers.saveUsers.mean()); // mean tick duration
console.log(t.timers.saveUsers.median()); // median tick duration

1

एडब्ल्यूएस से अज़ूर जाते समय मेरे पास एक ही मुद्दा था

एक्सप्रेस और aws के लिए, आप पहले से ही उपयोग कर सकते हैं, मौजूदा समय () और समय ()

Azure के लिए, इसका उपयोग करें: https://github.com/manoharreddyporeddy/my-nodejs-notes/blob/master/performance_timers_helper_nodejs_azure_azs.js.js

ये समय () और टाइमएंड () मौजूदा hrtime () फ़ंक्शन का उपयोग करते हैं, जो उच्च-रिज़ॉल्यूशन वास्तविक समय देते हैं।

उम्मीद है की यह मदद करेगा।


0

और दूसरा विकल्प एक्सप्रेस-डिबग टूल का उपयोग करना है :

एक्सप्रेस-डिबग एक्सप्रेस के लिए एक विकास उपकरण है। यह साधारण मिडलवेयर है जो आपके html में उपयोगी डिबगिंग आउटपुट को गैर-अवरोधक तरीके से इंजेक्ट करता है।

यह आसानी से एक रूपरेखा पैनल प्रदान करता है:

कुल req प्रसंस्करण समय। मिडलवेयर, परम, और रूट टाइमिंग।

इसके अलावा। उपरोक्त उत्तरों में जोड़ने के लिए, आप केवल विकास परिवेश के लिए किसी भी प्रोफाइल कोड को सक्षम करने के लिए इस उत्तर की जांच कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.