The battle of the event loops Ujjwal Sharma (@ryzokuken) featuring Olga Kobets (@homyasusina)

1 Ujjwal Sharma (he/him)

• Compilers Hacker at Igalia

• Node.js Core Collaborator

• TC39 Delegate

• Work on V8 and Cranelift (Spidermonkey/wasmtime)

• Student

• Speaker

2 @ryzokuken ft. @homyasusina Барсик B1000

3 @ryzokuken ft. @homyasusina The has to be one of the most talked about subjects in JavaScript

4 @ryzokuken ft. @homyasusina Let’s dig a little deeper.

5 @ryzokuken ft. @homyasusina Section I Concurrency

6 @ryzokuken ft. @homyasusina Concurrency vs Parallelism

Concurrency 7 @ryzokuken ft. @homyasusina Concurrency /kənˈkʌr(ə)nsi/ noun When two or more tasks can start, run, and complete in overlapping time periods.

Concurrency 8 @ryzokuken ft. @homyasusina Example: multitasking on a single-core machine

Concurrency 9 @ryzokuken ft. @homyasusina Concurrency 10 @ryzokuken ft. @homyasusina Parallelism /ˈparəlɛlɪzəm/ noun The state of being parallel or of corresponding in some way.

Concurrency 11 @ryzokuken ft. @homyasusina Example: the Greek thinkers used to believe in the parallelism of microcosm and macrocosm

Concurrency 12 @ryzokuken ft. @homyasusina �

Concurrency 13 @ryzokuken ft. @homyasusina Parallelism /ˈparəlɛlɪzəm/ noun When tasks literally run at the same time.

Concurrency 14 @ryzokuken ft. @homyasusina Example: a multicore processor

Concurrency 15 @ryzokuken ft. @homyasusina Concurrency 16 @ryzokuken ft. @homyasusina If computation is said to be concurrent, then it doesn't necessarily dictate how the concurrency is achieved under the hood.

Concurrency 17 @ryzokuken ft. @homyasusina JavaScript is single-threaded

Concurrency 18 @ryzokuken ft. @homyasusina V8 is single-threaded

Concurrency 19 @ryzokuken ft. @homyasusina “There are many who pretend to despise and belittle that which is beyond their reach.” – Aesop (Aesop’s Fables)

Concurrency 20 @ryzokuken ft. @homyasusina JavaScript does not need multithreading

Concurrency 21 @ryzokuken ft. @homyasusina Two main reasons for operations to be time-consuming:

1. Operations that perform heavy computation.

2. Operations that depend on something.

Concurrency 22 @ryzokuken ft. @homyasusina Two main reasons for operations to be time-consuming: 1. Operations that require CPU time. 1. Operations that perform heavy computation. 2. Operations that wait for something. 2. Operations that depend on something.

Concurrency 23 @ryzokuken ft. @homyasusina 99% of all applications do nothing 99% of the time

Concurrency 24 @ryzokuken ft. @homyasusina Multithreading is useful when 1. Significant CPU time is required. 2. Need to call an awkward synchronous (blocking) API.

Concurrency 25 @ryzokuken ft. @homyasusina Node.js

const cluster = require("cluster")

const workers = require("worker_threads")

Concurrency 26 @ryzokuken ft. @homyasusina

const worker = new Worker(...)

Concurrency 27 @ryzokuken ft. @homyasusina So how do you use single-threaded concurrency in the real world?

Concurrency 28 @ryzokuken ft. @homyasusina Section II Asynchronous Programming

29 @ryzokuken ft. @homyasusina Asynchrony /eɪˈsɪŋ krəˌni/ noun The occurrence of events independent of the main program flow and ways to deal with such events.

Asynchronous Programming 30 @ryzokuken ft. @homyasusina Event-driven programming is by far the most popular paradigm to achieve asynchrony

Asynchronous Programming 31 @ryzokuken ft. @homyasusina Green Threads is a popular alternative

Asynchronous Programming 32 @ryzokuken ft. @homyasusina We’re not the first ones to use event-driven systems to build web servers

Asynchronous Programming 33 @ryzokuken ft. @homyasusina • .NET (C#) • Spark (Java) • Twisted (Python) • Express (JavaScript) • Vapor (Swift) • Rocket (Rust)

Asynchronous Programming 34 @ryzokuken ft. @homyasusina JavaScript has a concurrency model based on an event loop

Asynchronous Programming 35 @ryzokuken ft. @homyasusina Asynchronous Programming 36 @ryzokuken ft. @homyasusina What the heck is the event loop anyway? | Philip Roberts | JSConf EU

Asynchronous Programming 37 @ryzokuken ft. @homyasusina Иван Тулуп: асинхронщина в JS под капотом / Михаил Башуров (Luxoft)

Asynchronous Programming 38 @ryzokuken ft. @homyasusina But the “event loop” is a theoretical model

Asynchronous Programming 39 @ryzokuken ft. @homyasusina Section III Event Loops

40 @ryzokuken ft. @homyasusina poll and select

• History: Introduced in the ~80s-90s (old).

• Functionality: More or less the same (boring).

• Speed: Perform similarly on benchmarks (slow). 1983

• Portability: Everywhere (nice).

• Complexity: As simple as it gets (neat).

Event Loops 41 @ryzokuken ft. @homyasusina Result:

2000

Event Loops 42 @ryzokuken ft. @homyasusina People loved poll

• epoll

• /dev/poll

• pollset

• inotify

Event Loops 43 @ryzokuken ft. @homyasusina Result: libevent

2003

Event Loops 44 @ryzokuken ft. @homyasusina Result: libevent* 2005

* Slightly Faster

Event Loops 45 @ryzokuken ft. @homyasusina Problem: libevent is too…

Event Loops 46 @ryzokuken ft. @homyasusina Problem: libevent is too… bloated

Event Loops 47 @ryzokuken ft. @homyasusina Result: libev

2007

Event Loops 48 @ryzokuken ft. @homyasusina Event Loops 49 @ryzokuken ft. @homyasusina Node Standard Library

Node Bindings

Thread Pool Event Loop V8 (libeio) (libev)

Event Loops 50 @ryzokuken ft. @homyasusina Narrator: There was a problem.

Event Loops 51 @ryzokuken ft. @homyasusina Event Loops 52 @ryzokuken ft. @homyasusina Enter the Dragon

Event Loops 53 @ryzokuken ft. @homyasusina Enter the Unicorn Velociraptor

2013

Event Loops 54 @ryzokuken ft. @homyasusina Event Loops 55 @ryzokuken ft. @homyasusina LXJS 2012 - Bert Belder -

Event Loops 56 @ryzokuken ft. @homyasusina Node Standard Library

Node Bindings

Thread Pool Event Loop V8 (libeio) (libev)

Event Loops 57 @ryzokuken ft. @homyasusina Node Standard Library

Node Bindings

V8 libuv

Event Loops 58 @ryzokuken ft. @homyasusina Event Loops 59 @ryzokuken ft. @homyasusina Section IV Into the boxing ring

60 @ryzokuken ft. @homyasusina The lifesaver: autocannon

• wrk and wrk2

• “It’s just JavaScript”

• “It just works”

• mcollina is a legend

• TCP?

• Fake TCP?

Into the boxing ring 61 @ryzokuken ft. @homyasusina Introducing gandiva

Into the boxing ring 62 @ryzokuken ft. @homyasusina Let the benchmarking begin!

Into the boxing ring 63 @ryzokuken ft. @homyasusina Section V Conclusion

64 @ryzokuken ft. @homyasusina Conclusion 1: tokio is slow

Conclusion 65 @ryzokuken ft. @homyasusina Conclusion 66 @ryzokuken ft. @homyasusina Conclusion 2: deno is slow

Conclusion 67 @ryzokuken ft. @homyasusina Deno's design is different than Node's in that all native calls are done through zero-copy message passing. This allows for a more uniform bindings, where we have centralised understanding of all calls being made out of the VM.

– Ryan Dahl

Conclusion 68 @ryzokuken ft. @homyasusina Ultimately we expect this design to result in better performance, but we're not there yet. Deno's networking is about 50% the speed of Node v13. Follow our progress at https:// deno.land/benchmarks

– Ryan Dahl

Conclusion 69 @ryzokuken ft. @homyasusina Conclusion 3: people are still reluctant

Conclusion 70 @ryzokuken ft. @homyasusina Conclusion 71 @ryzokuken ft. @homyasusina But it’s getting there!

Conclusion 72 @ryzokuken ft. @homyasusina Introducing Deno 1.0

Conclusion 73 @ryzokuken ft. @homyasusina Special Thanks

• Artem Kobzar

• Ryan Dahl

• Olga Kobets

• Kamil Mysliwiec

Conclusion 74 @ryzokuken ft. @homyasusina спасибо!

Conclusion 75 @ryzokuken ft. @homyasusina