mirror of
https://github.com/denoland/deno.git
synced 2024-12-28 01:59:06 -05:00
fix(std/testing/bench): clock assertions without --allow-hrtime (#6069)
This commit is contained in:
parent
4ef38bad43
commit
cab273476a
2 changed files with 21 additions and 10 deletions
|
@ -6,6 +6,7 @@ const { noColor } = Deno;
|
||||||
interface BenchmarkClock {
|
interface BenchmarkClock {
|
||||||
start: number;
|
start: number;
|
||||||
stop: number;
|
stop: number;
|
||||||
|
for?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Provides methods for starting and stopping a benchmark clock. */
|
/** Provides methods for starting and stopping a benchmark clock. */
|
||||||
|
@ -108,22 +109,22 @@ function verifyOr1Run(runs?: number): number {
|
||||||
return runs && runs >= 1 && runs !== Infinity ? Math.floor(runs) : 1;
|
return runs && runs >= 1 && runs !== Infinity ? Math.floor(runs) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
function assertTiming(clock: BenchmarkClock, benchmarkName: string): void {
|
function assertTiming(clock: BenchmarkClock): void {
|
||||||
// NaN indicates that a benchmark has not been timed properly
|
// NaN indicates that a benchmark has not been timed properly
|
||||||
if (!clock.stop) {
|
if (!clock.stop) {
|
||||||
throw new BenchmarkRunError(
|
throw new BenchmarkRunError(
|
||||||
`Running benchmarks FAILED during benchmark named [${benchmarkName}]. The benchmark timer's stop method must be called`,
|
`Running benchmarks FAILED during benchmark named [${clock.for}]. The benchmark timer's stop method must be called`,
|
||||||
benchmarkName
|
clock.for
|
||||||
);
|
);
|
||||||
} else if (!clock.start) {
|
} else if (!clock.start) {
|
||||||
throw new BenchmarkRunError(
|
throw new BenchmarkRunError(
|
||||||
`Running benchmarks FAILED during benchmark named [${benchmarkName}]. The benchmark timer's start method must be called`,
|
`Running benchmarks FAILED during benchmark named [${clock.for}]. The benchmark timer's start method must be called`,
|
||||||
benchmarkName
|
clock.for
|
||||||
);
|
);
|
||||||
} else if (clock.start > clock.stop) {
|
} else if (clock.start > clock.stop) {
|
||||||
throw new BenchmarkRunError(
|
throw new BenchmarkRunError(
|
||||||
`Running benchmarks FAILED during benchmark named [${benchmarkName}]. The benchmark timer's start method must be called before its stop method`,
|
`Running benchmarks FAILED during benchmark named [${clock.for}]. The benchmark timer's start method must be called before its stop method`,
|
||||||
benchmarkName
|
clock.for
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -134,6 +135,12 @@ function createBenchmarkTimer(clock: BenchmarkClock): BenchmarkTimer {
|
||||||
clock.start = performance.now();
|
clock.start = performance.now();
|
||||||
},
|
},
|
||||||
stop(): void {
|
stop(): void {
|
||||||
|
if (isNaN(clock.start)) {
|
||||||
|
throw new BenchmarkRunError(
|
||||||
|
`Running benchmarks FAILED during benchmark named [${clock.for}]. The benchmark timer's start method must be called before its stop method`,
|
||||||
|
clock.for
|
||||||
|
);
|
||||||
|
}
|
||||||
clock.stop = performance.now();
|
clock.stop = performance.now();
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -223,6 +230,9 @@ export async function runBenchmarks(
|
||||||
console.groupCollapsed(`benchmark ${name} ... `);
|
console.groupCollapsed(`benchmark ${name} ... `);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provide the benchmark name for clock assertions
|
||||||
|
clock.for = name;
|
||||||
|
|
||||||
// Remove benchmark from queued
|
// Remove benchmark from queued
|
||||||
const queueIndex = progress.queued.findIndex(
|
const queueIndex = progress.queued.findIndex(
|
||||||
(queued) => queued.name === name && queued.runsCount === runs
|
(queued) => queued.name === name && queued.runsCount === runs
|
||||||
|
@ -242,7 +252,7 @@ export async function runBenchmarks(
|
||||||
// b is a benchmark timer interfacing an unset (NaN) benchmark clock
|
// b is a benchmark timer interfacing an unset (NaN) benchmark clock
|
||||||
await func(b);
|
await func(b);
|
||||||
// Making sure the benchmark was started/stopped properly
|
// Making sure the benchmark was started/stopped properly
|
||||||
assertTiming(clock, name);
|
assertTiming(clock);
|
||||||
// Calculate length of run
|
// Calculate length of run
|
||||||
const measuredMs = clock.stop - clock.start;
|
const measuredMs = clock.stop - clock.start;
|
||||||
|
|
||||||
|
@ -263,7 +273,7 @@ export async function runBenchmarks(
|
||||||
// b is a benchmark timer interfacing an unset (NaN) benchmark clock
|
// b is a benchmark timer interfacing an unset (NaN) benchmark clock
|
||||||
await func(b);
|
await func(b);
|
||||||
// Making sure the benchmark was started/stopped properly
|
// Making sure the benchmark was started/stopped properly
|
||||||
assertTiming(clock, name);
|
assertTiming(clock);
|
||||||
|
|
||||||
// Calculate length of run
|
// Calculate length of run
|
||||||
const measuredMs = clock.stop - clock.start;
|
const measuredMs = clock.stop - clock.start;
|
||||||
|
@ -319,6 +329,7 @@ export async function runBenchmarks(
|
||||||
|
|
||||||
// Resetting the benchmark clock
|
// Resetting the benchmark clock
|
||||||
clock.start = clock.stop = NaN;
|
clock.start = clock.stop = NaN;
|
||||||
|
delete clock.for;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Indicate finished running
|
// Indicate finished running
|
||||||
|
|
|
@ -308,7 +308,7 @@ test({
|
||||||
);
|
);
|
||||||
assertEquals(resultOfMultiple.length, 1);
|
assertEquals(resultOfMultiple.length, 1);
|
||||||
assert(!!resultOfMultiple[0].measuredRunsMs);
|
assert(!!resultOfMultiple[0].measuredRunsMs);
|
||||||
assert(!!resultOfMultiple[0].measuredRunsAvgMs);
|
assert(!isNaN(resultOfMultiple[0].measuredRunsAvgMs!));
|
||||||
assertEquals(resultOfMultiple[0].measuredRunsMs!.length, 2);
|
assertEquals(resultOfMultiple[0].measuredRunsMs!.length, 2);
|
||||||
|
|
||||||
// The last progress should equal the final result from promise except the state property
|
// The last progress should equal the final result from promise except the state property
|
||||||
|
|
Loading…
Reference in a new issue