Wrong assumptions lead to deoptimization function add(a, b) { return a + b; } add(1, 2) add(1, 2) add(1, 2) add(1, 2) add(1, 2) optimization - a, b are Numbers
Wrong assumptions lead to deoptimization function add(a, b) { return a + b; } add(1, 2) add(1, 2) add(1, 2) add(1, 2) add(1, 2) add(1, 2) optimization - a, b are Numbers
Wrong assumptions lead to deoptimization function add(a, b) { return a + b; } add(1, 2) add(1, 2) add(1, 2) add(1, 2) add(1, 2) add(1, 2) add(“abc”, “def”) optimization - a, b are Numbers deoptimization
a graph representation of single-static assignment (SSA) representation of a program that combines data flow and control flow, and relaxes the control flow from a total order to a partial order, keeping only the orderings required by data flow.
< b) { b -= 1; a += 1; } Control Flow Graph • Basic Blocks ◦ Consecutive instructions • Control dependencies ◦ if, while, for, function, call, return • Doesn’t care about data
0; while (i < arr.length) { sum += arr[i]; i += 1; } return sum; } Control Flow Graph Start i < arr.length sum += arr[i] i += 1 let sum = 0 let i = 0 true false
0; while (i < arr.length) { sum += arr[i]; i += 1; } return sum; } Control Flow Graph Start i < arr.length sum += arr[i] i += 1 return sum let sum = 0 let i = 0 true false
0; while (i < arr.length) { sum += arr[i]; i += 1; } return sum; } Control Flow Graph Start i < arr.length sum += arr[i] i += 1 return sum End let sum = 0 let i = 0 true false
let i = 0; while (i < arr.length) { sum += arr[i]; i += 1; } return sum; } Start i < arr.length sum += arr[i] i += 1 return sum End var sum = 0 var i = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i < arr.length sum = sum + arr[i] i = i + 1 return sum End var sum = 0 var i = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i < arr.length sum = sum + arr[i] i = i + 1 return sum End var sum = 0 var i = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i < arr.length sum = sum + arr[i] i = i + 1 return sum End var sum = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i < arr.length sum = sum + arr[i] i1 = i + 1 return sum End var sum = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i < arr.length return sum End var sum = 0 var i0 = 0 true sum = sum + arr[i] i1 = i + 1 false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i0 < arr.length return sum End var sum = 0 var i0 = 0 true sum = sum + arr[i] i1 = i1 + 1 false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i1 < arr.length return sum End var sum = 0 var i0 = 0 true sum = sum + arr[i] i1 = i + 1 false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i2 =ɸ(i0, i1) i < arr.length return sum End var sum = 0 var i0 = 0 true sum = sum + arr[i] i1 = i + 1 false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i2 =ɸ(i0, i1) i2 < arr.length return sum End var sum = 0 var i0 = 0 true sum = sum + arr[i] i1 = i + 1 false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i2 =ɸ(i0, i1) i2 < arr.length sum = sum + arr[i] i1 = i + 1 return sum End var sum = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i2 =ɸ(i0, i1) i2 < arr.length sum = sum + arr[i] i1 = i + 1 return sum End var sum = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i2 =ɸ(i0, i1) i2 < arr.length sum = sum + arr[i2] i1 = i2 + 1 return sum End var sum = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i2 =ɸ(i0, i1) i2 < arr.length sum = sum + arr[i2] i1 = i2 + 1 return sum End var sum0 = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i2 =ɸ(i0, i1) i2 < arr.length sum1 = sum + arr[i2] i1 = i2 + 1 return sum End var sum0 = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i2 =ɸ(i0, i1) i2 < arr.length sum1 = sum + arr[i2] i1 = i2 + 1 return sum End var sum0 = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i2 =ɸ(i0, i1) i2 < arr.length sum1 = sum + arr[i2] i1 = i2 + 1 return sum End var sum0 = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start i2 =ɸ(i0, i1) i2 < arr.length sum1 = sum + arr[i2] i1 = i2 + 1 return sum End var sum0 = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start sum2 = ɸ(sum0, sum1) i2 =ɸ(i0, i1) i2 < arr.length sum1 = sum + arr[i2] i1 = i2 + 1 return sum End var sum0 = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start sum2 = ɸ(sum0, sum1) i2 =ɸ(i0, i1) i2 < arr.length sum1 = sum + arr[i2] i1 = i2 + 1 return sum End var sum0 = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start sum2 = ɸ(sum0, sum1) i2 =ɸ(i0, i1) i2 < arr.length sum1 = sum2 + arr[i2] i1 = i2 + 1 return sum End var sum0 = 0 var i0 = 0 true false
let i = 0; while (i < arr.length) { sum = sum + arr[i]; i = i + 1; } return sum; } Start sum2 = ɸ(sum0, sum1) i2 =ɸ(i0, i1) i2 < arr.length sum1 = sum2 + arr[i2] i1 = i2 + 1 return sum End var sum0 = 0 var i0 = 0 true false
◦ Avoids deoptimization • Declare properties in the constructor ◦ Avoids deoptimization • Declare classes in the global scope • Avoid arrays with holes ◦ const arr = [0]; arr[5] = 3; ◦ [ 0, <4 empty items>, 3 ] • Don’t be afraid to use builtins ◦ Array.prototype.forEach() How Can We Help TurboFan?
stuff • https://www.youtube.com/watch?v=cvybnv79Sek - Talk by Benedikt Meurer about TurboFan • https://darksi.de/d.sea-of-nodes/ - Good explanation of Sea of Nodes • https://github.com/pranayga/expl0ring_V8/blob/master/docs/ Turbofan.md - Interesting doc about TurboFan • https://github.com/SeaOfNodes/Simple - Showcase of Sea of Nodes • https://www.youtube.com/watch?v=98lt45Aj8mo&t=1591s - Talk by Cliff Click (creator of Sea of Nodes) on Sea of Nodes