hastig - the unfriendly but fast node.js worker
NOTE: THIS IS A FAILED EXPERIMENT FOR NOW. NOT USEABLE IN REAL-LIFE.
Task name | Throughput average (ops/s) | Throughput median (ops/s) | Latency average (ns) | Latency median (ns) | Samples |
---|
pool | 1949411 ± 0.05% | 2178649 | 874.99 ± 10.37% | 459.00 | 1147565 |
piscina | 65491 ± 0.20% | 69367 | 21914.67 ± 8.75% | 14416.00 | 45632 |
Example
import { Worker } from "hastig";
const hastig = new Worker(new URL("./worker.js", import.meta.url));
const str1 = "Hello";
const str2 = "World";
hastig.run(
str1.length + 1 + str2.length + 1,
(dst) => {
dst.buffer[dst.byteOffset] = dst.buffer.write(str1, dst.byteOffset + 1, str1.length, 'ascii');
dst.byteOffset += dst.buffer[dst.byteOffset] + 1;
dst.buffer[dst.byteOffset] = dst.buffer.write(str2, dst.byteOffset + 1, str2.length, 'ascii');
dst.byteOffset += dst.buffer[dst.byteOffset] + 1;
},
(err, src) => {
if (err) {
console.error(err);
} else {
const len3 = src.buffer[src.byteOffset++];
const str3 = src.buffer.toString('ascii', src.byteOffset, len3);
console.log(str3);
}
hastig.destroy();
}
);
export default function (src, respond) {
const len1 = src.buffer[src.byteOffset++];
const str1 = src.buffer.toString('ascii', src.byteOffset, len1);
src.byteOffset += len1;
const len2 = src.buffer[src.byteOffset++];
const str2 = src.buffer.toString('ascii', src.byteOffset, len2);
src.byteOffset += len2;
respond(
str1.length + str2.length + 1,
(dst, str1, str2) => {
const str3 = str1 + ' ' + str2;
dst.buffer[dst.byteOffset] = dst.buffer.write(str3, dst.byteOffset + 1, str3.length, 'ascii');
dst.byteOffset += dst.buffer[dst.byteOffset] + 1;
},
str1,
str2
);
}