How to measure the duration of async operations?

Performance API provides us with tools to figure out the necessary performance metrics. A simple example would be using async_hooks and perf_hooks

‘use strict’;
const async_hooks = require(‘async_hooks’);
const {
performance,
PerformanceObserver
} = require(‘perf_hooks’);
const set = new Set();
const hook = async_hooks.createHook({
init(id, type) {
if (type === ‘Timeout’) {
performance.mark(`Timeout-${id}-Init`);
set.add(id);
}
},
destroy(id) {
if (set.has(id)) {
set.delete(id);
performance.mark(`Timeout-${id}-Destroy`);
performance.measure(`Timeout-${id}`,
`Timeout-${id}-Init`,
`Timeout-${id}-Destroy`);
}
}
});
hook.enable();
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries()[0]);
performance.clearMarks();
observer.disconnect();
});
obs.observe({ entryTypes: [‘measure’], buffered: true });
setTimeout(() => {}, 1000);
This would give us the exact time it took to execute the callback.