Experimental QUIC for µWebSockets

Initial performance expectations for upcoming QUIC support

I am currently implementing QUIC support in µWS and as usual, thorough benchmarking and market research is a key first step. As a comparison I compiled the Node.js v15.0.0 source code with the — experimental-quic flag set, enabling core support for QUIC. This support was then benchmarked against my current experimental QUIC implementation, using scripts.

As we can see in the image below, showing performance results, it takes more than 3 separate Node.js processes (3 CPU cores) to saturate 1 (1 CPU core) µWS server process. Again, both products running the same very QUIC protocol:

3 Node.js processes is not enough to saturate 1 µWS process running QUIC

Sure, Node.js core support for QUIC was recently removed altogether and postponed, but still. A 3.69x performance difference at the very transport layer is huge. The same QUIC protocol utilizing less than 1/3 the CPU-time for the same very I/O task.

As always, the more you stack atop and add more abtraction, the more things are going to deviate between Node.js core and µWS. Addition of HTTP3 is going to further distance the two projects in performance.

Point here is that, Node.js support for QUIC might actually come sooner and faster via µWS.js than via Node.js core itself. µWS will need QUIC support in order to implement the upcoming “WebTransport over HTTP3" alternative to WebSockets, so it’s something that needs to happen either way.

Alright, that’s it for my little status update.