Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const workerCode = `
- function isPrime(num) {
- for (let i = 2; i < num / 2 + 1; i++)
- if (num % i === 0) return false;
- return num > 1;
- }
- function sumPrimes(start, end) {
- let sum = 0;
- for (let i = start; i <= end; i++)
- if (isPrime(i)) sum += i;
- return sum;
- }
- self.onmessage = function (e) {
- let startPrime = parseInt(e.data[0]);
- let endPrime = parseInt(e.data[1]);
- let sum = sumPrimes(startPrime, endPrime)
- postMessage(sum);
- };
- `;
- const workerBlob = new Blob([workerCode], {type: 'application/javascript'});
- async function sumPrimes(num){
- return new Promise((resolve, reject) => {
- const THREAD_COUNT = navigator.hardwareConcurrency;
- let pice = Math.floor(num / THREAD_COUNT);
- let lastPice = pice + num % THREAD_COUNT;
- let sum = 0;
- let end = 0;
- let threadCompleted = 0;
- for(let i = 1; i <= THREAD_COUNT; i++){
- let p = i == THREAD_COUNT ? pice : lastPice;
- end += p;
- start = end - p + 1;
- //console.log(start, end);
- let worker = new Worker(URL.createObjectURL(workerBlob));
- worker.postMessage([start, end]);
- worker.onmessage = function(e) {
- sum += e.data;
- threadCompleted++;
- if(threadCompleted == THREAD_COUNT)
- resolve(sum);
- }
- }
- });
- }
- (async () => {
- console.time('sumPrimes');
- let sum = await sumPrimes(300000);
- console.timeEnd('sumPrimes');
- console.log("Sum:", sum);
- })();
Advertisement
Add Comment
Please, Sign In to add comment