Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine du Hamel <duhamelantoine1995@gmail.com>2021-04-23 18:14:45 +0300
committerJames M Snell <jasnell@gmail.com>2021-04-26 21:44:23 +0300
commit4e9ad206e22ba5afc1b428a23388f83caa013685 (patch)
treed19ed495a412d564760811d62d16d4df00d3c190 /benchmark
parent0577fe3f2690bff0f7cf1a60613cdc3d50b59e4a (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.js30
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 = '';