benchmark,lib: add process.hrtime.bigint benchmark

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 <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
pull/26405/head
Anna Henningsen 2019-03-01 20:51:47 +01:00
parent 820ae61c12
commit 69906fbc52
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9
2 changed files with 28 additions and 17 deletions

View File

@ -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');
}

View File

@ -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);