flaska/benchmark/strings_compare.mjs

116 lines
3.1 KiB
JavaScript
Raw Permalink Normal View History

2024-11-02 12:44:54 +00:00
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();