microjob
microjob copied to clipboard
Take longer time than native worker_thread
microjob version:
15375.269ms
(async () => {
const { job, start, stop } = require("microjob");
try {
// start the worker pool
console.time("microjob");
await start();
// this function will be executed in another thread
const res = await job(() => {
let i = 0;
const result = [];
const threadCount = 4;
const totalDataLength = 2000000;
for (i = 0; i < threadCount; i++) {
// heavy CPU load ...
const crypto = require("crypto");
const sha256 = (s) => crypto.createHash("sha256").update(s).digest();
const shaArray = Array.from(Array(totalDataLength / threadCount)).map((num) =>
sha256(String(num))
);
result.push(shaArray);
}
return result;
});
console.log(res);
console.timeEnd("microjob");
} catch (err) {
console.error(err);
} finally {
// shutdown worker pool
await stop();
}
})();
Node.js native multi-thread version
5311.715ms
const { Worker } = require("worker_threads");
const path = require("path");
console.time('thread')
let workerPool = [];
const threadCount = 4;
const totalDataLength = 2000000;
for (let i = 0; i < threadCount; i++) {
const workerInstance = new Promise((resolve, reject) => {
const worker = new Worker(path.resolve("./worker.js"));
worker.on("message", ({ data }) => {
resolve(data);
});
worker.postMessage({
arrayLength: totalDataLength / threadCount,
});
});
workerPool.push(workerInstance);
}
Promise.all(workerPool)
.then((values) => {
console.log(values);
console.timeEnd('thread')
})
.catch((err) => {
console.log(err);
});
const { parentPort } = require("worker_threads");
const crypto = require("crypto");
const sha256 = (s) => crypto.createHash("sha256").update(s).digest();
parentPort.on("message", ({ arrayLength }) => {
const shaArray = Array.from(Array(arrayLength)).map((num) => sha256(String(num)));
parentPort.postMessage({
data: shaArray,
});
});
You are sending 1 task to microjob and 4 separate tasks to worker.
I updated your example code for microjob so that it actually creates 4 worker threads. The speed difference results are mostly negligible.
Fixed
(async () => {
const { job, start, stop } = require("microjob");
try {
// start the worker pool
console.time("microjob");
await start();
const threadCount = 4;
const promises = []
for (let i = 0; i < threadCount; i++) {
// this function will be executed in another thread
const resprom = job(() => {
const result = [];
const totalDataLength = 2000000;
// heavy CPU load ...
const crypto = require("crypto");
const sha256 = (s) => crypto.createHash("sha256").update(s).digest();
const shaArray = Array.from(Array(totalDataLength / threadCount)).map((num) =>
sha256(String(num))
);
result.push(shaArray);
return result;
}, { ctx: { threadCount } });
promises.push(resprom)
}
var res = await Promise.all(promises)
console.log(res);
console.timeEnd("microjob");
} catch (err) {
console.error(err);
} finally {
// shutdown worker pool
await stop();
}
})();