Me gustaría medir el tiempo de ejecución de un trabajador web que calcula la factorización. El trabajador web está enviando mensajes de resultados en vivo y una vez que finalizan los cálculos, el trabajador web envía un mensaje de "terminado". Usé la promesa de hacer esto en mi aplicación de reacción.
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 Sin embargo, performance.now() no espera que la promesa se resuelva y, en consecuencia, me da un tiempo arbitrario. ¿Por qué? Gracias.
useEffect(() => { runWebWorker() }, [number]) async function runWebWorker() { const start = performance.now() await ... const end = performance.now() } Alternativamente, haga que su trabajador envíe datos de rendimiento, que son más medibles y excluyen la postMessage la cola posterior al mensaje.
Debe esperar a que se resuelva la promesa antes de medir el tiempo. Ya sea con finally o 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