簡體   English   中英

JavaScript - 如何測量代碼每個部分的執行時間

[英]JavaScript - how to measure execution time for each part of a code

用於連接數據庫和獲取數據的 JS 代碼如下。

我可以使用node db.js命令在終端中運行整個代碼並測量總執行時間,但我想測量每個代碼塊執行所需的時間(以毫秒為單位):

# Part 1:
var mysql = require('mysql');

# Part 2:
var connection = mysql.createConnection({
    host: '...',
    user: '...',
    password: '...'
    port : ...
    database: '...'
});

# Part 3:
connection.connect(function(err) {
  if (err) throw err;
  connection.query("SELECT * FROM table", function (err, result, fields) {
    if (err) throw err;
    console.log(result);
  });
  connection.end();
});

如何測量上面的每個部分?

謝謝。

您可以使用console.time('name')console.timeEnd('name')來測量代碼中兩個位置之間的時間。

看起來像這樣:

console.time('part1')   //start timer for part 1.
var mysql = require('mysql');
console.timeEnd('part1')    //end timer 1 and log how long it took.  

console.time('part2')   //start timer for part 2.
var connection = mysql.createConnection({
    host: '...',
    user: '...',
    password: '...'
    port : ...
    database: '...'
});
console.timeEnd('part2')    //end timer 2 and log how long it took. 

console.time('part3')   //start timer for part 3.
connection.connect(function(err) {
  if (err) throw err;
  connection.query("SELECT * FROM table", function (err, result, fields) {
    if (err) throw err;
    console.log(result);
    console.timeEnd('part3')    //end timer 3 in the callback and log how long it took. 
  });
  connection.end();
});

使用console.time(String str)啟動一個命名計時器,並使用console.timeEnd(String str)結束測量並在控制台中輸出時間。

 function countToThousand(callback) { console.time('part1'); let a = 0; for (var i = 0; i < 1000; i++) { a += i } callback(a) } function myCallback(a) { console.log('a is '+a); console.timeEnd('part1') } countToThousand(myCallback) // etc 

如果您的問題實際上是“如何知道代碼的哪一部分是sloooow”。 做這種事情的工具稱為“探查器”。

NodeJS具有集成的探查器,可以將其附加到您的IDE(例如Inteliji Webstorm

或者,您可以搜索連接到V8探查器的專用軟件包(例如v8-profiler ),並繪制圖表/用其他一些軟件包/自己的代碼填充表格。

您可以使用內置的nodejs perf_hooks。 例如:

// Dependencies
const { performance, PerformanceObserver } = require('perf_hooks');



performance.mark('start part1');
console.time('part1')   //start timer for part 1.
var mysql = require('mysql');
console.timeEnd('part1')    //end timer 1 and log how long it took.  
performance.mark('end part1');

performance.mark('start part2');
console.time('part2')   //start timer for part 2.
var connection = mysql.createConnection({
  host: '...',
  user: '...',
  password: '...'
    port: ...
  database: '...'
});
console.timeEnd('part2')    //end timer 2 and log how long it took. 
performance.mark('end part2');

performance.mark('start part3');
console.time('part3')   //start timer for part 3.
connection.connect(function (err) {
  if (err) throw err;
  connection.query("SELECT * FROM table", function (err, result, fields) {
    if (err) throw err;
    console.log(result);
    console.timeEnd('part3')    //end timer 3 in the callback and log how long it took. 
    performance.mark('end part3');

    // Create observer to log out all the measurements
    const obs = new PerformanceObserver((list) => {
      // called once. list contains three items
      const measurements = list.getEntriesByType('measure');
      measurements.forEach((measurement) => {
        console.log(`${measurement.name} ${measurement.duration}`);
      });
    });
    obs.observe({ entryTypes: ['measure'] });

    // Gather all the measurements
    performance.measure('Beggining to end', 'start part1', 'end part3'); // Measure whole function
    performance.measure('Part1', 'start part1', 'end part1'); // Measure the part1
    performance.measure('Part2', 'start part2', 'end part2'); // Measure the part2
    performance.measure('Part3', 'start part3', 'end part3'); // Measure the part3

  });
  connection.end();
});

使用這個方法

 const startTime =new Date().getTime();

//part of the code

const endTime = new Date().getTime();
console.log(`time taken=> ${(endTime - startTime)/1000} seconds`);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM