Node.js 如何使用perf_钩子来度量异步操作?
下面的代码描述了由Node.js 如何使用perf_钩子来度量异步操作?,node.js,Node.js,下面的代码描述了由foo方法执行的两个异步操作: const foo = async () => { await new Promise((resolve) => { setTimeout(() => { resolve(); }, Math.random() * 100); }); await new Promise((resolve) => { setTimeout(() => { resolve()
foo
方法执行的两个异步操作:
const foo = async () => {
await new Promise((resolve) => {
setTimeout(() => {
resolve();
}, Math.random() * 100);
});
await new Promise((resolve) => {
setTimeout(() => {
resolve();
}, 100);
});
};
Promise.all([
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo()
])
我想测量每个异步操作需要多长时间,然后测量每个foo
执行总共需要多长时间
我的第一次尝试是:
const { PerformanceObserver, performance } = require('perf_hooks');
const obs = new PerformanceObserver((items) => {
console.log('performance-observer', items.getEntries());
});
obs.observe({
entryTypes: ['measure']
});
const foo = async () => {
performance.mark('A');
await new Promise((resolve) => {
setTimeout(() => {
resolve();
}, Math.random() * 100);
});
performance.mark('B');
await new Promise((resolve) => {
setTimeout(() => {
resolve();
}, 100);
});
performance.mark('C');
performance.measure('A to B', 'A', 'B');
performance.measure('A to C', 'A', 'C');
performance.measure('B to C', 'B', 'C');
performance.clearMarks();
};
Promise.all([
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo()
]);
但是,这(如预期)会引发一个错误:
(node:29277) UnhandledPromiseRejectionWarning: Error [ERR_INVALID_PERFORMANCE_MARK]: The "B" performance mark has not been set
at Performance.measure (perf_hooks.js:396:13)
at foo (/Users/gajus/Documents/dev/temp/test.js:30:15)
at async Promise.all (index 0)
之所以会出现这种情况,是因为PerformanceObserver
的实例与单个性能标记之间没有关系
如何使用来度量异步操作?看起来除了在
解析之后进行标记和度量之外,没有其他方法了
const foo = async () => {
await new Promise((resolve) => {
performance.mark('A');
setTimeout(() => {
resolve();
performance.mark('B');
performance.measure('A to B', 'A', 'B');
}, Math.random() * 100);
});
await new Promise((resolve) => {
performance.mark('C');
setTimeout(() => {
resolve();
performance.mark('D');
performance.measure('C to D', 'C', 'D');
}, 100);
});
performance.clearMarks();
};
Promise.all([
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
foo(),
]);
注意:我想知道单个执行的次数,而不仅仅是所有执行的总和。