Add benchmark for random integer generation code
authorJérôme Benoit <jerome.benoit@sap.com>
Tue, 21 Sep 2021 12:20:39 +0000 (14:20 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Tue, 21 Sep 2021 12:20:39 +0000 (14:20 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
package.json
random.js [new file with mode: 0644]

index 63ad06c463bdce5d02d47b759c5d5ed634a19e53..6983e5772f52b5017f5ab584322a6ed534d9a330 100644 (file)
@@ -11,6 +11,7 @@
     "benchmark:quick-select": "node quick-select.js",
     "benchmark:promise-handling": "node promise-handling.js",
     "benchmark:fibonacci": "node fibonacci.js",
+    "benchmark:random": "node random.js",
     "format": "prettier --loglevel silent --write .; prettierx --write .",
     "lint": "eslint .",
     "lint:fix": "eslint . --fix",
diff --git a/random.js b/random.js
new file mode 100644 (file)
index 0000000..4b41596
--- /dev/null
+++ b/random.js
@@ -0,0 +1,59 @@
+const Benchmark = require('benchmark')
+const crypto = require('crypto')
+const { LIST_FORMATTER } = require('./benchmark-utils')
+
+const suite = new Benchmark.Suite()
+
+const maximum = 1000
+
+/**
+ *
+ */
+function secureRandom () {
+  return crypto.randomBytes(4).readUInt32LE() / 0x100000000
+}
+
+/**
+ * @param max
+ * @param min
+ */
+function getSecureRandomInteger (max, min = 0) {
+  max = Math.floor(max)
+  if (min) {
+    min = Math.ceil(min)
+    return Math.floor(secureRandom() * (max - min + 1)) + min
+  }
+  return Math.floor(secureRandom() * (max + 1))
+}
+
+/**
+ * @param max
+ * @param min
+ */
+function getRandomInteger (max, min = 0) {
+  max = Math.floor(max)
+  if (min) {
+    min = Math.ceil(min)
+    return Math.floor(Math.random() * (max - min + 1)) + min
+  }
+  return Math.floor(Math.random() * (max + 1))
+}
+
+suite
+  .add('Secure random integer generator', function () {
+    getSecureRandomInteger(maximum)
+  })
+  .add('Random integer generator', function () {
+    getRandomInteger(maximum)
+  })
+  .on('cycle', function (event) {
+    console.log(event.target.toString())
+  })
+  .on('complete', function () {
+    console.log(
+      'Fastest is ' + LIST_FORMATTER.format(this.filter('fastest').map('name'))
+    )
+    // eslint-disable-next-line no-process-exit
+    process.exit()
+  })
+  .run()