|
1 | 1 | use alloy_primitives::{uint, U256};
|
2 |
| -use criterion::{criterion_group, criterion_main, Criterion}; |
| 2 | +use core::hint::black_box; |
| 3 | +use criterion::{criterion_group, criterion_main, Criterion, Throughput}; |
3 | 4 | use uniswap_v3_math::bit_math;
|
4 | 5 | use uniswap_v3_sdk::prelude::*;
|
5 | 6 |
|
6 | 7 | const ONE: U256 = uint!(1_U256);
|
7 | 8 |
|
8 |
| -fn most_significant_bit_benchmark(c: &mut Criterion) { |
9 |
| - c.bench_function("most_significant_bit", |b| { |
| 9 | +fn generate_test_values() -> Vec<U256> { |
| 10 | + let mut values = (0u8..=255).map(|i| ONE << i).collect::<Vec<_>>(); |
| 11 | + // Add edge cases |
| 12 | + values.extend([ONE, U256::MAX]); |
| 13 | + values |
| 14 | +} |
| 15 | + |
| 16 | +fn most_significant_bit_comparison(c: &mut Criterion) { |
| 17 | + let values = generate_test_values(); |
| 18 | + let mut group = c.benchmark_group("most_significant_bit"); |
| 19 | + group.throughput(Throughput::Elements(values.len() as u64)); |
| 20 | + |
| 21 | + group.bench_function("sdk", |b| { |
10 | 22 | b.iter(|| {
|
11 |
| - for i in 0u8..=255 { |
12 |
| - let _ = most_significant_bit(ONE << i); |
| 23 | + for value in &values { |
| 24 | + let _ = black_box(most_significant_bit(*value)); |
13 | 25 | }
|
14 | 26 | })
|
15 | 27 | });
|
16 |
| -} |
17 | 28 |
|
18 |
| -fn most_significant_bit_benchmark_ref(c: &mut Criterion) { |
19 |
| - c.bench_function("most_significant_bit_ref", |b| { |
| 29 | + group.bench_function("reference", |b| { |
20 | 30 | b.iter(|| {
|
21 |
| - for i in 0u8..=255 { |
22 |
| - let _ = bit_math::most_significant_bit(ONE << i); |
| 31 | + for value in &values { |
| 32 | + let _ = black_box(bit_math::most_significant_bit(*value)); |
23 | 33 | }
|
24 | 34 | })
|
25 | 35 | });
|
| 36 | + |
| 37 | + group.finish(); |
26 | 38 | }
|
27 | 39 |
|
28 |
| -fn least_significant_bit_benchmark(c: &mut Criterion) { |
29 |
| - c.bench_function("least_significant_bit", |b| { |
| 40 | +fn least_significant_bit_comparison(c: &mut Criterion) { |
| 41 | + let values = generate_test_values(); |
| 42 | + let mut group = c.benchmark_group("least_significant_bit"); |
| 43 | + group.throughput(Throughput::Elements(values.len() as u64)); |
| 44 | + |
| 45 | + group.bench_function("sdk", |b| { |
30 | 46 | b.iter(|| {
|
31 |
| - for i in 0u8..=255 { |
32 |
| - let _ = least_significant_bit(ONE << i); |
| 47 | + for value in &values { |
| 48 | + let _ = black_box(least_significant_bit(*value)); |
33 | 49 | }
|
34 |
| - }); |
| 50 | + }) |
35 | 51 | });
|
36 |
| -} |
37 | 52 |
|
38 |
| -fn least_significant_bit_benchmark_ref(c: &mut Criterion) { |
39 |
| - c.bench_function("least_significant_bit_ref", |b| { |
| 53 | + group.bench_function("reference", |b| { |
40 | 54 | b.iter(|| {
|
41 |
| - for i in 0u8..=255 { |
42 |
| - let _ = bit_math::least_significant_bit(ONE << i); |
| 55 | + for value in &values { |
| 56 | + let _ = black_box(bit_math::least_significant_bit(*value)); |
43 | 57 | }
|
44 |
| - }); |
| 58 | + }) |
45 | 59 | });
|
| 60 | + |
| 61 | + group.finish(); |
46 | 62 | }
|
47 | 63 |
|
48 | 64 | criterion_group!(
|
49 | 65 | benches,
|
50 |
| - most_significant_bit_benchmark, |
51 |
| - most_significant_bit_benchmark_ref, |
52 |
| - least_significant_bit_benchmark, |
53 |
| - least_significant_bit_benchmark_ref |
| 66 | + most_significant_bit_comparison, |
| 67 | + least_significant_bit_comparison |
54 | 68 | );
|
55 | 69 | criterion_main!(benches);
|
0 commit comments