Skip to content

Commit

Permalink
benchmark: use process.hrtime.bigint()
Browse files Browse the repository at this point in the history
PR-URL: nodejs#38369
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Benjamin Gruenbaum <[email protected]>
Reviewed-By: James M Snell <[email protected]>
  • Loading branch information
aduh95 authored and jasnell committed Apr 26, 2021
1 parent 0577fe3 commit 4e9ad20
Showing 1 changed file with 21 additions and 9 deletions.
30 changes: 21 additions & 9 deletions benchmark/common.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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');
Expand All @@ -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);
}

Expand All @@ -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 = '';
Expand Down

0 comments on commit 4e9ad20

Please sign in to comment.