diff options
Diffstat (limited to 'benches')
| -rw-r--r-- | benches/hoptab_bench.rs | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/benches/hoptab_bench.rs b/benches/hoptab_bench.rs new file mode 100644 index 0000000..fd9a863 --- /dev/null +++ b/benches/hoptab_bench.rs @@ -0,0 +1,99 @@ +// SPDX-FileCopyrightText: 2026 Dilluti0n <[email protected]> +// SPDX-License-Identifier: GPL-3.0-or-later + +#![cfg(feature = "bench")] + +use std::net::{IpAddr, Ipv4Addr}; +use criterion::{criterion_group, criterion_main, Criterion, BenchmarkId, BatchSize, Throughput}; +use std::hint::black_box; + +#[macro_use] +#[path = "../src/log.rs"] +mod log; + +#[path = "../src/opt.rs"] +mod opt; + +#[path = "../src/pkt/hoptab.rs"] +pub mod hoptab; + +use hoptab::{put_0, find_0, reset_0}; + +fn prepare_data(count: usize) -> Vec<(IpAddr, u8)> { + (0..count as u32) + .map(|i| (IpAddr::V4(Ipv4Addr::from(i)), (i % 255) as u8)) + .collect() +} + +fn bench_hoptab_operations(c: &mut Criterion) { + let dataset = prepare_data(1024); + let mut group = c.benchmark_group("HopTab_Core"); + + let (test_ip, test_hop) = dataset[0]; + reset_0(); + put_0(test_ip, test_hop); + + group.bench_function("find_hop_hit", |b| { + b.iter(|| { + _ = find_0(black_box(test_ip)); + }) + }); + reset_0(); + + let mut i = 0; + group.bench_function("put_and_evict", |b| { + b.iter(|| { + let (ip, hop) = dataset[i % dataset.len()]; + put_0(black_box(ip), black_box(hop)); + i += 1; + }) + }); + + group.finish(); +} + +#[inline] +fn xorshift64(s: &mut u64) -> u64 { + let mut x = *s; + x ^= x << 13; + x ^= x >> 7; + x ^= x << 17; + *s = x; + x +} + +pub fn bench_hoptab_usecase(c: &mut Criterion) { + let dataset = prepare_data(1024); + + let mut group = c.benchmark_group("HopTab_Usecase"); + let mut seed = 0xC0FFEE_u64; + + for &noise in &[0usize, 1, 4, 16, 64, 128] { + reset_0(); + + // put origin + let i = (xorshift64(&mut seed) as usize) % dataset.len(); + let (ip, hop) = dataset[i]; + put_0(black_box(ip), black_box(hop)); + + // noise: other SYN/ACK + for _ in 0..noise { + let j = (xorshift64(&mut seed) as usize) % dataset.len(); + let (ip2, hop2) = dataset[j]; + put_0(black_box(ip2), black_box(hop2)); + } + + group.bench_function( + BenchmarkId::new("find_between_noise", noise), + |b| { + b.iter(|| { + _ = black_box(find_0(black_box(ip))); + }) + }); + } + + group.finish(); +} + +criterion_group!(benches, bench_hoptab_operations, bench_hoptab_usecase); +criterion_main!(benches); |
