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