Skip to content

Commit da1c05c

Browse files
committed
chore(NODE-6724): report composite benchmark scores
1 parent aa16f6b commit da1c05c

File tree

3 files changed

+112
-9
lines changed

3 files changed

+112
-9
lines changed

test/benchmarks/driver_bench/src/driver.mts

+15-6
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,20 @@ const COLLECTION_NAME = 'corpus';
112112

113113
const SPEC_DIRECTORY = path.resolve(__dirname, '..', '..', 'driverBench', 'spec');
114114

115-
export function metrics(test_name: string, result: number, count: number) {
115+
export type Metric = {
116+
name: 'megabytes_per_second';
117+
value: number;
118+
};
119+
120+
export type MetricInfo = {
121+
info: {
122+
test_name: string;
123+
args: Record<string, number>;
124+
};
125+
metrics: Metric[];
126+
};
127+
128+
export function metrics(test_name: string, result: number): MetricInfo {
116129
return {
117130
info: {
118131
test_name,
@@ -125,11 +138,7 @@ export function metrics(test_name: string, result: number, count: number) {
125138
])
126139
)
127140
},
128-
metrics: [
129-
{ name: 'megabytes_per_second', value: result },
130-
// Reporting the count so we can verify programmatically or in UI how many iterations we reached
131-
{ name: 'count', value: count }
132-
]
141+
metrics: [{ name: 'megabytes_per_second', value: result }]
133142
} as const;
134143
}
135144

test/benchmarks/driver_bench/src/main.mts

+96-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/* eslint-disable no-console */
2+
import assert from 'node:assert/strict';
23
import child_process from 'node:child_process';
34
import events from 'node:events';
45
import fs from 'node:fs/promises';
@@ -7,6 +8,9 @@ import path from 'node:path';
78
import util from 'node:util';
89

910
import {
11+
type Metric,
12+
type MetricInfo,
13+
metrics,
1014
MONGODB_BSON_PATH,
1115
MONGODB_BSON_REVISION,
1216
MONGODB_BSON_VERSION,
@@ -81,7 +85,7 @@ console.log(systemInfo());
8185

8286
const runnerPath = path.join(__dirname, 'runner.mjs');
8387

84-
const results = [];
88+
const results: MetricInfo[] = [];
8589

8690
for (const [suite, benchmarks] of Object.entries(tests)) {
8791
console.group(snakeToCamel(suite));
@@ -106,4 +110,94 @@ for (const [suite, benchmarks] of Object.entries(tests)) {
106110
console.groupEnd();
107111
}
108112

109-
await fs.writeFile('results.json', JSON.stringify(results, undefined, 2), 'utf8');
113+
function calculateCompositeBenchmarks(results: MetricInfo[]) {
114+
const composites = {
115+
singleBench: ['findOne', 'smallDocInsertOne', 'largeDocInsertOne'],
116+
multiBench: [
117+
'findManyAndEmptyCursor',
118+
'gridFsDownload',
119+
'gridFsUpload',
120+
'largeDocBulkInsert',
121+
'smallDocBulkInsert'
122+
],
123+
// parallelBench: [
124+
// 'ldjsonMultiFileUpload',
125+
// 'ldjsonMultiFileExport',
126+
// 'gridfsMultiFileUpload',
127+
// 'gridfsMultiFileDownload'
128+
// ],
129+
readBench: [
130+
'findOne',
131+
'findManyAndEmptyCursor',
132+
'gridFsDownload'
133+
// 'gridfsMultiFileDownload',
134+
// 'ldjsonMultiFileExport'
135+
],
136+
writeBench: [
137+
'smallDocInsertOne',
138+
'largeDocInsertOne',
139+
'smallDocBulkInsert',
140+
'largeDocBulkInsert',
141+
'gridFsUpload'
142+
// 'ldjsonMultiFileUpload',
143+
// 'gridfsMultiFileUpload'
144+
]
145+
};
146+
147+
const aMetricInfo =
148+
(testName: string) =>
149+
({ info: { test_name } }: MetricInfo) =>
150+
test_name === testName;
151+
152+
const anMBsMetric = ({ name }: Metric) => name === 'megabytes_per_second';
153+
154+
let readBenchResult;
155+
let writeBenchResult;
156+
157+
console.group('composite scores');
158+
159+
const compositeResults: MetricInfo[] = [];
160+
for (const [compositeName, compositeTests] of Object.entries(composites)) {
161+
console.group(`${compositeName}: ${compositeTests.join(', ')}`);
162+
163+
let sum = 0;
164+
for (const testName of compositeTests) {
165+
const testScore = results.find(aMetricInfo(testName));
166+
assert.ok(testScore, `${compositeName} suite requires ${testName} for composite score`);
167+
168+
const metric = testScore.metrics.find(anMBsMetric);
169+
assert.ok(metric, `${testName} is missing a megabytes_per_second metric`);
170+
171+
sum += metric.value;
172+
}
173+
174+
const compositeAverage = sum / compositeTests.length;
175+
176+
if (compositeName === 'readBench') readBenchResult = compositeAverage;
177+
if (compositeName === 'writeBench') writeBenchResult = compositeAverage;
178+
179+
compositeResults.push(metrics(compositeName, compositeAverage));
180+
181+
console.log('avg:', compositeAverage, 'mb/s');
182+
183+
console.groupEnd();
184+
}
185+
186+
assert.ok(typeof readBenchResult === 'number');
187+
assert.ok(typeof writeBenchResult === 'number');
188+
189+
const driverBench = (readBenchResult + writeBenchResult) / 2;
190+
191+
console.group('driverBench: readBench, writeBench');
192+
console.log('avg:', driverBench, 'mb/s');
193+
console.groupEnd();
194+
195+
compositeResults.push(metrics('driverBench', driverBench));
196+
197+
console.groupEnd();
198+
return [...results, ...compositeResults];
199+
}
200+
201+
const finalResults = calculateCompositeBenchmarks(results);
202+
203+
await fs.writeFile('results.json', JSON.stringify(finalResults, undefined, 2), 'utf8');

test/benchmarks/driver_bench/src/runner.mts

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,6 @@ console.log(
101101

102102
await fs.writeFile(
103103
`results_${path.basename(benchmarkFile, '.mjs')}.json`,
104-
JSON.stringify(metrics(benchmarkName, megabytesPerSecond, count), undefined, 2) + '\n',
104+
JSON.stringify(metrics(benchmarkName, megabytesPerSecond), undefined, 2) + '\n',
105105
'utf8'
106106
);

0 commit comments

Comments
 (0)