|
1 | 1 | use rand::Rng;
|
2 | 2 | use test::{black_box, Bencher};
|
3 | 3 |
|
4 |
| -macro_rules! int_log_bench { |
| 4 | +macro_rules! int_log10_bench { |
5 | 5 | ($t:ty, $predictable:ident, $random:ident, $random_small:ident) => {
|
6 | 6 | #[bench]
|
7 | 7 | fn $predictable(bench: &mut Bencher) {
|
@@ -51,8 +51,75 @@ macro_rules! int_log_bench {
|
51 | 51 | };
|
52 | 52 | }
|
53 | 53 |
|
54 |
| -int_log_bench! {u8, u8_log10_predictable, u8_log10_random, u8_log10_random_small} |
55 |
| -int_log_bench! {u16, u16_log10_predictable, u16_log10_random, u16_log10_random_small} |
56 |
| -int_log_bench! {u32, u32_log10_predictable, u32_log10_random, u32_log10_random_small} |
57 |
| -int_log_bench! {u64, u64_log10_predictable, u64_log10_random, u64_log10_random_small} |
58 |
| -int_log_bench! {u128, u128_log10_predictable, u128_log10_random, u128_log10_random_small} |
| 54 | +int_log10_bench! {u8, u8_log10_predictable, u8_log10_random, u8_log10_random_small} |
| 55 | +int_log10_bench! {u16, u16_log10_predictable, u16_log10_random, u16_log10_random_small} |
| 56 | +int_log10_bench! {u32, u32_log10_predictable, u32_log10_random, u32_log10_random_small} |
| 57 | +int_log10_bench! {u64, u64_log10_predictable, u64_log10_random, u64_log10_random_small} |
| 58 | +int_log10_bench! {u128, u128_log10_predictable, u128_log10_random, u128_log10_random_small} |
| 59 | + |
| 60 | +macro_rules! int_log_bench { |
| 61 | + ($t:ty, $random:ident, $random_small:ident, $geometric:ident) => { |
| 62 | + #[bench] |
| 63 | + fn $random(bench: &mut Bencher) { |
| 64 | + let mut rng = crate::bench_rng(); |
| 65 | + /* Exponentially distributed random numbers from the whole range of the type. */ |
| 66 | + let numbers: Vec<$t> = (0..256) |
| 67 | + .map(|_| { |
| 68 | + let x = rng.gen::<$t>() >> rng.gen_range(0..<$t>::BITS); |
| 69 | + if x >= 2 { x } else { 2 } |
| 70 | + }) |
| 71 | + .collect(); |
| 72 | + bench.iter(|| { |
| 73 | + for &b in &numbers { |
| 74 | + for &x in &numbers { |
| 75 | + black_box(black_box(x).ilog(b)); |
| 76 | + } |
| 77 | + } |
| 78 | + }); |
| 79 | + } |
| 80 | + |
| 81 | + #[bench] |
| 82 | + fn $random_small(bench: &mut Bencher) { |
| 83 | + let mut rng = crate::bench_rng(); |
| 84 | + /* Exponentially distributed random numbers from the range 0..256. */ |
| 85 | + let numbers: Vec<$t> = (0..256) |
| 86 | + .map(|_| { |
| 87 | + let x = (rng.gen::<u8>() >> rng.gen_range(0..u8::BITS)) as $t; |
| 88 | + if x >= 2 { x } else { 2 } |
| 89 | + }) |
| 90 | + .collect(); |
| 91 | + bench.iter(|| { |
| 92 | + for &b in &numbers { |
| 93 | + for &x in &numbers { |
| 94 | + black_box(black_box(x).ilog(b)); |
| 95 | + } |
| 96 | + } |
| 97 | + }); |
| 98 | + } |
| 99 | + |
| 100 | + #[bench] |
| 101 | + fn $geometric(bench: &mut Bencher) { |
| 102 | + let bases: [$t; 16] = [2, 3, 4, 5, 7, 8, 9, 15, 16, 17, 31, 32, 33, 63, 64, 65]; |
| 103 | + let base_and_numbers: Vec<($t, Vec<$t>)> = bases |
| 104 | + .iter() |
| 105 | + .map(|&b| { |
| 106 | + let numbers = (0..=<$t>::MAX.ilog(b)).map(|exp| b.pow(exp)).collect(); |
| 107 | + (b, numbers) |
| 108 | + }) |
| 109 | + .collect(); |
| 110 | + bench.iter(|| { |
| 111 | + for (b, numbers) in &base_and_numbers { |
| 112 | + for &x in numbers { |
| 113 | + black_box(black_box(x).ilog(black_box(*b))); |
| 114 | + } |
| 115 | + } |
| 116 | + }); |
| 117 | + } |
| 118 | + }; |
| 119 | +} |
| 120 | + |
| 121 | +int_log_bench! {u8, u8_log_random, u8_log_random_small, u8_log_geometric} |
| 122 | +int_log_bench! {u16, u16_log_random, u16_log_random_small, u16_log_geometric} |
| 123 | +int_log_bench! {u32, u32_log_random, u32_log_random_small, u32_log_geometric} |
| 124 | +int_log_bench! {u64, u64_log_random, u64_log_random_small, u64_log_geometric} |
| 125 | +int_log_bench! {u128, u128_log_random, u128_log_random_small, u128_log_geometric} |
0 commit comments