switch to ESM
[benchmarks-js.git] / fibonacci.mjs
diff --git a/fibonacci.mjs b/fibonacci.mjs
new file mode 100644 (file)
index 0000000..00130ce
--- /dev/null
@@ -0,0 +1,81 @@
+import Benchmark from 'benny'
+
+const number = 30
+
+/**
+ * @param num
+ * @returns
+ */
+function fibonacciLoop (num) {
+  const fib = []
+  fib[0] = 0
+  fib[1] = 1
+  for (let i = 2; i <= num; i++) {
+    fib[i] = fib[i - 2] + fib[i - 1]
+  }
+  return fib[num]
+}
+
+/**
+ *
+ * @param num
+ * @returns
+ */
+function fibonacciLoopWhile (num) {
+  let current = 1
+  let previous = 0
+  while (--num) {
+    const temp = current
+    current += previous
+    previous = temp
+  }
+  return current
+}
+
+/**
+ * @param num
+ * @returns
+ */
+function fibonacciRecursion (num) {
+  if (num <= 1) return num
+  return fibonacciRecursion(num - 1) + fibonacciRecursion(num - 2)
+}
+
+/**
+ * @param num
+ * @param memo
+ * @returns
+ */
+function fibonacciRecursionMemoization (num, memo) {
+  memo = memo || {}
+
+  if (memo[num]) return memo[num]
+  if (num <= 1) return num
+
+  return (memo[num] =
+    fibonacciRecursionMemoization(num - 1, memo) +
+    fibonacciRecursionMemoization(num - 2, memo))
+}
+
+Benchmark.suite(
+  `Fibonacci number ${number}`,
+  Benchmark.add('fibonacciLoop', () => {
+    fibonacciLoop(number)
+  }),
+  Benchmark.add('fibonacciLoopWhile', () => {
+    fibonacciLoopWhile(number)
+  }),
+  Benchmark.add('fibonacciRecursion', () => {
+    fibonacciRecursion(number)
+  }),
+  Benchmark.add('fibonacciRecursionMemoization', () => {
+    fibonacciRecursionMemoization(number)
+  }),
+  Benchmark.cycle(),
+  Benchmark.complete(),
+  Benchmark.save({ file: 'fibonacci', format: 'json', details: true }),
+  Benchmark.save({ file: 'fibonacci', format: 'chart.html', details: true }),
+  Benchmark.save({ file: 'fibonacci', format: 'table.html', details: true })
+).catch(err => {
+  console.error(err)
+})