1 of 82

V8: Hooking up the Ignition to the Turbofan

Leszek Swirski & Ross McIlroy

Google London

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

2 of 82

Ignition + Turbofan pipeline

3 of 82

Why a new pipeline?

  • Reduce memory usage

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

4 of 82

Why a new pipeline?

  • Reduce memory usage

  • Reduce startup time

33% of time spent parsing + compiling

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

5 of 82

Why a new pipeline?

  • Reduce memory usage

  • Reduce startup time

  • Reduce complexity

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

6 of 82

Compiler Pipeline (2008)

Codegen

Semi-optimized Code

Baseline

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

7 of 82

Compiler Pipeline (2010)

Crankshaft

Optimized Code

Optimized

Full- codegen

Unoptimized Code

Baseline

Optimize

Deoptimize

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

8 of 82

Compiler Pipeline (2015)

Crankshaft

Optimized Code

TurboFan

Optimized

Full- codegen

Unoptimized Code

Baseline

Optimize

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

9 of 82

Compiler Pipeline (2015)

Crankshaft

Optimized Code

TurboFan

Optimized

Full- codegen

Unoptimized Code

Baseline

Optimize

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

10 of 82

Compiler Pipeline (2016)

Crankshaft

Optimized Code

TurboFan

Optimized

Full- codegen

Unoptimized Code

Baseline

Optimize

Ignition

Bytecode

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

11 of 82

Compiler Pipeline (2016)

Crankshaft

Optimized Code

TurboFan

Optimized

Full- codegen

Unoptimized Code

Baseline

Optimize

Ignition

Bytecode

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

12 of 82

Compiler Pipeline (Svelte Devices)

Crankshaft

Optimized Code

TurboFan

Optimized

Full- codegen

Unoptimized Code

Baseline

Optimize

Ignition

Bytecode

Interpreted

Optimize

Baseline

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

13 of 82

Compiler Pipeline (Svelte Devices)

Crankshaft

Optimized Code

TurboFan

Optimized

Full- codegen

Unoptimized Code

Baseline

Optimize

Ignition

Bytecode

Interpreted

Optimize

Baseline

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

14 of 82

Compiler Pipeline (2017)

Optimized Code

TurboFan

Optimized

Ignition

Bytecode

Interpreted

Optimize

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

15 of 82

Bytecode to graph

16 of 82

Ignition to Turbofan

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

function f(a, b) {var result = a + b;if (a > b) {

result = a - b;}return result;}

Text

Bytecode

(Ignition)

Sea-of-nodes graph

(Turbofan)

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

17 of 82

Executing bytecode

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

0x00000004

0x00000010

a0

a1

r0

Accumulator

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

18 of 82

Executing bytecode

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

0x00000004

0x00000010

a0

a1

r0

Accumulator

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

19 of 82

Executing bytecode

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

0x00000004

0x00000010

a0

a1

r0

Accumulator

0x00000010

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

20 of 82

Executing bytecode

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

0x00000004

0x00000010

a0

a1

r0

Accumulator

0x00000014

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

21 of 82

Executing bytecode

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

0x00000004

0x00000010

a0

a1

0x00000014

r0

Accumulator

0x00000014

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

22 of 82

Executing bytecode

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

0x00000004

0x00000010

a0

a1

0x00000014

r0

Accumulator

0x00000010

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

23 of 82

Executing bytecode

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

0x00000004

0x00000010

a0

a1

0x00000014

r0

Accumulator

0x00000010

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

24 of 82

Executing bytecode

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

0x00000004

0x00000010

a0

a1

0x00000014

r0

Accumulator

0x00000000

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

25 of 82

Executing bytecode

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

0x00000004

0x00000010

a0

a1

0x00000014

r0

Accumulator

0x00000000

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

26 of 82

Executing bytecode

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

0x00000004

0x00000010

a0

a1

0x00000014

r0

Accumulator

0x00000014

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

27 of 82

Executing bytecode

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

0x00000004

0x00000010

a0

a1

0x00000014

r0

Accumulator

0x00000014

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

28 of 82

Building a graph

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

29 of 82

Building a graph

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

30 of 82

Building a graph

2:Parameter[2]

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

31 of 82

Building a graph

2:Parameter[2]

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

2:Parameter[2]

3:StackCheck

4:JSAdd

1:Parameter[1]

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

32 of 82

Building a graph

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

2:Parameter[2]

3:StackCheck

4:JSAdd

1:Parameter[1]

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

33 of 82

Building a graph

4:JSAdd

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

34 of 82

Building a graph

4:JSAdd

2:Parameter[2]

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

35 of 82

Building a graph

4:JSAdd

2:Parameter[2]

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

1:Parameter[1]

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

36 of 82

Building a graph

4:JSAdd

5:JSGreater

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

37 of 82

Building a graph

5:JSGreater

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

6:Branch

7:IfTrue

8:IfFalse

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

38 of 82

Building a graph

5:JSGreater

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

6:Branch

7:IfTrue

8:IfFalse

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

39 of 82

Building a graph

5:JSGreater

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

6:Branch

7:IfTrue

8:IfFalse

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

40 of 82

Building a graph

2:Parameter[2]

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

6:Branch

7:IfTrue

8:IfFalse

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

41 of 82

Building a graph

7:IfTrue

6:Branch

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

2:Parameter[2]

1:Parameter[1]

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

42 of 82

Building a graph

7:IfTrue

6:Branch

9:JSSubtract

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

43 of 82

Building a graph

7:IfTrue

6:Branch

9:JSSubtract

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

9:JSSubtract

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

44 of 82

Building a graph

7:IfTrue

6:Branch

9:JSSubtract

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

9:JSSubtract

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

45 of 82

Building a graph

7:IfTrue

6:Branch

9:JSSubtract

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

9:JSSubtract

10:Merge

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

46 of 82

Building a graph

7:IfTrue

6:Branch

9:JSSubtract

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

9:JSSubtract

10:Merge

11:Phi

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

47 of 82

Building a graph

7:IfTrue

6:Branch

11:Phi

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

9:JSSubtract

10:Merge

11:Phi

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

48 of 82

Building a graph

7:IfTrue

6:Branch

11:Phi

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

22:

9:JSSubtract

10:Merge

11:Phi

12:Phi

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

49 of 82

Building a graph

7:IfTrue

6:Branch

11:Phi

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

12:Phi

10:Merge

11:Phi

12:Phi

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

50 of 82

Building a graph

7:IfTrue

6:Branch

11:Phi

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

11:Phi

10:Merge

11:Phi

12:Phi

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

51 of 82

Building a graph

7:IfTrue

6:Branch

11:Phi

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

11:Phi

10:Merge

11:Phi

12:Phi

13:Return

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

52 of 82

Building a graph

7:IfTrue

6:Branch

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

9:JSSubtract

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

2:Parameter[2]

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

53 of 82

Building a graph

7:IfTrue

6:Branch

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

2:Parameter[2]

9:FrameState

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

54 of 82

Building a graph

7:IfTrue

6:Branch

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

2:Parameter[2]

9:FrameState

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

55 of 82

Building a graph

7:IfTrue

6:Branch

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

2:Parameter[2]

9:FrameState

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

56 of 82

Building a graph

7:IfTrue

6:Branch

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

1:Parameter[1]

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

2:Parameter[2]

9:FrameState

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

57 of 82

Building a graph

7:IfTrue

6:Branch

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

10:JSSubtract

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

2:Parameter[2]

9:FrameState

1:Parameter[1]

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

58 of 82

Building a graph

7:IfTrue

6:Branch

4:JSAdd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

1:Parameter[1]

2:Parameter[2]

0:Start

2:Parameter[2]

3:StackCheck

4:JSAdd

5:JSGreater

8:IfFalse

10:JSSubtract

22:

5:JSGreater

4:JSAdd

Registers

r0

Accumulator

Parent

8:IfFalse

2:Parameter[2]

9:FrameState

1:Parameter[1]

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

59 of 82

Building a graph

0xba8320fd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

0x1237ab57

0x1237ab57

0xfe902ab5

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

60 of 82

Building a graph

0xba8320fd

0 : 7d StackCheck

1 : 1c 02 Ldar a1

3 : 28 03 02 Add a0, [2]

6 : 1d fa Star r0

8 : 1c 02 Ldar a1

10 : 4f 03 03 TestGreaterThan a0, [3]

13 : 74 09 JumpIfFalse [9] (@22)

15 : 1c 02 Ldar a1

17 : 29 03 04 Sub a0, [4]

20 : 1d fa Star r0

22 : 1c fa Ldar r0

24 : 81 Return

Parameters

Registers

a0

a1

r0

Accumulator

0x1237ab57

0xad80b1cf

0xfe902ab5

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

61 of 82

Bytecode Restrictions to Simplifying Graph Creation

  • Always deopt to a bytecode
  • Well-scoped basic blocks
    • Exception handlers cover a single linear range of bytecode
  • No irreducible control flow
  • Single backwards-branch to loop header
  • Registers in loop-closed form

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

62 of 82

Static analysis of bytecode

  • Pre-analyze bytecode before building graph
    • Liveness analysis (for deoptimisation frame states)
    • Loop assignment analysis (for loop phis)
  • Don’t generate unnecessary nodes
    • Avoid memory overhead (40+ bytes per node)
    • Avoid graph traversals

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

63 of 82

Liveness analysis

  • Previously iterated traversal over basic blocks
    • Create liveness maps and state value nodes during graph building
    • Re-create state value nodes based on liveness afterward
  • Now iterated passes over bytecode array
    • State value nodes created only once

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

64 of 82

Liveness analysis

  • Previously iterated traversal over basic blocks
    • Create liveness maps and state value nodes during graph building
    • Re-create state value nodes based on liveness afterward
  • Now iterated passes over bytecode array
    • State value nodes created only once

100 MB (21%)

56 ms

(12%)

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

65 of 82

Liveness analysis

  • Previously iterated traversal over basic blocks
    • Create liveness maps and state value nodes during graph building
    • Re-create state value nodes based on liveness afterward
  • Now iterated passes over bytecode array
    • State value nodes created only once

93 MB (2.5%)

114 ms

(1.1%)

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

66 of 82

Liveness analysis

  • Previously iterated traversal over basic blocks
    • Create liveness maps and state value nodes during graph building
    • Re-create state value nodes based on liveness afterward
  • Now iterated passes over bytecode array
    • State value nodes created only once

21%

6.8%

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

67 of 82

Burning away complex control (Generators)

  • Javascript Generators can yield expressions at arbitrary points
    • Can introduce irreducible control flow
    • Solution: transform into switch statements on hidden token in prologue and loop headers
    • Result: Turbofan doesn’t need to know anything about generator control flow

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

68 of 82

Burning away complex control (Generators)

function* f() {

var i = 0;

while (true) {

yield i++;� }

}

function f(hidden_token) {

switch(hidden_token)

case %normal%: break;

case %resume%: goto loop;

var i = 0;

loop:

switch(hidden_token)

case %normal%: break;

case %resume%: goto resume;

hidden_token = %resume%;

return i++;

resume:

hidden_token = %normal%;goto loop;

}

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

69 of 82

Burning away complex control (try-finally)

  • try-finally exception handlers
    • Exit differently depending on what triggered the finally block (fall-through, return or throw)
    • Solution: switch statement at end of finally block
    • Result: Turbofan doesn’t need to know anything about try-finally control flow

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

70 of 82

Burning away complex control (try-finally)

try {

if a() return;

} finally {

b();

}�

try:

if a() {

finally_token = %return%;

goto finally;

}

finally_token = %fallthrough%;

goto finally;

throw_handler:

finally_token = %throw%;

finally:

b();

switch(finally_token)

case %return%: return;

case %throw%: rethrow();

case %fallthrough%: break;

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

71 of 82

Performance Results

72 of 82

Code Memory Usage (Real Websites)

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

73 of 82

Ignition vs Full-Codegen

Octane (Nexus 5)Crankshaft and TurboFan disabled

Better

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

74 of 82

Ignition vs Full-Codegen

Octane (Nexus 5)Crankshaft and TurboFan disabled

Better

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

75 of 82

Octane Performance

Full-Codegen + Crankshaft

Ignition + Crankshaft

Ignition + Turbofan

Better

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

76 of 82

Octane Performance

Full-Codegen + Crankshaft

Ignition + Crankshaft

Ignition + Turbofan

40% slower

75% slower

<5% slower

15% slower

Better

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

77 of 82

Speedometer Performance

Better

Full-Codegen + Crankshaft

Ignition + Crankshaft

Ignition + Turbofan

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

78 of 82

Speedometer Performance

Better

Full-Codegen + Crankshaft

Ignition + Crankshaft

Ignition + Turbofan

14% slower

<1% slower

10% slower

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

79 of 82

Startup Time (Real Websites)

Inbox

BBC News (AMP)

Facebook

Page Load (ms)

Default

Ignition

Default

Ignition

Default

Ignition

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

80 of 82

Startup Time (Real Websites)

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

81 of 82

Where time is spent (Real Websites)

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem

82 of 82

Summary

  • Ignition + Turbofan is the future of V8
  • Restrictions on bytecode can simplify optimized graph creation
  • Optimizing for real-world exposes different trade-offs

Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem