Add more benchmarks
[benchmarks-js.git] / fibonacci.js
CommitLineData
a9c78d5d
JB
1const Benchmark = require('benchmark')
2const { LIST_FORMATTER } = require('./benchmark-utils')
3
4const suite = new Benchmark.Suite()
5
6const number = 30
7
8/**
9 * @param num
10 */
11function fibonacciLoop (num) {
12 let a = 1
13 let b = 0
14 let temp
15
16 while (num >= 0) {
17 temp = a
18 a = a + b
19 b = temp
20 num--
21 }
22
23 return b
24}
25
26/**
27 * @param num
28 */
29function fibonacciRecursion (num) {
30 if (num <= 1) return 1
31
32 return fibonacciRecursion(num - 1) + fibonacciRecursion(num - 2)
33}
34
35/**
36 * @param num
37 * @param memo
38 */
39function fibonacciRecursionMemoization (num, memo) {
40 memo = memo || {}
41
42 if (memo[num]) return memo[num]
43 if (num <= 1) return 1
44
45 return (memo[num] =
46 fibonacciRecursionMemoization(num - 1, memo) +
47 fibonacciRecursionMemoization(num - 2, memo))
48}
49
50suite
51 .add('fibonacciLoop', function () {
52 fibonacciLoop(number)
53 })
54 .add('fibonacciRecursion', function () {
55 fibonacciRecursion(number)
56 })
57 .add('fibonacciRecursionMemoization', function () {
58 fibonacciRecursionMemoization(number)
59 })
60 .on('cycle', function (event) {
61 console.log(event.target.toString())
62 })
63 .on('complete', function () {
64 console.log(
65 'Fastest is ' + LIST_FORMATTER.format(this.filter('fastest').map('name'))
66 )
67 // eslint-disable-next-line no-process-exit
68 process.exit()
69 })
70 .run()