Как измерить время выполнения асинхронной функции в nodejs? - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь получить время выполнения / ответа асинхронной функции, которая выполняется внутри операции извлечения узла, как показано ниже:

async function getEditedData() {      
       var a = await fetch(`https://api.example.com/resorce_example`);
       var b = await a.json();
       // Some aditional treatment of the object obtained (b)
       console.log("End of the asynchronous function")
}

Я использовал библиотеку perf_hooks вот так, но выполнение время показывает до

const hrtime = require ('perf_hooks').performance.now ;
var start = hrtime ();
   getEditedData();
var end   = hrtime ();
console.log (end - start);

Я нашел библиотеку async_hooks https://nodejs.org/api/perf_hooks.html#perf_hooks_measuring_the_duration_of_async_operations, но я не могу понять, как она работает. Я основа c в JavaScript / nodejs

Ответы [ 3 ]

2 голосов
/ 03 апреля 2020

Если вы ожидаете установить end после завершения getEditedData(), вам действительно нужно await getEditedData(). В противном случае вы будете go проходить мимо него, пока он выполняется ... асинхронно.

1 голос
/ 03 апреля 2020

Вы можете просто сохранить Date.now() в некоторой переменной и затем проверить Date.now(), когда ваше Обещание разрешит (или отклонит) и вычтет, чтобы найти разницу. Например:

const simulateSomeAsyncFunction = new Promise((resolve, reject) => {
  console.log('Initiating some async process, please wait...')
  const startTime = Date.now();

  setTimeout(() => {
    resolve(Date.now() - startTime);
  }, 3000);
});

simulateSomeAsyncFunction.then(msElapsed => {
  console.log(`Async function took ${msElapsed / 1000} seconds to complete.`);
});

Примечание : Вы можете написать код, который достигает того же самого и кажется синхронным, используя await / async, поскольку это просто "syntacti c sugar", построенный на вершине Обещаний. Например:

const simulateSomeAsyncFunction = () => {
  console.log('Initiating some async process, please wait...');

  return new Promise((resolve, reject) => {
    setTimeout(resolve, 3000);
  });
};

// Await is required to be called within an async function so we have to wrap the calling code in an async IIFE
(async() => {
  const startTime = Date.now();

  await simulateSomeAsyncFunction();

  const msElapsed = Date.now() - startTime;

  console.log(`Async function took ${msElapsed / 1000} seconds to complete.`);
})();
0 голосов
/ 05 апреля 2020

Начиная с простой функции asyn c -

const fakeAsync = async (value) => {
  const delay = 2000 + Math.random() * 3000 // 2 - 5 seconds
  return new Promise(r => setTimeout(r, delay, value))
}

fakeAsync("foo").then(console.log)

console.log("please wait...")

// "please wait..."
// "foo"

Мы могли бы написать обобщенную c функцию, timeit. Это функция высшего порядка, которая принимает функцию в качестве входных данных и возвращает новую функцию в качестве выходных. Новая функция работает как декорированная версия оригинала -

const timeit = (func = identity) => async (...args) => {
  const t = Date.now()
  const result = await func(...args)
  return { duration: Date.now() - t, result }
}

// decorate the original
const timedFakeAsync = timeit(fakeAsync)

// call the decorated function
timedFakeAsync("hello").then(console.log)
timedFakeAsync("earth").then(console.log)

// { duration: 3614, result: "earth" }
// { duration: 4757, result: "hello" }

Синхронизированная версия нашей функции возвращает объект { duration, result }, который сообщает время выполнения нашей асинхронной функции c и результат.

Разверните фрагмент ниже, чтобы проверить результаты в своем собственном браузере -

const identity = x =>
  x

const timeit = (func = identity) => async (...args) => {
  const t = Date.now()
  const result = await func(...args)
  return { duration: Date.now() - t, result }
}

const fakeAsync = async (value) => {
  const delay = 2000 + Math.random() * 3000 // 2 - 5 seconds
  return new Promise(r => setTimeout(r, delay, value))
}

const timedFakeAsync = timeit(fakeAsync)

timedFakeAsync("hello").then(console.log)
timedFakeAsync("earth").then(console.log)

console.log("please wait...")

// "please wait..."
// { duration: 3614, result: "earth" }
// { duration: 4757, result: "hello" }
...