src: use EnqueueMicrotask for tls writes
Instead of using SetImmediate
, use EnqueueMicrotask
as it appears to be significantly more performant in certain cases and even in the optimal case yields roughly 10% higher throughput.
Not sure if there are any potential downsides here (in terms of using EnqueueMicrotask
) that we need to watch out for.
Here are some rough stats when using write callbacks as the original test:
With SetImmediate:
Elapsed 5 s, sent 8 MB (2 MB/s), received 8 MB (2 MB/s) Elapsed 10 s, sent 16 MB (2 MB/s), received 16 MB (2 MB/s) Elapsed 15 s, sent 23 MB (2 MB/s), received 23 MB (2 MB/s) Elapsed 20 s, sent 31 MB (2 MB/s), received 31 MB (2 MB/s)
With EnqueueMicrotask:
Elapsed 5 s, sent 17 MB (3 MB/s), received 16 MB (3 MB/s) Elapsed 10 s, sent 32 MB (3 MB/s), received 32 MB (3 MB/s) Elapsed 15 s, sent 48 MB (3 MB/s), received 48 MB (3 MB/s) Elapsed 20 s, sent 64 MB (3 MB/s), received 63 MB (3 MB/s)
And here's the performance when using drain
and the usual streams buffering:
With SetImmediate:
Elapsed 5 s, received 53 MB (11 MB/s) Elapsed 10 s, received 108 MB (11 MB/s) Elapsed 15 s, received 162 MB (11 MB/s) Elapsed 20 s, received 217 MB (11 MB/s)
With EnqueueMicrotask:
Elapsed 5 s, received 59 MB (12 MB/s) Elapsed 10 s, received 120 MB (12 MB/s) Elapsed 15 s, received 180 MB (12 MB/s) Elapsed 20 s, received 241 MB (12 MB/s)
Refs: https://github.com/nodejs/node/issues/20263
Checklist
-
make -j4 test
(UNIX), orvcbuild test
(Windows) passes -
commit message follows commit guidelines