bdb5f58699c76459090bd8eccfe8261918a206d7
[benchmarks-js.git] / random.mjs
1 import { randomInt } from 'node:crypto'
2
3 import Benchmark from 'benny'
4
5 import {
6 secureRandom,
7 secureRandomWithRandomValues
8 } from './benchmark-utils.mjs'
9
10 const maximum = 281474976710654
11
12 /**
13 * @param max
14 * @param min
15 * @returns
16 */
17 function getSecureRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) {
18 if (max < min || max < 0 || min < 0) {
19 throw new RangeError('Invalid interval')
20 }
21 max = Math.floor(max)
22 if (min !== 0) {
23 min = Math.ceil(min)
24 return Math.floor(secureRandom() * (max - min + 1)) + min
25 }
26 return Math.floor(secureRandom() * (max + 1))
27 }
28
29 /**
30 * @param max
31 * @param min
32 * @returns
33 */
34 function getSecureRandomIntegerWithRandomValues (
35 max = Number.MAX_SAFE_INTEGER,
36 min = 0
37 ) {
38 if (max < min || max < 0 || min < 0) {
39 throw new RangeError('Invalid interval')
40 }
41 max = Math.floor(max)
42 if (min !== 0) {
43 min = Math.ceil(min)
44 return Math.floor(secureRandomWithRandomValues() * (max - min + 1)) + min
45 }
46 return Math.floor(secureRandomWithRandomValues() * (max + 1))
47 }
48
49 /**
50 * @param max
51 * @param min
52 * @returns
53 */
54 function getRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) {
55 if (max < min || max < 0 || min < 0) {
56 throw new RangeError('Invalid interval')
57 }
58 max = Math.floor(max)
59 if (min !== 0) {
60 min = Math.ceil(min)
61 return Math.floor(Math.random() * (max - min + 1)) + min
62 }
63 return Math.floor(Math.random() * (max + 1))
64 }
65
66 Benchmark.suite(
67 'Random Integer Generator',
68 Benchmark.add('Secure random integer generator', () => {
69 getSecureRandomInteger(maximum)
70 }),
71 Benchmark.add(
72 'Secure random with getRandomValues() integer generator',
73 () => {
74 getSecureRandomIntegerWithRandomValues(maximum)
75 }
76 ),
77 Benchmark.add('Crypto random integer generator', (max = maximum, min = 0) => {
78 max = Math.floor(max)
79 if (min !== 0) {
80 min = Math.ceil(min)
81 return Math.floor(randomInt(min, max + 1))
82 }
83 return Math.floor(randomInt(max + 1))
84 }),
85 Benchmark.add('Math random integer generator', () => {
86 getRandomInteger(maximum)
87 }),
88 Benchmark.cycle(),
89 Benchmark.complete(),
90 Benchmark.save({
91 file: 'random-integer-generator',
92 format: 'json',
93 details: true
94 }),
95 Benchmark.save({
96 file: 'random-integer-generator',
97 format: 'chart.html',
98 details: true
99 }),
100 Benchmark.save({
101 file: 'random-integer-generator',
102 format: 'table.html',
103 details: true
104 })
105 ).catch(console.error)