148 lines
4.5 KiB
JavaScript
148 lines
4.5 KiB
JavaScript
import { summary, run, bench } from 'mitata';
|
|
|
|
function printCurrentStatus(fn) {
|
|
let opt = %GetOptimizationStatus(fn)
|
|
console.log(`${opt.toString(2).padStart(17, '0').split('').join(' ')} (${opt}) ${fn.name}`)
|
|
}
|
|
function printStatusHelperText() {
|
|
console.log(`┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬
|
|
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─╸ is function
|
|
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───╸ is never optimized
|
|
│ │ │ │ │ │ │ │ │ │ │ │ │ │ └─────╸ is always optimized
|
|
│ │ │ │ │ │ │ │ │ │ │ │ │ └───────╸ is maybe deoptimized
|
|
│ │ │ │ │ │ │ │ │ │ │ │ └─────────╸ is optimized
|
|
│ │ │ │ │ │ │ │ │ │ │ └───────────╸ is optimized by TurboFan
|
|
│ │ │ │ │ │ │ │ │ │ └─────────────╸ is interpreted
|
|
│ │ │ │ │ │ │ │ │ └───────────────╸ is marked for optimization
|
|
│ │ │ │ │ │ │ │ └─────────────────╸ is marked for concurrent optimization
|
|
│ │ │ │ │ │ │ └───────────────────╸ is optimizing concurrently
|
|
│ │ │ │ │ │ └─────────────────────╸ is executing
|
|
│ │ │ │ │ └───────────────────────╸ topmost frame is turbo fanned
|
|
│ │ │ │ └─────────────────────────╸ lite mode
|
|
│ │ │ └───────────────────────────╸ marked for deoptimization
|
|
│ │ └─────────────────────────────╸ baseline
|
|
│ └───────────────────────────────╸ topmost frame is interpreted
|
|
└─────────────────────────────────╸ topmost frame is baseline`)
|
|
}
|
|
|
|
// Warmup (de-optimize `bench()` calls)
|
|
bench('noop', () => { });
|
|
bench('noop2', () => { });
|
|
|
|
function ifSingle(a) {
|
|
if (a[0] === 97 && a[1] === 97 && a[2] === 97 && a[3] === 97 && a.length === 4) {
|
|
return 100
|
|
}
|
|
return 10
|
|
}
|
|
|
|
function ifChain(a) {
|
|
if (a[0] === 97)
|
|
if (a[1] === 97)
|
|
if (a[2] === 97)
|
|
if (a[3] === 97)
|
|
if (a.length === 4) {
|
|
return 100
|
|
}
|
|
return 10
|
|
}
|
|
|
|
function ifSingleOpt(a) {
|
|
if (a.length >= 4 && a[0] === 97 && a[1] === 97 && a[2] === 97 && a[3] === 97 && a.length === 4) {
|
|
return 100
|
|
}
|
|
return 10
|
|
}
|
|
|
|
function ifChainOpt(a) {
|
|
if (a.length >= 4)
|
|
if (a[0] === 97)
|
|
if (a[1] === 97)
|
|
if (a[2] === 97)
|
|
if (a[3] === 97)
|
|
if (a.length === 4) {
|
|
return 100
|
|
}
|
|
return 10
|
|
}
|
|
|
|
function ifSingleOptAlt(a) {
|
|
if (a.length >= 4 && a[0] == 97 && a[1] == 97 && a[2] == 97 && a[3] == 97 && a.length == 4) {
|
|
return 100
|
|
}
|
|
return 10
|
|
}
|
|
|
|
function ifChainOptAlt(a) {
|
|
if (a.length >= 4)
|
|
if (a[0] == 97)
|
|
if (a[1] == 97)
|
|
if (a[2] == 97)
|
|
if (a[3] == 97)
|
|
if (a.length == 4) {
|
|
return 100
|
|
}
|
|
return 10
|
|
}
|
|
|
|
let paths = [
|
|
[97, 97, 97, 97],
|
|
[97, 97, 97, 97, 97],
|
|
[97, 97, 96, 97],
|
|
[97, 96, 97, 97],
|
|
[96, 97, 97, 97],
|
|
[],
|
|
[98],
|
|
[97, 97, 97],
|
|
[97, 97],
|
|
[97],
|
|
[97, 97, 96],
|
|
[97, 96],
|
|
[96],
|
|
]
|
|
|
|
let paths2 = [
|
|
[97, 97, 97, 97],
|
|
[97, 97, 97, 97, 97],
|
|
[97, 97, 96, 97],
|
|
[97, 96, 97, 97],
|
|
[96, 97, 97, 97],
|
|
[97, 97, 97, 97],
|
|
[97, 97, 97, 97, 97],
|
|
[97, 97, 96, 97],
|
|
[97, 96, 97, 97],
|
|
[96, 97, 97, 97],
|
|
[97, 97, 97, 97, 97, 97],
|
|
[97, 97, 97, 97, 96, 97],
|
|
[97, 97, 97, 97, 97, 96],
|
|
]
|
|
|
|
let func1 = [ifSingle, ifChain, ifSingleOpt, ifChainOpt, ifSingleOptAlt, ifChainOptAlt];
|
|
for (let fun of func1) {
|
|
console.log('-- begin', fun.name)
|
|
for (var i = 0; i < 1000000; i++) {
|
|
paths.map(fun)
|
|
}
|
|
printCurrentStatus(fun);
|
|
}
|
|
printStatusHelperText()
|
|
|
|
|
|
summary(() => {
|
|
func1.forEach(function(fun) {
|
|
bench(fun.name + ' first', function() {
|
|
return paths.map(fun)
|
|
})
|
|
})
|
|
func1.forEach(function(fun) {
|
|
bench(fun.name + ' second', function() {
|
|
return paths2.map(fun)
|
|
})
|
|
})
|
|
})
|
|
run().then(function() {
|
|
for (let fun of func1) {
|
|
printCurrentStatus(fun);
|
|
}
|
|
printStatusHelperText()
|
|
});
|