|  | 
|  | 1 | +//! Copied from divan's exmaples | 
|  | 2 | +use divan::black_box; | 
|  | 3 | +use std::collections::{BTreeMap, HashMap}; | 
|  | 4 | + | 
|  | 5 | +fn main() { | 
|  | 6 | +    divan::main(); | 
|  | 7 | +} | 
|  | 8 | + | 
|  | 9 | +#[divan::bench] | 
|  | 10 | +fn add() -> i32 { | 
|  | 11 | +    black_box(2) + black_box(1) | 
|  | 12 | +} | 
|  | 13 | + | 
|  | 14 | +#[divan::bench] | 
|  | 15 | +#[ignore] | 
|  | 16 | +fn sub() -> i32 { | 
|  | 17 | +    black_box(2) - black_box(1) | 
|  | 18 | +} | 
|  | 19 | + | 
|  | 20 | +#[divan::bench] | 
|  | 21 | +fn mul() -> i32 { | 
|  | 22 | +    black_box(2) * black_box(1) | 
|  | 23 | +} | 
|  | 24 | + | 
|  | 25 | +#[divan::bench] | 
|  | 26 | +fn div() -> i32 { | 
|  | 27 | +    black_box(2) / black_box(1) | 
|  | 28 | +} | 
|  | 29 | + | 
|  | 30 | +#[divan::bench] | 
|  | 31 | +fn rem() -> i32 { | 
|  | 32 | +    black_box(2) % black_box(1) | 
|  | 33 | +} | 
|  | 34 | + | 
|  | 35 | +// 1, 1, 2, 3, 5, ... | 
|  | 36 | +mod fibonacci { | 
|  | 37 | +    use super::*; | 
|  | 38 | + | 
|  | 39 | +    const VALUES: &[u64] = &[0, 5, 10, 20, 30]; | 
|  | 40 | + | 
|  | 41 | +    // O(n) | 
|  | 42 | +    #[divan::bench(args = VALUES)] | 
|  | 43 | +    fn iterative(n: u64) -> u64 { | 
|  | 44 | +        let mut previous = 1; | 
|  | 45 | +        let mut current = 1; | 
|  | 46 | + | 
|  | 47 | +        for _ in 2..=n { | 
|  | 48 | +            let next = previous + current; | 
|  | 49 | +            previous = current; | 
|  | 50 | +            current = next; | 
|  | 51 | +        } | 
|  | 52 | + | 
|  | 53 | +        current | 
|  | 54 | +    } | 
|  | 55 | + | 
|  | 56 | +    // O(2^n) | 
|  | 57 | +    #[divan::bench(args = VALUES, max_time = 1)] | 
|  | 58 | +    fn recursive(n: u64) -> u64 { | 
|  | 59 | +        if n <= 1 { | 
|  | 60 | +            1 | 
|  | 61 | +        } else { | 
|  | 62 | +            recursive(n - 2) + recursive(n - 1) | 
|  | 63 | +        } | 
|  | 64 | +    } | 
|  | 65 | + | 
|  | 66 | +    #[allow(dead_code)] | 
|  | 67 | +    trait Map: Default { | 
|  | 68 | +        fn get(&self, key: u64) -> Option<u64>; | 
|  | 69 | +        fn set(&mut self, key: u64, value: u64); | 
|  | 70 | +    } | 
|  | 71 | + | 
|  | 72 | +    impl Map for HashMap<u64, u64> { | 
|  | 73 | +        fn get(&self, key: u64) -> Option<u64> { | 
|  | 74 | +            self.get(&key).copied() | 
|  | 75 | +        } | 
|  | 76 | + | 
|  | 77 | +        fn set(&mut self, key: u64, value: u64) { | 
|  | 78 | +            self.insert(key, value); | 
|  | 79 | +        } | 
|  | 80 | +    } | 
|  | 81 | + | 
|  | 82 | +    impl Map for BTreeMap<u64, u64> { | 
|  | 83 | +        fn get(&self, key: u64) -> Option<u64> { | 
|  | 84 | +            self.get(&key).copied() | 
|  | 85 | +        } | 
|  | 86 | + | 
|  | 87 | +        fn set(&mut self, key: u64, value: u64) { | 
|  | 88 | +            self.insert(key, value); | 
|  | 89 | +        } | 
|  | 90 | +    } | 
|  | 91 | + | 
|  | 92 | +    // Will be ignored in instrumented mode as we do not support type generics yet | 
|  | 93 | +    // O(n) | 
|  | 94 | +    #[cfg(not(codspeed))] | 
|  | 95 | +    #[divan::bench( | 
|  | 96 | +        types = [BTreeMap<u64, u64>, HashMap<u64, u64>], | 
|  | 97 | +        args = VALUES, | 
|  | 98 | +    )] | 
|  | 99 | +    fn recursive_memoized<M: Map>(n: u64) -> u64 { | 
|  | 100 | +        fn fibonacci<M: Map>(n: u64, cache: &mut M) -> u64 { | 
|  | 101 | +            if let Some(result) = cache.get(n) { | 
|  | 102 | +                return result; | 
|  | 103 | +            } | 
|  | 104 | + | 
|  | 105 | +            if n <= 1 { | 
|  | 106 | +                return 1; | 
|  | 107 | +            } | 
|  | 108 | + | 
|  | 109 | +            let result = fibonacci(n - 2, cache) + fibonacci(n - 1, cache); | 
|  | 110 | +            cache.set(n, result); | 
|  | 111 | +            result | 
|  | 112 | +        } | 
|  | 113 | + | 
|  | 114 | +        fibonacci(n, &mut M::default()) | 
|  | 115 | +    } | 
|  | 116 | +} | 
0 commit comments