116 lines
3.1 KiB
JavaScript
116 lines
3.1 KiB
JavaScript
|
import { printCurrentStatus, printStatusHelperText } from "./compiler/utils.mjs";
|
||
|
import { summary, run, bench } from 'mitata';
|
||
|
|
||
|
// Do warmup
|
||
|
bench('noop', () => { })
|
||
|
bench('noop2', () => { })
|
||
|
|
||
|
// Do checks with arrays
|
||
|
let arr = ['hi', 'there', 'nagna', 'randomlongstring', 'small']
|
||
|
arr = arr.map(x => [x, { path: x }])
|
||
|
let paths = arr.map(x => x[1])
|
||
|
|
||
|
// Do checks with objects
|
||
|
let obj = {};
|
||
|
let map = new Map()
|
||
|
for (let i = 0, l = arr.length; i < l; ++i) {
|
||
|
obj[arr[i][0]] = arr[i][1]
|
||
|
map.set(arr[i][0], arr[i][1])
|
||
|
};
|
||
|
let objHas1 = (obj, item) => { let x = obj[item]; if (x) { return x } return null };
|
||
|
let objHas2 = (obj, item) => { if (item in obj) { return obj[item] } return null }
|
||
|
let mapGet = (map, item) => { let x = map.get(item); if (x) { return x }; return null };
|
||
|
|
||
|
|
||
|
// Generate a function which compares the input string to all strings in the list
|
||
|
let basicIfChain = Function(`
|
||
|
return (paths, str) => {
|
||
|
${arr.map((item, i) => 'if (str === "' + item[0] + '") { return paths[' + i + '] }').join('\n ')}
|
||
|
return null
|
||
|
}
|
||
|
`)();
|
||
|
let basicIfChainAlt = Function(`
|
||
|
return (str) => {
|
||
|
${arr.map((item, i) => 'if (str === "' + item[0] + '") { return "' + item[0] + '" }').join('\n ')}
|
||
|
return null
|
||
|
}
|
||
|
`)();
|
||
|
function basicIfChainNoFunc(str) {
|
||
|
if (str === "hi") { return "hi" }
|
||
|
if (str === "there") { return "there" }
|
||
|
if (str === "nagna") { return "nagna" }
|
||
|
if (str === "randomlongstring") { return "randomlongstring" }
|
||
|
if (str === "small") { return "small" }
|
||
|
return null
|
||
|
}
|
||
|
function addTwo(a, b) {
|
||
|
return a + b
|
||
|
}
|
||
|
|
||
|
console.log(`
|
||
|
return (str) => {
|
||
|
${arr.map((item, i) => 'if (str === "' + item[0] + '") { return "' + item[0] + '" }').join('\n ')}
|
||
|
return null
|
||
|
}
|
||
|
`)
|
||
|
|
||
|
let func = [
|
||
|
['basicIfChainNoFunc', basicIfChainNoFunc, basicIfChainNoFunc],
|
||
|
['basicIfChainAlt', basicIfChainAlt, basicIfChainAlt],
|
||
|
['objHas1', objHas1, objHas1.bind(null, obj)],
|
||
|
['objHas2', objHas2, objHas2.bind(null, obj)],
|
||
|
['mapGet', mapGet, mapGet.bind(null, map)],
|
||
|
['basicIfChain', basicIfChain, basicIfChain.bind(null, paths)],
|
||
|
]
|
||
|
|
||
|
for (let [name, __, fun] of func) {
|
||
|
console.log(`--- Sanity checking ${name} ---`)
|
||
|
for (let a of arr) {
|
||
|
console.log(a[0], fun(a[0]))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Generate strings
|
||
|
let newArr = [];
|
||
|
for (let i = 0; i < 100000; i++)
|
||
|
newArr.push(Math.random() < 0.5 ? `${Math.random()}` : arr[Math.round(Math.random() * 4)].slice(0, -1 >>> 0));
|
||
|
|
||
|
console.log(`--- warming up addTwo ---`)
|
||
|
for (let i = 0; i < 100; i++) {
|
||
|
console.log(`--- run ${i} ---`)
|
||
|
for (let num of newArr) {
|
||
|
addTwo(num.length, num.length + 1)
|
||
|
}
|
||
|
await new Promise(res => setTimeout(res, 1000))
|
||
|
printCurrentStatus(addTwo);
|
||
|
}
|
||
|
|
||
|
|
||
|
for (let [name, org, fun] of func) {
|
||
|
console.log(`--- warming up ${name} ---`)
|
||
|
for (let i = 0; i < 100; i++) {
|
||
|
console.log(`--- run ${i} ---`)
|
||
|
newArr.forEach(fun)
|
||
|
await new Promise(res => setTimeout(res, 1000))
|
||
|
printCurrentStatus(org);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
console.log('--- sleeping ---')
|
||
|
await new Promise(res => setTimeout(res, 1000))
|
||
|
|
||
|
|
||
|
for (let [_, org] of func) {
|
||
|
printCurrentStatus(org);
|
||
|
}
|
||
|
printStatusHelperText()
|
||
|
|
||
|
|
||
|
summary(() => {
|
||
|
func.forEach(([name, _, fun]) => {
|
||
|
bench(name, () => newArr.map(fun));
|
||
|
})
|
||
|
});
|
||
|
|
||
|
run();
|