Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用perf_钩子来度量异步操作?_Node.js - Fatal编程技术网

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(),
]);

注意:我想知道单个执行的次数,而不仅仅是所有执行的总和。