简体   繁体   English

测量 web worker 的执行时间

[英]Measure execution time of web worker

I would like to measure execution time of a webworker that computes factorization.我想测量计算分解的网络工作者的执行时间。 The webworker is messaging live results and once computations are terminated, the webworker sends a 'finished' message. webworker 正在发送实时结果,一旦计算终止,webworker 就会发送一条“完成”消息。 I used promise to do this in my react app.我使用 promise 在我的反应应用程序中执行此操作。

useEffect(() => {
  const measureTimeStart = performance.now();
  (async () => {
    try {
      await new Promise(resolve => {
        const worker = new Worker(new URL('facto.js', import.meta.url));
        worker.postMessage(number);
        worker.onmessage = message => { //streaming live results 
          const { facto, status } = message.data;
          setResults({ ...facto }); //adding them to React state
          if (status === 'finished') {
            resolve();
            worker.terminate();
          };
        };
      });
    } catch (error) {
      console.log(error)
    }
  })();
  const measureTimeEnd = performance.now();
  setExecutionTime(Math.round((measureTimeEnd - measureTimeStart) * 1000) / 1000 + ' ms');
}, [number]); //number to factorize

However, performance.now() doesn't wait that the promise resolves and consequently gives me arbitrary timing.但是, performance.now()不会等待 promise 解决,因此给了我任意时间。 Why?为什么? thanks.谢谢。

useEffect(() => {
  runWebWorker()
}, [number])

async function runWebWorker() {
  const start = performance.now()
  await ...
  const end = performance.now()
}

Alternatively, have your worker send performance data, which is more measurable and excludes the postMessage queue latency.或者,让您的工作人员发送性能数据,该数据更可测量并且不包括postMessage队列延迟。

You need to wait for the promise to resolve before measuring the time.在测量时间之前,您需要等待 promise 解决。 Either with finally or then无论是finally还是then

 useEffect(() => { const measureTimeStart = performance.now(); (async () => { try { await new Promise(resolve => { const worker = new Worker(new URL('facto.js', import.meta.url)); worker.postMessage(number); worker.onmessage = message => { //streaming live results const { facto, status } = message.data; setResults({...facto }); //adding them to React state if (status === 'finished') { resolve(); worker.terminate(); }; }; }); } catch (error) { console.log(error) } })().finally(() => { const measureTimeEnd = performance.now(); setExecutionTime(Math.round((measureTimeEnd - measureTimeStart) * 1000) / 1000 + ' ms'); }); }, [number]); //number to factorize

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM