diff --git a/src/assets/funcs.js b/src/assets/funcs.js index ee8f12edb..1c4d6c802 100644 --- a/src/assets/funcs.js +++ b/src/assets/funcs.js @@ -87,6 +87,11 @@ export function renderGraph(canvas, dataset, labels, xAxis, alpha = 60, labelStr lines.push(` ${key}: ${value}`) } } + if (data.extra) { + for (const [key, value] of Object.entries(data.extra)) { + lines.push(`${key}: ${value}`) + } + } return '\n' + lines.join('\n') + '\n'; }, label: item => { diff --git a/src/extract.ts b/src/extract.ts index 6b042983f..de84b6c6a 100644 --- a/src/extract.ts +++ b/src/extract.ts @@ -33,6 +33,7 @@ export interface Benchmark { date: number; benches: BenchmarkResult[]; cpu?: CpuData; + extra?: { [key: string]: string }; } export interface PytestBenchmarkJson { @@ -145,20 +146,23 @@ function getCommit(): Commit { /* eslint-enable @typescript-eslint/camelcase */ } -function extractPytestResult(output: string): BenchmarkResult[] { +function extractPytestResult(output: string): { results: BenchmarkResult[]; extra: { [key: string]: string } } { try { const json: PytestBenchmarkJson = JSON.parse(output); - return json.benchmarks.map(bench => { - const stats = bench.stats; - const name = bench.fullname; - const group = bench.group; - const value = stats.ops; - const unit = 'iter/sec'; - const range = `stddev: ${precise(stats.stddev)}`; - const [mean, meanUnit] = getHumanReadableUnitValue(stats.mean); - const extra = `mean: ${precise(mean)} ${meanUnit}\nrounds: ${stats.rounds}`; - return { name, value, unit, range, group, extra }; - }); + return { + extra: { pythonVersion: json.machine_info.python_version }, + results: json.benchmarks.map(bench => { + const stats = bench.stats; + const name = bench.fullname; + const group = bench.group; + const value = stats.ops; + const unit = 'iter/sec'; + const range = `stddev: ${precise(stats.stddev)}`; + const [mean, meanUnit] = getHumanReadableUnitValue(stats.mean); + const extra = `mean: ${precise(mean)} ${meanUnit}\nrounds: ${stats.rounds}`; + return { name, value, unit, range, group, extra }; + }), + }; } catch (err) { throw new Error( `Output file for 'pytest' must be JSON file generated by --benchmark-json option: ${err.message}`, @@ -171,7 +175,7 @@ export async function extractResult(config: Config): Promise { const benches = extractPytestResult(output); - if (benches.length === 0) { + if (benches.results.length === 0) { throw new Error(`No benchmark result was found in ${config.outputFilePath}. Benchmark output was '${output}'`); } @@ -181,8 +185,9 @@ export async function extractResult(config: Config): Promise { return { cpu: { speed, cores, physicalCores, processors }, + extra: benches.extra, commit, date: Date.now(), - benches, + benches: benches.results, }; } diff --git a/test/assets.ts b/test/assets.ts index 789589cf7..3c394673c 100644 --- a/test/assets.ts +++ b/test/assets.ts @@ -13,9 +13,13 @@ describe('check assets', function() { A.ok(s, 'main script'); }); it('main.js is valid Javascript', async function() { - // Verify HTML syntax const js = await fs.readFile(join(__dirname, '../src/assets/main.js'), 'utf8'); // Verify JavaScript syntax. It raises an error if invalid JsParser.parse(js, { sourceType: 'module' }); }); + it('funcs.js is valid Javascript', async function() { + const js = await fs.readFile(join(__dirname, '../src/assets/funcs.js'), 'utf8'); + // Verify JavaScript syntax. It raises an error if invalid + JsParser.parse(js, { sourceType: 'module' }); + }); });