camaro v6
Posted on May 19, 2020 • 2 minutes • 245 words
I recently discover piscina project. It’s a very fast and convenient Node.js worker thread pool implementation.
Remember when worker_threads
first introduced, the worker startup is rather slow and pool implementation is generally advised. However, there wasn’t any good enough implementation yet until piscina
.
Since v4 when I move to WebAssembly, camaro performance took a huge hit (3 folds) and I was still trying to find a way to fix this perf regression.
Well, piscina
(worker_threads
) seems to be the answer to that.
Take a look at piscina
example:
const Piscina = require('piscina');
const piscina = new Piscina({
filename: path.resolve(__dirname, 'worker.js')
});
(async function() {
const result = await piscina.runTask({ a: 4, b: 6 });
console.log(result); // Prints 10
})();
and worker.js
module.exports = ({ a, b }) => {
return a + b;
};
Sure it looks simple enough so I wrote a quick script to wrap camaro
with piscina
. And the performance improvement is sweet: it’s about five times faster (ops/sec) and the CPU on my laptop is stressed nicely.
camaro v6: 1,395.6 ops/sec
fast-xml-parser: 153 ops/sec
xml2js: 47.6 ops/sec
xml-js: 51 ops/sec
More importantly, it scales nicely with CPU core counts, which camaro
v4 with WebAssembly isn’t.
In order to use this, I would have to drop support for Node version 11 and older but the performance improvement of this magnitude should guarantee such breaking changes right?
I published the first alpha build to npm if anyone want to give it a try.