X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=benchmark-utils.js;h=c12324396345ccee7e4da71d6898798c5c555077;hb=776e64d4c5ca6b2a83a319d4be905430a7d5d22e;hp=164cfc6596184017b0735cd98833a16d376f039c;hpb=f10b1da0dc4d21b8b8b8ba91283809028dd710e9;p=benchmarks-js.git diff --git a/benchmark-utils.js b/benchmark-utils.js index 164cfc6..c123243 100644 --- a/benchmark-utils.js +++ b/benchmark-utils.js @@ -9,37 +9,85 @@ function secureRandom () { return crypto.randomBytes(4).readUInt32LE() / 0x100000000 } +/** + * Generate a cryptographically secure random number in the [0,1[ range + * + * @returns + */ +function secureRandomWithRandomValues () { + return crypto.getRandomValues(new Uint32Array(1))[0] / 0x100000000 +} + /** * @param max * @param min * @returns */ function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { - if (max < 0) { + if (max < min || max < 0 || min < 0) { throw new RangeError('Invalid interval') } max = Math.floor(max) - if (min) { - if (max < min || min < 0) { - throw new RangeError('Invalid interval') - } + if (min != null && min !== 0) { min = Math.ceil(min) return Math.floor(secureRandom() * (max - min + 1)) + min } return Math.floor(secureRandom() * (max + 1)) } +/** + * + * @param max + * @param min + * @returns + */ +function generateRandomFloat (max = Number.MAX_VALUE, min = 0) { + if (max < min) { + throw new RangeError('Invalid interval') + } + if (max - min === Infinity) { + throw new RangeError('Invalid interval') + } + return (crypto.randomBytes(4).readUInt32LE() / 0xffffffff) * (max - min) + min +} + /** * * @param size * @param max + * @param numberGenerator + * @returns + */ +function generateRandomNumberArray ( + size, + max = Number.MAX_VALUE, + numberGenerator = generateRandomFloat +) { + const array = [] + for (let i = 0; i < size; i++) { + array.push(numberGenerator(max)) + } + return array +} + +/** + * + * @param sizeMax + * @param numberMax + * @param numberGenerator + * @returns */ -function generateRandomIntegerArray (size, max = Number.MAX_SAFE_INTEGER) { - const integerArray = [] +function generateRandomObject ( + sizeMax = 500, + numberMax = Number.MAX_VALUE, + numberGenerator = generateRandomFloat +) { + const size = generateRandomInteger(sizeMax) + const object = {} for (let i = 0; i < size; i++) { - integerArray.push(generateRandomInteger(max)) + object[i.toString()] = numberGenerator(numberMax) } - return integerArray + return object } /** @@ -50,15 +98,12 @@ async function sleep (ms) { return new Promise(resolve => setTimeout(resolve, ms)) } -const LIST_FORMATTER = new Intl.ListFormat('en-US', { - style: 'long', - type: 'conjunction' -}) - module.exports = { generateRandomInteger, - generateRandomIntegerArray, + generateRandomFloat, + generateRandomNumberArray, + generateRandomObject, sleep, secureRandom, - LIST_FORMATTER + secureRandomWithRandomValues }