Skip to content

Commit

Permalink
benchmark,lib: add process.hrtime.bigint benchmark
Browse files Browse the repository at this point in the history
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: nodejs#26381
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
  • Loading branch information
addaleax authored and BridgeAR committed Mar 12, 2019
1 parent 170e196 commit f79cf70
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 17 deletions.
41 changes: 26 additions & 15 deletions benchmark/process/bench-hrtime.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
}
4 changes: 2 additions & 2 deletions lib/internal/process/per_thread.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit f79cf70

Please sign in to comment.