From 9e4c1f2f2cb7e5337b2a081364e718d5ca17ab19 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Fri, 23 Apr 2021 17:14:45 +0200 Subject: [PATCH] benchmark: use `process.hrtime.bigint()` PR-URL: https://github.com/nodejs/node/pull/38369 Reviewed-By: Anna Henningsen Reviewed-By: Benjamin Gruenbaum Reviewed-By: James M Snell --- benchmark/common.js | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/benchmark/common.js b/benchmark/common.js index bdccd6605f365e..f48eda61157018 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 = '';