xxxxxxxxxx
103
let sieveLimit = 1000000;
let arraySize = Math.ceil(sieveLimit / 32);
let sieve = new Uint32Array();
let minDuration = Infinity, maxDuration = 0, totalDuration = 0;
const workers = [];
const workerCount = 20;
let waitCount = workerCount;
function OnWorkerMessage(e)
{
--waitCount;
let currentDuration = parseFloat(e.data.Duration);
totalDuration += currentDuration;
if (currentDuration < minDuration)
minDuration = currentDuration;
if (currentDuration > maxDuration)
maxDuration = currentDuration;
print(` Message from Worker ${e.data.ID} | Duration: ${currentDuration}`);
print(" Also e: ", e.data, e.data.InitialData);
}
function WorkerSetup()
{
print("SETUP");
print(` Workers: ${workerCount}`);
print(` Array Size: ${arraySize} (supporting ${sieveLimit} integers)`);
for (let i = 0; i < workerCount; ++i)
{
const worker = new Worker("SieveSetup.js?v=" + new Date().getTime());
worker.onmessage = OnWorkerMessage;
workers.push(worker);
}
for (let i = 0; i < workerCount; ++i)
{
const data =
{
ID: i,
SieveLimit: sieveLimit,
};
workers[i].postMessage(data);
}
}
function setup()
{
createCanvas(400, 400);
fill(255);
noStroke();
WorkerSetup();
frameRate(60);
}
let loadingTimer = 0;
let loadingPeriod = 1;
let loadingRadius = 50;
function draw()
{
background(20);
if (waitCount > 0)
{
let angle = TAU * loadingTimer / loadingPeriod;
let x = Math.cos(angle) * loadingRadius + width / 2;
let y = Math.sin(angle) * loadingRadius + height / 2;
circle(x, y, 20);
loadingTimer = (loadingTimer + deltaTime / 1000) % loadingPeriod;
}
else
{
PrintResults();
noLoop();
}
}
function PrintResults()
{
print("RESULTS");
print(` Total duration: ${Math.round(totalDuration)} ms`);
print(` Min: ${Math.round(minDuration)} ms`);
print(` Max: ${Math.round(maxDuration)} ms`);
let avg = (totalDuration - (minDuration + maxDuration)) /
(workerCount - 2);
print(` Avg: ${Math.round(avg)} ms`);
}