Skip to content

Commit 43e414e

Browse files
committed
feat: make minSamples option available per Suite creation (#126)
1 parent 85e589f commit 43e414e

File tree

5 files changed

+34
-1
lines changed

5 files changed

+34
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ A `Suite` manages and executes benchmark functions. It provides two methods: `ad
110110
* `'time'` - Measures actual execution time for a single run.
111111
* `useWorkers` {boolean} Whether to run benchmarks in worker threads. **Default:** `false`.
112112
* `plugins` {Array} Array of plugin instances to use.
113+
* `minSamples` {number} Minimum number of samples per round for all benchmarks in the suite. Can be overridden per benchmark. **Default:** `10` samples.
113114

114115
If no `reporter` is provided, results are printed to the console.
115116

index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export declare namespace BenchNode {
2828
benchmarkMode?: "ops" | "time";
2929
useWorkers?: boolean;
3030
plugins?: Plugin[];
31+
minSamples?: number; // Minimum number of samples per round for all benchmarks
3132
}
3233

3334
interface BenchmarkOptions {

lib/index.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ class Suite {
109109
#useWorkers;
110110
#benchmarkMode;
111111
#reporterOptions;
112+
#minSamples;
112113

113114
constructor(options = {}) {
114115
this.#benchmarks = [];
@@ -140,17 +141,29 @@ class Suite {
140141
this.#reporterOptions = options.reporterOptions || {
141142
printHeader: true,
142143
};
144+
145+
// Suite-level minSamples option
146+
if (options.minSamples !== undefined) {
147+
validateNumber(options.minSamples, "options.minSamples", 1);
148+
this.#minSamples = options.minSamples;
149+
} else {
150+
this.#minSamples = defaultBenchOptions.minSamples;
151+
}
143152
}
144153

145154
add(name, options, fn) {
146155
validateString(name, "name");
147156
if (typeof options === "function") {
148157
fn = options;
149-
options = defaultBenchOptions;
158+
options = {
159+
...defaultBenchOptions,
160+
minSamples: this.#minSamples,
161+
};
150162
} else {
151163
validateObject(options, "options");
152164
options = {
153165
...defaultBenchOptions,
166+
minSamples: this.#minSamples,
154167
...options,
155168
};
156169
// Enforce strict minimum (> 1e-6s). Using EPSILON to make boundary exclusive.

test/basic.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,21 @@ describe("API Interface", () => {
4444
}
4545
});
4646

47+
it("suite-level minSamples should be a valid number", () => {
48+
for (const r of ["ds", {}, () => {}]) {
49+
assert.throws(
50+
() => {
51+
new Suite({ minSamples: r });
52+
},
53+
{
54+
code: "ERR_INVALID_ARG_TYPE",
55+
},
56+
);
57+
}
58+
// doesNotThrow
59+
new Suite({ minSamples: 20 });
60+
});
61+
4762
describe("suite.add", () => {
4863
const bench = new Suite({ reporter: noop });
4964
it("name should be an string", () => {

types/types.test-d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ expectType<BenchNode.Suite>(
2727
);
2828
expectType<BenchNode.Suite>(new Suite({ reporter: false }));
2929
expectType<BenchNode.Suite>(new Suite({ reporter: null }));
30+
expectType<BenchNode.Suite>(new Suite({ minSamples: 20 }));
3031

3132
expectAssignable<BenchNode.SuiteOptions>({});
3233
expectAssignable<BenchNode.SuiteOptions>({ reporter: chartReport });
@@ -35,8 +36,10 @@ expectAssignable<BenchNode.SuiteOptions>({ useWorkers: false });
3536
expectAssignable<BenchNode.SuiteOptions>({
3637
plugins: [new V8GetOptimizationStatus()],
3738
});
39+
expectAssignable<BenchNode.SuiteOptions>({ minSamples: 20 });
3840
expectNotAssignable<BenchNode.SuiteOptions>({ unknownOption: "test" });
3941
expectNotAssignable<BenchNode.SuiteOptions>({ reporter: "not-a-function" });
42+
expectNotAssignable<BenchNode.SuiteOptions>({ minSamples: "not-a-number" });
4043

4144
expectAssignable<BenchNode.BenchmarkOptions>({});
4245
expectAssignable<BenchNode.BenchmarkOptions>({ minTime: 0.1 });

0 commit comments

Comments
 (0)