diff options
author | Antoine du Hamel <duhamelantoine1995@gmail.com> | 2021-04-23 18:14:45 +0300 |
---|---|---|
committer | James M Snell <jasnell@gmail.com> | 2021-04-26 21:44:23 +0300 |
commit | 4e9ad206e22ba5afc1b428a23388f83caa013685 (patch) | |
tree | d19ed495a412d564760811d62d16d4df00d3c190 /benchmark | |
parent | 0577fe3f2690bff0f7cf1a60613cdc3d50b59e4a (diff) |
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>
Diffstat (limited to 'benchmark')
-rw-r--r-- | benchmark/common.js | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/benchmark/common.js b/benchmark/common.js index bdccd6605f3..f48eda61157 100644 --- a/benchmark/common.js +++ b/benchmark/common.js @@ -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 = ''; |