Skip to content

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), or vcbuild test (Windows) passes
  • commit message follows commit guidelines

Merge request reports

Loading