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();