Now we know the reason for our garbage value, and, with atomics, it should be easy to fix the problem. Right? Wrong.
There is a massive performance penalty on using atomic locking a billion times. Let's look at our updated worker.js code now:
// worker.js
let sharedMem;
addEventListener('message', ({data}) => {
//console.log(data);
if(data.message == 'sab') {
sharedMem = data.memory;
console.log('Memory ready');
}
if(data.cmd == 'start') {
console.log('Iterations ready');
startCounting(data.iterations);
}
});
function startCounting(limit) {
const arr = new Uint32Array(sharedMem);
for(let i=0;i<limit;i++) {
Atomics.add(arr, 0, 1);
}
postMessage('done')
}
This is similar to our previous implementation of the problem, with...