【问题标题】:Measure execution time of web worker测量网络工作者的执行时间
【发布时间】:2022-01-22 07:39:16
【问题描述】:

我想测量计算因式分解的网络工作者的执行时间。 webworker 正在传递实时结果,一旦计算终止,webworker 就会发送一条“完成”消息。我在我的 react 应用程序中使用了 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

但是,performance.now() 不会等待承诺解决,因此给了我任意时间。为什么?谢谢。

【问题讨论】:

  • 你的代码不会等待你创建的自执行函数

标签: javascript reactjs async-await promise web-worker


【解决方案1】:
useEffect(() => {
  runWebWorker()
}, [number])

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

或者,让您的工作人员发送性能数据,该数据更易于衡量并且不包括 postMessage 队列延迟。

【讨论】:

    【解决方案2】:

    在测量时间之前,您需要等待承诺解决。使用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

    【讨论】:

    • 我没有接受它,因为@AnthumChris 的答案似乎更简洁,但我赞成
    • 如果你找到了答案,我很高兴
    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2020-05-17
    相关资源
    最近更新 更多