[英]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.