oxc/napi/parser/parse.bench.mjs
overlookmotel 2c0a7d6c23
fix(tasks): reduce variance of NAPI benchmarks (#2780)
Reduce variance in NodeJS/NAPI benchmarks by running them for longer.
2024-03-21 16:21:44 +00:00

75 lines
2.4 KiB
JavaScript

import {fileURLToPath} from 'url';
import {join as pathJoin} from 'path';
import {readFile, writeFile} from 'fs/promises';
import {Bench} from 'tinybench';
import {parseSync} from './index.js';
const IS_CI = !!process.env.CI,
ACCURATE = IS_CI || process.env.ACCURATE;
const urls = [
// TypeScript syntax (2.81MB)
'https://raw.githubusercontent.com/microsoft/TypeScript/v5.3.3/src/compiler/checker.ts',
// Real world app tsx (1.0M)
'https://raw.githubusercontent.com/oxc-project/benchmark-files/main/cal.com.tsx',
// Real world content-heavy app jsx (3K)
'https://raw.githubusercontent.com/oxc-project/benchmark-files/main/RadixUIAdoptionSection.jsx',
// Heavy with classes (554K)
'https://cdn.jsdelivr.net/npm/pdfjs-dist@4.0.269/build/pdf.mjs',
// ES5 (3.9M)
'https://cdn.jsdelivr.net/npm/antd@5.12.5/dist/antd.js',
];
// Same directory as Rust benchmarks use for downloaded files
const cacheDirPath = pathJoin(fileURLToPath(import.meta.url), '../../../target');
const files = await Promise.all(urls.map(async (url) => {
const filename = url.split('/').at(-1),
path = pathJoin(cacheDirPath, filename);
let code;
try {
code = await readFile(path, 'utf8');
if (IS_CI) console.log('Found cached file:', filename);
} catch {
if (IS_CI) console.log('Downloading:', filename);
const res = await fetch(url);
code = await res.text();
await writeFile(path, code);
}
return {filename, code};
}));
const bench = new Bench(
ACCURATE
? {
warmupIterations: 20, // Default is 5
time: 5000, // 5 seconds, default is 500 ms
iterations: 100, // Default is 10
}
: undefined
);
for (const {filename, code} of files) {
bench.add(`parser_napi[${filename}]`, () => {
const res = parseSync(code, {sourceFilename: filename});
JSON.parse(res.program);
});
}
console.log('Warming up');
await bench.warmup();
console.log('Running benchmarks');
await bench.run();
console.table(bench.table());
// If running on CI, save results to file
if (IS_CI) {
const dataDir = process.env.DATA_DIR;
const results = bench.tasks.map(task => ({
filename: task.name.match(/\[(.+)\]$/)[1],
duration: task.result.period / 1000, // In seconds
}));
await writeFile(pathJoin(dataDir, 'results.json'), JSON.stringify(results));
}