-
Notifications
You must be signed in to change notification settings - Fork 0
/
benchmark.js
80 lines (69 loc) · 2.19 KB
/
benchmark.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import fs from "fs/promises";
import path from "path";
import Benchmark from "benchmark";
import makeParsers from "./parsers.js";
function htmlDoc(html) {
return `<html><head></head><body>${html}</body></html>`;
}
async function runBenchmark() {
const markdown = (await fs.readFile("markdown.md")).toString();
const parsers = await makeParsers();
const names = Object.keys(parsers);
const results = Object.fromEntries(names.map((name) => [name, {}]));
const htmlResults = {};
await new Promise((resolve) => {
const benchmark = new Benchmark.Suite("Markdown parsers")
.on("error", (event) => {
results[event.target.name].error = event.target.error.message;
})
.on("cycle", (event) => {
results[event.target.name].benchmark = event.target;
})
.on("complete", resolve);
for (const name of names) {
benchmark.add(
name,
() => {
htmlResults[name] = parsers[name](markdown);
},
{ maxTime: 10 }
);
}
benchmark.run();
});
// Save HTML result
for (const [name, html] of Object.entries(htmlResults)) {
await fs.writeFile(path.join("html", `${name}.html`), htmlDoc(html));
}
// Sort by ops/sec
const sortedResults = Object.fromEntries(
Object.entries(results)
.sort((a, b) => b[1].benchmark.hz - a[1].benchmark.hz)
.map(([name, { benchmark }]) => [
name,
{
ops: Benchmark.formatNumber(benchmark.hz.toFixed(0)),
rme: benchmark.stats.rme.toFixed(2),
runs: benchmark.stats.sample.length.toString(),
},
])
);
const maxNameLength = Math.max(...names.map((name) => name.length));
const max = (attr) =>
Math.max(
...Object.values(sortedResults).map((stats) => stats[attr].length)
);
const maxOpsLength = max("ops");
const maxRmeLength = max("rme");
const maxRunsLength = max("runs");
for (const [name, { ops, rme, runs }] of Object.entries(sortedResults)) {
console.log(
`${name.padEnd(maxNameLength)} ${ops.padStart(
maxOpsLength
)} ops/sec \xb1${rme.padStart(maxRmeLength)}% (${runs.padStart(
maxRunsLength
)} runs sampled)`
);
}
}
runBenchmark();