perf: use node: prefix to bypass caching call for builtins
[benchmarks-js.git] / benchmark-utils.mjs
1 import crypto, { webcrypto } from 'node:crypto'
2
3 /**
4 * Generate a cryptographically secure random number in the [0,1[ range
5 * @returns
6 */
7 export function secureRandom () {
8 return crypto.randomBytes(4).readUInt32LE() / 0x100000000
9 }
10
11 /**
12 * Generate a cryptographically secure random number in the [0,1[ range
13 * @returns
14 */
15 export function secureRandomWithRandomValues () {
16 return webcrypto.getRandomValues(new Uint32Array(1))[0] / 0x100000000
17 }
18
19 /**
20 * @param max
21 * @param min
22 * @returns
23 */
24 export function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) {
25 if (max < min || max < 0 || min < 0) {
26 throw new RangeError('Invalid interval')
27 }
28 max = Math.floor(max)
29 if (min != null && min !== 0) {
30 min = Math.ceil(min)
31 return Math.floor(secureRandom() * (max - min + 1)) + min
32 }
33 return Math.floor(secureRandom() * (max + 1))
34 }
35
36 /**
37 *
38 * @param max
39 * @param min
40 * @returns
41 */
42 export function generateRandomFloat (max = Number.MAX_VALUE, min = 0) {
43 if (max < min) {
44 throw new RangeError('Invalid interval')
45 }
46 if (max - min === Infinity) {
47 throw new RangeError('Invalid interval')
48 }
49 return (crypto.randomBytes(4).readUInt32LE() / 0xffffffff) * (max - min) + min
50 }
51
52 /**
53 *
54 * @param size
55 * @param max
56 * @param numberGenerator
57 * @returns
58 */
59 export function generateRandomNumberArray (
60 size,
61 max = Number.MAX_VALUE,
62 numberGenerator = generateRandomFloat
63 ) {
64 const array = []
65 for (let i = 0; i < size; i++) {
66 array.push(numberGenerator(max))
67 }
68 return array
69 }
70
71 /**
72 *
73 * @param sizeMax
74 * @param numberMax
75 * @param numberGenerator
76 * @returns
77 */
78 export function 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 }
88 return object
89 }
90
91 /**
92 * @param ms
93 * @returns
94 */
95 export async function sleep (ms) {
96 return new Promise(resolve => setTimeout(resolve, ms))
97 }