Add more benchmarks
authorJérôme Benoit <jerome.benoit@sap.com>
Sun, 6 Jun 2021 20:03:18 +0000 (22:03 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sun, 6 Jun 2021 20:03:18 +0000 (22:03 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
benchmark-utils.js
busy-wait.js
fibonacci.js [new file with mode: 0644]
package.json

index c1b68c581615b842ec7804111f71aafbf7f8c279..4de6ea7728d45765c65573991495c9fb3979f374 100644 (file)
@@ -9,9 +9,16 @@ function generateRandomInteger (max, min = 0) {
   return Math.floor(Math.random() * max + 1)
 }
 
+/**
+ * @param ms
+ */
+async function sleep (ms) {
+  return new Promise(resolve => setTimeout(resolve, ms))
+}
+
 const LIST_FORMATTER = new Intl.ListFormat('en-US', {
   style: 'long',
   type: 'conjunction'
 })
 
-module.exports = { generateRandomInteger, LIST_FORMATTER }
+module.exports = { generateRandomInteger, sleep, LIST_FORMATTER }
index ed06c52a682ab408449f273e1fe03333917ac0bc..9ff5a000f72463fcb600c45644e8f95deb4e05dd 100644 (file)
@@ -1,5 +1,5 @@
 const Benchmark = require('benchmark')
-const { LIST_FORMATTER } = require('./benchmark-utils')
+const { LIST_FORMATTER, sleep } = require('./benchmark-utils')
 
 const suite = new Benchmark.Suite()
 
@@ -9,8 +9,21 @@ const timeout = 2000
  * @param timeoutMs
  */
 function dummyTimeoutBusyWait (timeoutMs) {
-  const timeoutDateMs = Date.now() + timeoutMs
-  do {} while (Date.now() < timeoutDateMs)
+  const timeoutTimestampMs = Date.now() + timeoutMs
+  do {} while (Date.now() < timeoutTimestampMs)
+}
+
+/**
+ * @param timeoutMs
+ * @param delayMs
+ */
+async function divideAndConquerTimeoutBusyWait (timeoutMs, delayMs = 200) {
+  const tries = Math.round(timeoutMs / delayMs)
+  let count = 0
+  do {
+    count++
+    await sleep(delayMs)
+  } while (count <= tries)
 }
 
 /**
@@ -32,6 +45,9 @@ suite
   .add('dummyTimeoutBusyWait', function () {
     dummyTimeoutBusyWait(timeout)
   })
+  .add('divideAndConquerTimeoutBusyWait', async function () {
+    await divideAndConquerTimeoutBusyWait(timeout)
+  })
   .add('setIntervalTimeoutBusyWait', function () {
     setIntervalTimeoutBusyWait(timeout)
   })
diff --git a/fibonacci.js b/fibonacci.js
new file mode 100644 (file)
index 0000000..b5a7fbb
--- /dev/null
@@ -0,0 +1,70 @@
+const Benchmark = require('benchmark')
+const { LIST_FORMATTER } = require('./benchmark-utils')
+
+const suite = new Benchmark.Suite()
+
+const number = 30
+
+/**
+ * @param num
+ */
+function fibonacciLoop (num) {
+  let a = 1
+  let b = 0
+  let temp
+
+  while (num >= 0) {
+    temp = a
+    a = a + b
+    b = temp
+    num--
+  }
+
+  return b
+}
+
+/**
+ * @param num
+ */
+function fibonacciRecursion (num) {
+  if (num <= 1) return 1
+
+  return fibonacciRecursion(num - 1) + fibonacciRecursion(num - 2)
+}
+
+/**
+ * @param num
+ * @param memo
+ */
+function fibonacciRecursionMemoization (num, memo) {
+  memo = memo || {}
+
+  if (memo[num]) return memo[num]
+  if (num <= 1) return 1
+
+  return (memo[num] =
+    fibonacciRecursionMemoization(num - 1, memo) +
+    fibonacciRecursionMemoization(num - 2, memo))
+}
+
+suite
+  .add('fibonacciLoop', function () {
+    fibonacciLoop(number)
+  })
+  .add('fibonacciRecursion', function () {
+    fibonacciRecursion(number)
+  })
+  .add('fibonacciRecursionMemoization', function () {
+    fibonacciRecursionMemoization(number)
+  })
+  .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()
index eaec39c73d5bf86c1b53a2814a94087b3f7f586a..c85ef5d0593226f13dc9136bf494b621e1497105 100644 (file)
@@ -10,6 +10,7 @@
     "benchmark:busy-wait": "node busy-wait.js",
     "benchmark:quick-select": "node quick-select.js",
     "benchmark:promise-handling": "node promise-handling.js",
+    "benchmark:fibonacci": "node fibonacci.js",
     "format": "prettier --loglevel silent --write .; prettierx --write .",
     "lint": "eslint .",
     "lint:fix": "eslint . --fix",