benchmark: use process.hrtime.bigint()

PR-URL: https://github.com/nodejs/node/pull/38369
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Antoine du Hamel 2021-04-23 17:14:45 +02:00 committed by James M Snell
parent 0577fe3f26
commit 4e9ad206e2
No known key found for this signature in database
GPG key ID: 7341B15C070877AC

View file

@ -12,7 +12,7 @@ class Benchmark {
this._ended = false;
// Holds process.hrtime value
this._time = [0, 0];
this._time = 0n;
// Use the file name as the name of the benchmark
this.name = require.main.filename.slice(__dirname.length + 1);
@ -218,12 +218,12 @@ class Benchmark {
throw new Error('Called start more than once in a single benchmark');
}
this._started = true;
this._time = process.hrtime();
this._time = process.hrtime.bigint();
}
end(operations) {
// Get elapsed time now and do error checking later for accuracy.
const elapsed = process.hrtime(this._time);
const time = process.hrtime.bigint();
if (!this._started) {
throw new Error('called end without start');
@ -237,16 +237,19 @@ class Benchmark {
if (!process.env.NODEJS_BENCHMARK_ZERO_ALLOWED && operations <= 0) {
throw new Error('called end() with operation count <= 0');
}
if (elapsed[0] === 0 && elapsed[1] === 0) {
this._ended = true;
if (time === this._time) {
if (!process.env.NODEJS_BENCHMARK_ZERO_ALLOWED)
throw new Error('insufficient clock precision for short benchmark');
// Avoid dividing by zero
elapsed[1] = 1;
this.report(operations && Number.MAX_VALUE, 0n);
return;
}
this._ended = true;
const time = elapsed[0] + elapsed[1] / 1e9;
const rate = operations / time;
const elapsed = time - this._time;
const rate = operations / (Number(elapsed) / 1e9);
this.report(rate, elapsed);
}
@ -255,12 +258,21 @@ class Benchmark {
name: this.name,
conf: this.config,
rate,
time: elapsed[0] + elapsed[1] / 1e9,
time: nanoSecondsToString(elapsed),
type: 'report',
});
}
}
function nanoSecondsToString(bigint) {
const str = bigint.toString();
const decimalPointIndex = str.length - 9;
if (decimalPointIndex < 0) {
return `0.${'0'.repeat(-decimalPointIndex)}${str}`;
}
return `${str.slice(0, decimalPointIndex)}.${str.slice(decimalPointIndex)}`;
}
function formatResult(data) {
// Construct configuration string, " A=a, B=b, ..."
let conf = '';