From f79cf7067f8d5bd6aaa419de3c7738252990e4a0 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Fri, 1 Mar 2019 20:51:47 +0100 Subject: [PATCH] benchmark,lib: add process.hrtime.bigint benchmark MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a benchmark, and amend the relevant source code comment to state that currently, switching to directly returning a BigInt is not stopped by technical obstacles but rather the fact that using a typed array is actually a bit faster (about 2.5 %, measured locally). PR-URL: https://github.com/nodejs/node/pull/26381 Reviewed-By: James M Snell Reviewed-By: Luigi Pinca Reviewed-By: Colin Ihrig Reviewed-By: Ruben Bridgewater --- benchmark/process/bench-hrtime.js | 41 +++++++++++++++++++----------- lib/internal/process/per_thread.js | 4 +-- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/benchmark/process/bench-hrtime.js b/benchmark/process/bench-hrtime.js index 9152a32b22d213..e704087b692e68 100644 --- a/benchmark/process/bench-hrtime.js +++ b/benchmark/process/bench-hrtime.js @@ -5,27 +5,38 @@ const assert = require('assert'); const bench = common.createBenchmark(main, { n: [1e6], - type: ['raw', 'diff'] + type: ['raw', 'diff', 'bigint'] }); function main({ n, type }) { const hrtime = process.hrtime; - var noDead = hrtime(); + var noDead = type === 'bigint' ? hrtime.bigint() : hrtime(); var i; - if (type === 'raw') { - bench.start(); - for (i = 0; i < n; i++) { - noDead = hrtime(); - } - bench.end(n); - } else { - bench.start(); - for (i = 0; i < n; i++) { - noDead = hrtime(noDead); - } - bench.end(n); + switch (type) { + case 'raw': + bench.start(); + for (i = 0; i < n; i++) { + noDead = hrtime(); + } + bench.end(n); + break; + case 'diff': + bench.start(); + for (i = 0; i < n; i++) { + noDead = hrtime(noDead); + } + bench.end(n); + break; + case 'bigint': + bench.start(); + for (i = 0; i < n; i++) { + noDead = hrtime.bigint(); + } + bench.end(n); + break; } - assert.ok(Array.isArray(noDead)); + // eslint-disable-next-line valid-typeof + assert.ok(Array.isArray(noDead) || typeof noDead === 'bigint'); } diff --git a/lib/internal/process/per_thread.js b/lib/internal/process/per_thread.js index fa0334b8bfb2b0..85772aafd8cee9 100644 --- a/lib/internal/process/per_thread.js +++ b/lib/internal/process/per_thread.js @@ -122,8 +122,8 @@ function wrapProcessMethods(binding) { ]; } - // Use a BigUint64Array in the closure because V8 does not have an API for - // creating a BigInt out of a uint64_t yet. + // Use a BigUint64Array in the closure because this is actually a bit + // faster than simply returning a BigInt from C++ in V8 7.1. const hrBigintValues = new BigUint64Array(1); function hrtimeBigInt() { _hrtimeBigInt(hrBigintValues);