Merge pull request #30 from jerome-benoit/dependabot/npm_and_yarn/prettier-2.8.4
[benchmarks-js.git] / benchmark-utils.js
CommitLineData
343cfe4f
JB
1const crypto = require('crypto')
2
3/**
4 * Generate a cryptographically secure random number in the [0,1[ range
5 *
6 * @returns
7 */
8function secureRandom () {
9 return crypto.randomBytes(4).readUInt32LE() / 0x100000000
10}
11
99d76a65
JB
12/**
13 * Generate a cryptographically secure random number in the [0,1[ range
14 *
483585cc 15 * @returns
99d76a65
JB
16 */
17function secureRandomWithRandomValues () {
18 return crypto.getRandomValues(new Uint32Array(1))[0] / 0x100000000
19}
20
e9bfc28e
JB
21/**
22 * @param max
23 * @param min
7fd91296 24 * @returns
e9bfc28e 25 */
f10b1da0 26function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) {
aa418e78 27 if (max < min || max < 0 || min < 0) {
343cfe4f
JB
28 throw new RangeError('Invalid interval')
29 }
30 max = Math.floor(max)
da504870 31 if (min != null && min !== 0) {
343cfe4f
JB
32 min = Math.ceil(min)
33 return Math.floor(secureRandom() * (max - min + 1)) + min
ed2968f2 34 }
343cfe4f 35 return Math.floor(secureRandom() * (max + 1))
ed2968f2
JB
36}
37
aa418e78
JB
38/**
39 *
40 * @param max
41 * @param min
42 * @param negative
43 * @returns
44 */
45function generateRandomFloat (max = Number.MAX_VALUE, min = 0, negative = true) {
46 if (max < min || max < 0 || min < 0) {
47 throw new RangeError('Invalid interval')
48 }
49 const randomPositiveFloat = crypto.randomBytes(4).readUInt32LE() / 0xffffffff
50 const sign = negative && randomPositiveFloat < 0.5 ? -1 : 1
51 return sign * (randomPositiveFloat * (max - min) + min)
52}
53
ed40d2b0
JB
54/**
55 *
56 * @param size
57 * @param max
feb629fe 58 * @param numberGenerator
67bc7194 59 * @returns
ed40d2b0 60 */
feb629fe
JB
61function generateRandomNumberArray (
62 size,
63 max = Number.MAX_VALUE,
64 numberGenerator = generateRandomFloat
65) {
66 const array = []
ed40d2b0 67 for (let i = 0; i < size; i++) {
feb629fe 68 array.push(numberGenerator(max))
ed40d2b0 69 }
feb629fe
JB
70 return array
71}
72
5b907dbf
JB
73/**
74 *
75 * @param sizeMax
76 * @param numberMax
77 * @param numberGenerator
78 * @returns
79 */
80function generateRandomObject (
81 sizeMax = 500,
82 numberMax = Number.MAX_VALUE,
83 numberGenerator = generateRandomFloat
84) {
85 const size = generateRandomInteger(sizeMax)
86 const object = {}
87 for (let i = 0; i < size; i++) {
88 object[i.toString()] = numberGenerator(numberMax)
89 }
8e1fbc06 90 return object
5b907dbf
JB
91}
92
a9c78d5d
JB
93/**
94 * @param ms
7fd91296 95 * @returns
a9c78d5d
JB
96 */
97async function sleep (ms) {
98 return new Promise(resolve => setTimeout(resolve, ms))
99}
100
ed40d2b0
JB
101module.exports = {
102 generateRandomInteger,
feb629fe
JB
103 generateRandomFloat,
104 generateRandomNumberArray,
5b907dbf 105 generateRandomObject,
ed40d2b0 106 sleep,
99d76a65
JB
107 secureRandom,
108 secureRandomWithRandomValues
ed40d2b0 109}