f4937949d6
* Add timer setting * Setup benchmark code * Setup memory benchmark * Add compare function * Add result preview * Setup results preview * Simplify script for CI * Update CI * Cleanup * Temp remove fork guard * Fix stuff * Fix again * Fix quotes * Fix multiline output * Simplify title * Fix memory numbers * Remove astro bin dir * Fix gc * Add repo guards * Fix wrong call * Set max space size * Remove guard * Bump memory a bit * Organize neatly * Update readme * Try large md * Try no gc * Revert markdown and gc changes * Test sha * Try ref * Try 128mb * Set 256 * Add guard * Apply suggestions from code review Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> * Add docs comment --------- Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca>
58 lines
1.5 KiB
JavaScript
58 lines
1.5 KiB
JavaScript
import fs from 'fs/promises';
|
|
import { fileURLToPath } from 'url';
|
|
import { execaCommand } from 'execa';
|
|
import { markdownTable } from 'markdown-table';
|
|
import { astroBin } from './_util.js';
|
|
|
|
/** @typedef {Record<string, import('../../packages/astro/src/core/config/timer').Stat>} AstroTimerStat */
|
|
|
|
/** Default project to run for this benchmark if not specified */
|
|
export const defaultProject = 'memory-default';
|
|
|
|
/**
|
|
* @param {URL} projectDir
|
|
* @param {URL} outputFile
|
|
*/
|
|
export async function run(projectDir, outputFile) {
|
|
const root = fileURLToPath(projectDir);
|
|
const outputFilePath = fileURLToPath(outputFile);
|
|
|
|
console.log('Building and benchmarking...');
|
|
await execaCommand(`node --expose-gc --max_old_space_size=256 ${astroBin} build`, {
|
|
cwd: root,
|
|
stdio: 'inherit',
|
|
env: {
|
|
ASTRO_TIMER_PATH: outputFilePath,
|
|
},
|
|
});
|
|
|
|
console.log('Raw results written to', outputFilePath);
|
|
|
|
console.log('Result preview:');
|
|
console.log('='.repeat(10));
|
|
console.log(`#### Memory\n\n`);
|
|
console.log(printResult(JSON.parse(await fs.readFile(outputFilePath, 'utf-8'))));
|
|
console.log('='.repeat(10));
|
|
|
|
console.log('Done!');
|
|
}
|
|
|
|
/**
|
|
* @param {AstroTimerStat} output
|
|
*/
|
|
function printResult(output) {
|
|
return markdownTable(
|
|
[
|
|
['', 'Elapsed time (s)', 'Memory used (MB)', 'Final memory (MB)'],
|
|
...Object.entries(output).map(([name, stat]) => [
|
|
name,
|
|
(stat.elapsedTime / 1000).toFixed(2),
|
|
(stat.heapUsedChange / 1024 / 1024).toFixed(2),
|
|
(stat.heapUsedTotal / 1024 / 1024).toFixed(2),
|
|
]),
|
|
],
|
|
{
|
|
align: ['l', 'r', 'r', 'r'],
|
|
}
|
|
);
|
|
}
|