Reputation: 971
I'm trying to find a better way to run some cpu bound tasks using NodeJS. There are 2 options as I know, fork processes and worker threads. So I have ran a benchmark between them and found out that fork process is faster.
So, I have some questions here:
I'm running the code on MacOS(2.2 GHz Intel Core i7, 16 GB 1600 MHz DDR3) using node v10.15.3
the benchmark code is in my gist:
threads pool library microjob and process pool library node-worker-farm are used in my code as you can see. The running cmd is : node --experimental-worker benchmark.js
Upvotes: 14
Views: 4673
Reputation: 971
I think @gireeshpunathil's comment from https://github.com/nodejs/help/issues/1920 can help a lot:
there is no single formulae that computes which method will be faster. It depends on a number of parameters:
- the running time of the job itself
- the interaction of the job with the spawning code
- the machine characteristics, specifically cpu, memory and scheduling
the fork uses native fork and exec, that is heavy-weight than thread creation. fork creates a new node instance with new v8, isolate, libuv etc. worker does not create new node instance. forked process uses IPC channel to talk to the forking process, if needed. workers use in-memory buffers.
So:
- if the execution time of the microjob is too small compared to the process creation, worker method will be faster.
- if the job communicates with the driver, the frequency of communication and the cost of communication will decide the winner
- if the job runs as long independent piece of code with no interaction, fork method will eventually prove faster (I think that
is happening here)
Upvotes: 11