const workerFunction = () => { self.onmessage = (message) => { const isPrime = (candidate) => { for (let i = 2; i <= Math.floor(Math.sqrt(candidate)); i++) { if (candidate % i === 0) return false; } return true; } let view = new Uint8Array(message.data); let count = 0; for (let i = 0; i < view.length; i++) { let candidate = i + 2; let result = isPrime(candidate); if (result) count++; view[i] = result; } self.postMessage({ buffer: view.buffer, count }); } } const hackFunctionToBuffer = (f) => { return URL.createObjectURL(new Blob([`(${f.toString()})()`], { type: 'application/javascript' })) } const startTest = () => { // same buffer size as before let buffer = new ArrayBuffer(1024 * 1024 * 2) let view = new Uint8Array(buffer); let workerBlob = hackFunctionToBuffer(workerFunction); performance.mark('startTest'); let worker = new Worker(workerBlob); worker.onmessage = (message) => { performance.mark('endTest') performance.measure('primes', 'startTest', 'endTest'); document.getElementById('performance').innerHTML = `Found ${message.data.count} in ${performance.getEntriesByName('primes')[0].duration} ms`; URL.revokeObjectURL(workerBlob); } worker.postMessage(buffer); } document.getElementById('test').addEventListener('click', startTest);
<button id="test">Start Test</button> Results:<br /> <pre id="performance">Nothing yet...</pre>