From 02275c59468d585ea4ac4039ec8d487950312d00 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Fri, 1 Mar 2019 20:51:47 +0100 Subject: [PATCH 1/2] 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). --- benchmark/process/bench-hrtime.js | 40 +++++++++++++++++++----------- lib/internal/process/per_thread.js | 4 +-- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/benchmark/process/bench-hrtime.js b/benchmark/process/bench-hrtime.js index 9152a32b22d213..d73ed7aae4336e 100644 --- a/benchmark/process/bench-hrtime.js +++ b/benchmark/process/bench-hrtime.js @@ -5,27 +5,37 @@ 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)); + 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); From c42ea13cf2b764543073b9e1d37e3703943b0b84 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Fri, 1 Mar 2019 21:56:48 +0100 Subject: [PATCH 2/2] fixup! benchmark,lib: add process.hrtime.bigint benchmark --- benchmark/process/bench-hrtime.js | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmark/process/bench-hrtime.js b/benchmark/process/bench-hrtime.js index d73ed7aae4336e..e704087b692e68 100644 --- a/benchmark/process/bench-hrtime.js +++ b/benchmark/process/bench-hrtime.js @@ -37,5 +37,6 @@ function main({ n, type }) { break; } + // eslint-disable-next-line valid-typeof assert.ok(Array.isArray(noDead) || typeof noDead === 'bigint'); }