import { readFile, writeFile } from 'fs/promises'; import { join as pathJoin } from 'path'; import { Bench } from 'tinybench'; import { fileURLToPath } from 'url'; 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)); }