Benchmarks¶
It is time to put theory to the test and see how each of these Fibonacci implementations perform. We will build an optimized binary with the command:
And then run it with hyperfine. Let's keep the code code minimal and benchmarks crude for now.
package main
import "core:fmt"
fibonacci_recursive :: proc(n: int) -> n {
// ...
}
fibonacci_iterative :: proc(n: int) -> n {
// ...
}
fibonacci_matrix :: proc(n: int) -> n {
// ...
}
main :: proc() {
fmt.println(fibonacci_recursive(45))
// fmt.println(fibonacci_iterative(45))
// fmt.println(fibonacci_matrix(45))
}
We will first run the recursive version. Then comment out that line and uncomment the iterative version, measure and, so on...
\(45^{th}\) Fibonacci Number¶
- Recursive algorithm
❯ hyperfine ./fibonacci
Benchmark 1: ./fibonacci
Time (mean ± σ): 3.328 s ± 0.026 s [User: 3.315 s, System: 0.002 s]
Range (min … max): 3.295 s … 3.351 s 10 runs
- Iterative algorithm
❯ hyperfine ./fibonacci --shell=none
Benchmark 1: ./fibonacci
Time (mean ± σ): 879.8 µs ± 211.7 µs [User: 241.2 µs, System: 511.0 µs]
Range (min … max): 666.6 µs … 1764.0 µs 3518 runs
- Matrix implementation
❯ hyperfine --shell=none ./fibonacci
Benchmark 1: ./fibonacci
Time (mean ± σ): 902.2 µs ± 221.5 µs [User: 229.9 µs, System: 550.8 µs]
Range (min … max): 650.5 µs … 1630.1 µs 3252 runs
The recursive version is unbearably slow and took 3.3 seconds. The iterative and matrix implementations were 3500x faster.
Billionth Fibonacci Number¶
- Recursive algorithm
(Stack Overflow and timed out1)
- Iterative algorithm
❯ hyperfine --shell=none ./fibonacci
Benchmark 1: ./fibonacci
Time (mean ± σ): 252.5 ms ± 1.9 ms [User: 250.6 ms, System: 0.7 ms]
Range (min … max): 249.8 ms … 256.3 ms 11 runs
- Matrix implementation
❯ hyperfine --shell=none ./fibonacci
Benchmark 1: ./fibonacci
Time (mean ± σ): 863.3 µs ± 207.5 µs [User: 234.7 µs, System: 508.0 µs]
Range (min … max): 637.9 µs … 1546.5 µs 3426 runs
The iterative version of Fibonacci is slowing down but the matrix implementation is still fast because \(\log(n)\) grows insanely slowly.
Exercise¶
Use fibonacci_matrix to calculate F(100_000_000_000). Is there anything wrong with the output? If so what do you think went wrong and how will you fix it?
-
Even if we give enough computing resources, the universe will probably end before the code finishes. ↩