X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=random.js;h=c3e5c4a8383c3821c223c40921a95ea63da8bb3e;hb=11a1b8c8c39d208e904e01807103d62facbd86d4;hp=98b59ed34f5241db671aad996fecc51b58ecdb05;hpb=d6c407132906074921b9274f3473b148c947dffc;p=benchmarks-js.git diff --git a/random.js b/random.js index 98b59ed..c3e5c4a 100644 --- a/random.js +++ b/random.js @@ -1,17 +1,23 @@ -const Benchmark = require('benchmark') -const { LIST_FORMATTER, secureRandom } = require('./benchmark-utils') +const crypto = require('crypto') +const Benchmark = require('benny') +const { + secureRandom, + secureRandomWithRandomValues +} = require('./benchmark-utils') -const suite = new Benchmark.Suite() - -const maximum = 1000 +const maximum = 281474976710654 /** * @param max * @param min + * @returns */ -function getSecureRandomInteger (max, min = 0) { +function getSecureRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { + if (max < min || max < 0 || min < 0) { + throw new RangeError('Invalid interval') + } max = Math.floor(max) - if (min) { + if (min != null && min !== 0) { min = Math.ceil(min) return Math.floor(secureRandom() * (max - min + 1)) + min } @@ -21,31 +27,77 @@ function getSecureRandomInteger (max, min = 0) { /** * @param max * @param min + * @returns + */ +function getSecureRandomIntegerWithRandomValues ( + max = Number.MAX_SAFE_INTEGER, + min = 0 +) { + if (max < min || max < 0 || min < 0) { + throw new RangeError('Invalid interval') + } + max = Math.floor(max) + if (min != null && min !== 0) { + min = Math.ceil(min) + return Math.floor(secureRandomWithRandomValues() * (max - min + 1)) + min + } + return Math.floor(secureRandomWithRandomValues() * (max + 1)) +} + +/** + * @param max + * @param min + * @returns */ -function getRandomInteger (max, min = 0) { +function getRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { + if (max < min || max < 0 || min < 0) { + throw new RangeError('Invalid interval') + } max = Math.floor(max) - if (min) { + if (min != null && min !== 0) { min = Math.ceil(min) return Math.floor(Math.random() * (max - min + 1)) + min } return Math.floor(Math.random() * (max + 1)) } -suite - .add('Secure random integer generator', function () { +Benchmark.suite( + 'Random Integer Generator', + Benchmark.add('Secure random integer generator', () => { getSecureRandomInteger(maximum) - }) - .add('Random integer generator', function () { + }), + Benchmark.add( + 'Secure random with getRandomValues() integer generator', + () => { + getSecureRandomIntegerWithRandomValues(maximum) + } + ), + Benchmark.add('Crypto random integer generator', (max = maximum, min = 0) => { + max = Math.floor(max) + if (min != null && min !== 0) { + min = Math.ceil(min) + return Math.floor(crypto.randomInt(min, max + 1)) + } + return Math.floor(crypto.randomInt(max + 1)) + }), + Benchmark.add('Math random integer generator', () => { getRandomInteger(maximum) + }), + Benchmark.cycle(), + Benchmark.complete(), + Benchmark.save({ + file: 'random-integer-generator', + format: 'json', + details: true + }), + Benchmark.save({ + file: 'random-integer-generator', + format: 'chart.html', + details: true + }), + Benchmark.save({ + file: 'random-integer-generator', + format: 'table.html', + details: true }) - .on('cycle', function (event) { - console.log(event.target.toString()) - }) - .on('complete', function () { - console.log( - 'Fastest is ' + LIST_FORMATTER.format(this.filter('fastest').map('name')) - ) - // eslint-disable-next-line no-process-exit - process.exit() - }) - .run() +)