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