Slide 1

Slide 1 text

Turbo Boost Next Node.js jsdc.tw @ ୆େࣾ။ՊላӃ COSS https://speakerdeck.com/yosuke_furukawa/turbo-boost-next-node-dot-js

Slide 2

Slide 2 text

Twitter: @yosuke_furukawa Github: yosuke-furukawa ໊લ: ݹ઒ཅհ

Slide 3

Slide 3 text

Twitter: @yosuke_furukawa Github: yosuke-furukawa /PEFKT+BQBO6TFS(SPVQ-FBEFS

Slide 4

Slide 4 text

Before this talk

Slide 5

Slide 5 text

Before this talk 1MFBTF+PJOVT

Slide 6

Slide 6 text

Turbo Boost⚡

Slide 7

Slide 7 text

MJCVW IUUQQBSTFS 7 DBSFT 0QFO44- [MJC OHIUUQ OBQJ 4UBOEBSE-JCSBSJFT +BWB4DSJQU Node.js inside

Slide 8

Slide 8 text

MJCVW IUUQQBSTFS 7 DBSFT 0QFO44- [MJC OHIUUQ OBQJ 4UBOEBSE-JCSBSJFT +BWB4DSJQU Node.js inside 7/FYU+BWB4DSJQU 0QUJNJ[FS

Slide 9

Slide 9 text

V8 Next JavaScript Optimizer

Slide 10

Slide 10 text

How v8 optimizes? • V8 tries to optimize code on runtime • However JavaScript is dynamic typed language • Optimized Code has some dynamic checks to validate assumptions. • If a dynamic check and a validation are failed, v8 deoptimized the code…

Slide 11

Slide 11 text

GVODUJPOY PCK \ SFUVSOPCKBPCKC ^

Slide 12

Slide 12 text

GVODUJPOY PCK \ SFUVSOPCKBPCKC ^ Y \B C^ Y \B C^

Slide 13

Slide 13 text

GVODUJPOY PCK \ SFUVSOPCKBPCKC ^ Y \B C^ Y \B C^ First, v8 runs the code for gathering feedbacks.

Slide 14

Slide 14 text

GVODUJPOY PCK \ SFUVSOPCKBPCKC ^ Y \B C^ Y \B C^ First, v8 runs the unoptimized code for gathering feedbacks. V8 guesses this function has 2 props and values are `number`

Slide 15

Slide 15 text

GVODUJPOY PCK \ SFUVSOPCKBPCKC ^ Y \B C^ Y \B C^ GPS WBSJJJ Y \B C^ First, v8 runs the unoptimized code for gathering feedbacks. When the function is hot, V8 optimized the function

Slide 16

Slide 16 text

GVODUJPOY PCK \ SFUVSOPCKBPCKC ^ Y \B C^ Y \B C^ GPS WBSJJJ Y \B C^ First, v8 runs the unoptimized code for gathering feedbacks. When the function is hot, V8 optimized the function V8 optimizes this x function 1. need to load a and b props 2. a and b value is `number` 3. sum a and b and return the value

Slide 17

Slide 17 text

GVODUJPOY PCK \ SFUVSOPCKBPCKC ^ Y \B C^ Y \B C^ GPS WBSJJJ Y \B C^ Y \B޷٣খ᝷แ C^ First, v8 runs the unoptimized code for gathering feedbacks. When the function is hot, V8 optimized the function However JavaScript can take dynamic parameters. this {a: '޷٣খ᝷แ'} is not `number`

Slide 18

Slide 18 text

However JavaScript can take dynamic parameters. this {a: '޷٣খ᝷แ'} is not `number` GVODUJPOY PCK \ SFUVSOPCKBPCKC ^ Y \B C^ Y \B C^ GPS WBSJJJ Y \B C^ Y \B޷٣খ᝷แ C^ First, v8 runs the unoptimized code for gathering feedbacks. When the function is hot, V8 optimized the function Oh… my optimization code has gone… need to go back to unoptimized code.

Slide 19

Slide 19 text

GVODUJPOY PCK \ SFUVSOPCKBPCKC ^ Y \B C^ Y \B C^ GPS WBSJJJ Y \B C^ Y \BBJFFFFFF C^ First, v8 runs the unoptimized code for gathering feedbacks. When the function is hot, V8 optimized the function Oh… my optimization code has gone… need to be back to unoptimized code. However JavaScript can execute dynamic parameters. those parameters are changed `a` prop value to `string` %FPQUJNJ[BUJPO

Slide 20

Slide 20 text

Previous Oprimizer: Crankshaft

Slide 21

Slide 21 text

GVODUJPOQPT Y Z \ DPOTUPCK\^ PCKYY PCKZZ PCK[ SFUVSOPCK ^ 1BSTFS JavaScript Source Code Abstract Syntax Tree 'VMM$PEF(FO $SBOLTIBGU $PNQJMFS kind = FUNCTION name = FactIf Instructions (size = 144) 0x29026660 0 55 push ebp 0x29026661 1 89e5 mov ebp,esp 0x29026663 3 56 push esi 0x29026664 4 57 push edi kind = OPTIMIZED_FUNCTION name = FactIf stack_slots = 1 Instructions (size = 512) 0x29027a00 0 55 push ebp 0x29027a01 1 89e5 mov ebp,esp 0x29027a03 3 56 push esi Unoptimized Machine Code Optimized Machine Code Optimize De-optimize

Slide 22

Slide 22 text

Unoptimized Machine Code Optimized Machine Code GVODUJPOQPT Y Z \ DPOTUPCK\^ PCKYY PCKZZ PCK[ SFUVSOPCK ^ 1BSTFS JavaScript Source Code Abstract Syntax Tree 'VMM$PEF(FO $SBOLTIBGU $PNQJMFS #include using namespace std; int main(){ int a = 7; int &n = a; mov L1, L2 0x2ddf8802cf6e rem L1 0x2ddf8802cf6e add L2 0x2ddf8802cf6e mov L1, L2 0x2ddf8802cf6e rem L1 0x2ddf8802cf6e add L2 0x2ddf8802cf6e Optimize De-optimize QSPEVDFEBMPUPGDPEFT DPTUJOHNFNPSZʜ &$."4DSJQUOPU TVQQPSUFE NBOZQPUFOUJBMSJTLTGPS EFPQUJNJ[BUJPO

Slide 23

Slide 23 text

Crankshaft problems • Don’t use let/const • Don’t use rest/spread parameters • Don’t use try/catch and try/finally • Don’t use for-in • If JIT killer kills optimizer, goes 
 down to terrible performance.

Slide 24

Slide 24 text

Crankshaft JIT problems • Don’t use let/const • Don’t use rest/spread parameters • Don’t use try/catch or try/finally • Don’t use for-in • If JIT killer kills optimizer, goes 
 down to terrible performance. Optimization Killer Do not support ES2015+ Deoptimization cost is high.

Slide 25

Slide 25 text

TurboFan & Ignition Interpreter

Slide 26

Slide 26 text

GVODUJPOQPT Y Z \ DPOTUPCK\^ PCKYY PCKZZ PCK[ SFUVSOPCK ^ 1BSTFS JavaScript Source Code Abstract Syntax Tree *HOJUJPO*OUFSQSFUFS 5VSCP'BO$PNQJMFS Parameter count 2 Frame size 8 12 E> 0x2ddf8802cf6e @ StackCheck 19 S> 0x2ddf8802cf6f @ LdaSmi [1] 0x2ddf8802cf71 @ Star r0 34 E> 0x2ddf8802cf73 @ LdaNamedProperty 28 E> 0x2ddf8802cf77 @ Add r0, [6] mov L1, L2 0x2ddf8802cf6e rem L1 0x2ddf8802cf6e add L2 0x2ddf8802cf6e mov L1, L2 0x2ddf8802cf6e rem L1 0x2ddf8802cf6e add L2 0x2ddf8802cf6e Bytecode Optimized Machine Code Optimize De-optimize

Slide 27

Slide 27 text

GVODUJPOQPT Y Z \ DPOTUPCK\^ PCKYY PCKZZ PCK[ SFUVSOPCK ^ 1BSTFS JavaScript Source Code Abstract Syntax Tree *HOJUJPO*OUFSQSFUFS 5VSCP'BO$PNQJMFS Parameter count 2 Frame size 8 12 E> 0x2ddf8802cf6e @ StackCheck 19 S> 0x2ddf8802cf6f @ LdaSmi [1] 0x2ddf8802cf71 @ Star r0 34 E> 0x2ddf8802cf73 @ LdaNamedProperty 28 E> 0x2ddf8802cf77 @ Add r0, [6] mov L1, L2 0x2ddf8802cf6e rem L1 0x2ddf8802cf6e add L2 0x2ddf8802cf6e mov L1, L2 0x2ddf8802cf6e rem L1 0x2ddf8802cf6e add L2 0x2ddf8802cf6e Bytecode Optimized Machine Code Optimize De-optimize CZUFDPEFJTOPUTPIJHI DPTUUIBODPEF &$."4DSJQUTVQQPSUFE %FPQUJNJ[BUJPOSJTLJT MPXFS

Slide 28

Slide 28 text

Crankshaft JIT problems • Don’t use let/const • Don’t use REST parameters • Don’t use try/catch or try/finally • Don’t use for-in • If JIT killer kills optimizer, goes 
 down to terrible performance. Eliminate JIT killers Support ES2015+ Deoptimization cost is not so high. ✓ ✓ ✓ ✓ ✓ 4PMWFE

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

MJCVW IUUQQBSTFS 7 DBSFT 0QFO44- [MJC OHIUUQ OBQJ 4UBOEBSE-JCSBSJFT +BWB4DSJQU Node.js inside /FYU)5511SPUPDPM 4VQQPSUFE

Slide 32

Slide 32 text

HTTP Next Protocol Support (aka http2)

Slide 33

Slide 33 text

http/1.1 problems

Slide 34

Slide 34 text

4FSWFS GET /main.js GET /main.css GET /image0.png

Slide 35

Slide 35 text

4FSWFS #SPXTFSDBOTFOESFRVFTUT POMZ

Slide 36

Slide 36 text

4FSWFS OFFEUPXBJUUPpOJTIQSFWJPVTSFRVFTU

Slide 37

Slide 37 text

4FSWFS "OEJGSFRVFTUJTTMPX CSPXTFS DBOVTFPOMZSFRVFTUT

Slide 38

Slide 38 text

4FSWFS "OEJGSFRVFTUJTTMPX CSPXTFS DBOVTFPOMZSFRVFTUT )FBEPG-JOF#MPDLJOH

Slide 39

Slide 39 text

http/2 solves HoL Blocking

Slide 40

Slide 40 text

Multiplexing requests on 1 TCP connection 4FSWFS 5$1$POOFDUJPOCVUNVMUJ SFRVFTUT

Slide 41

Slide 41 text

Multiplexing requests on 1 TCP connection 4FSWFS *GTPNFSFRVFTUTBSFTMPX #65 XIPMFSFRVFTUTBSFOPUB⒎FDUFE

Slide 42

Slide 42 text

DEMO

Slide 43

Slide 43 text

)551

Slide 44

Slide 44 text

)551

Slide 45

Slide 45 text

)551XJUIQVTI

Slide 46

Slide 46 text

Future . . .

Slide 47

Slide 47 text

Worker will come in next Node …(maybe v10?) ayo.js has the implementation. Node.js has some proposals.

Slide 48

Slide 48 text

Node.js has various use cases

Slide 49

Slide 49 text

Node.js has various use cases &WFSZUPPMTGSBNFXPSLTIBT$16JOUFOTJWFUBTLT

Slide 50

Slide 50 text

History of concurrent Node.js /PEFKT #FGPSFW 4JOHMF1SPDFTT 4JOHMF5ISFBE

Slide 51

Slide 51 text

History of concurrent Node.js /PEFKT .BTUFS1SPDFTT $IJME 1SPDFTT $IJME 1SPDFTT $IJME 1SPDFTT $IJME 1SPDFTT

Slide 52

Slide 52 text

History of concurrent Node.js /PEFKT .BTUFS1SPDFTT $IJME 1SPDFTT $IJME 1SPDFTT $IJME 1SPDFTT $IJME 1SPDFTT .BTUFS1SPDFTT DBOGPSLDIJMEQSPDFTT W

Slide 53

Slide 53 text

History of concurrent Node.js /PEFKT .BTUFS1SPDFTT 8PSLFS 8PSLFS 8PSLFS 8PSLFS 8PSLFS 8PSLFS

Slide 54

Slide 54 text

History of concurrent Node.js /PEFKT .BTUFS1SPDFTT 8PSLFS 8PSLFS 8PSLFS 8PSLFS 8PSLFS 8PSLFS .BTUFS1SPDFTTDBONBLFOFX8PSLFS UISFBE 8PSLFSHFOFSBUJPODPTUJTDIFBQFSUIBODIJMEQSPDFTT BOEDBOTIBSFUIFNFNPSZVTJOH4IBSFE"SSBZ#V⒎FS

Slide 55

Slide 55 text

Performance Bench using ayo.js

Slide 56

Slide 56 text

babel-core using single thread. target files (ES6) transpiled code (ES5)

Slide 57

Slide 57 text

babel-core using child_process .BTUFS target files Send File transpiled

Slide 58

Slide 58 text

babel-core using Worker /PEFKT .BTUFS target files transpiled Send File

Slide 59

Slide 59 text

Result pMF OVNCFST CBCFMDPSF VTJOHTJOHMFUISFBE CBCFMDPSF VTJOHDIJMEQSPDFTT CBCFMDPSF VTJOHXPSLFS NT NT NT NT NT NT NT NT NT NT NT NT NT NT NT

Slide 60

Slide 60 text

Result pMF OVNCFST CBCFMDPSF VTJOHTJOHMFUISFBE CBCFMDPSF VTJOHDIJMEQSPDFTT CBCFMDPSF VTJOHXPSLFS NT NT NT NT NT NT NT NT NT NT NT NT NT NT NT UBSHFUpMFT TJOHMF UISFBEXJOT OPSNBMCBCFM

Slide 61

Slide 61 text

Result pMF OVNCFST CBCFMDPSF VTJOHTJOHMFUISFBE CBCFMDPSF VTJOHDIJMEQSPDFTT CBCFMDPSF VTJOHXPSLFS NT NT NT NT NT NT NT NT NT NT NT NT NT NT NT UBSHFUpMFT XPSLFSXJOT

Slide 62

Slide 62 text

Summary • Node.js has some performance features. • V8 keeps improvement the JavaScript Performance, Turbofan + Ignition is fast. • HTTP2 will solve Head of Line blocking,
 http network is more faster. • Future Node.js may support Worker. 
 Worker can use CPU more efficiently.

Slide 63

Slide 63 text

Thank you

Slide 64

Slide 64 text

References • Deoptimization: https://docs.google.com/presentation/d/ 1Z6oCocRASCfTqGq1GCo1jbULDGS-w-nzxkbVF7Up0u0/edit#slide=id.p • v8-bailout-reasons: https://github.com/vhf/v8-bailout-reasons • v8 optimization killers: https://github.com/petkaantonov/bluebird/wiki/Optimization-killers • http2: https://http2.github.io/ • Developing the fastest http2 server: https://www.slideshare.net/kazuho/developing-the- fastest-http2-server • Exploring Future Node.js: https://speakerdeck.com/yosuke_furukawa/exploring-future-node • ayojs: https://github.com/ayojs/ayo • Shared Array Buffer and Atomics: http://2ality.com/2017/01/shared-array-buffer.html

Slide 65

Slide 65 text

References Demo Codes • DEMO Code: • https://github.com/yosuke-furukawa/check_v8 • https://github.com/yosuke-furukawa/http2- express-demo • https://github.com/yosuke-furukawa/worker- babel-demo