Skip to content

Commit 51f5d33

Browse files
committed
optimize tests speed
1 parent d7e10e4 commit 51f5d33

4 files changed

Lines changed: 27 additions & 22 deletions

File tree

.github/workflows/rust.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ jobs:
1919
- name: Install cargo-hack
2020
run: cargo install cargo-hack
2121
- name: Build
22-
run: cargo hack build --verbose --feature-powerset --exclude-features loom
22+
run: cargo hack build --verbose --release --feature-powerset --exclude-features loom
2323
- name: Tests
24-
run: cargo hack test --verbose --feature-powerset --exclude-features loom
24+
run: cargo hack test --verbose --release --feature-powerset --exclude-features loom
2525
- name: Loom build
2626
run: cargo hack build --lib --bins --tests --feature-powerset --exclude-features serde,rand,default
2727
- name: Loom tests
@@ -38,6 +38,6 @@ jobs:
3838
- name: Install cargo-hack
3939
run: cargo install cargo-hack --version 0.6.37 --force --locked
4040
- name: Build
41-
run: cargo hack build --verbose --feature-powerset --exclude-features loom
41+
run: cargo hack build --verbose --release --feature-powerset --exclude-features loom
4242
- name: Tests
43-
run: cargo hack test --verbose --feature-powerset --exclude-features loom
43+
run: cargo hack test --verbose --release --feature-powerset --exclude-features loom

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@ siphasher = { version = "1.0.0", default-features = false }
3131
libm = "0.2"
3232

3333
[dev-dependencies]
34-
rand = "0.9"
34+
fastrand = "2.3.0"
3535
serde_cbor = "0.11.2"

src/bit_vector.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ macro_rules! impl_tests {
174174
mod $modname {
175175
use super::*;
176176
use core::iter::repeat;
177-
use rand::Rng;
178177

179178
#[test]
180179
fn test_to_from_vec() {
@@ -189,10 +188,10 @@ macro_rules! impl_tests {
189188
fn test_only_random_inserts_are_contained() {
190189
let mut vec: BitVec = repeat(0).take(80).collect();
191190
let mut control = Vec::with_capacity(1000);
192-
let mut rng = rand::rng();
191+
let mut rng = fastrand::Rng::with_seed(4364);
193192

194193
for _ in 0..1000 {
195-
let index = rng.random_range(0..vec.num_bits());
194+
let index = rng.usize(0..vec.num_bits());
196195

197196
if !control.contains(&index) {
198197
assert!(!vec.check(index));

src/lib.rs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,6 @@ macro_rules! impl_tests {
507507
mod $modname {
508508
use super::*;
509509
use alloc::format;
510-
use rand::{rngs::StdRng, Rng, SeedableRng};
511510

512511
trait Seeded: BuildHasher {
513512
fn seeded(seed: &[u8; 16]) -> Self;
@@ -518,14 +517,14 @@ macro_rules! impl_tests {
518517
}
519518
}
520519

521-
const TRIALS: usize = 1_000_000;
520+
const TRIALS: usize = 10_000_000;
522521

523522
fn false_pos_rate<H: BuildHasher>(filter: &$name<H>) -> f64 {
524523
let mut total = 0;
525524
let mut false_positives = 0;
526525
for x in non_member_nums() {
527526
total += 1;
528-
false_positives += filter.contains(&x) as usize;
527+
false_positives += filter.contains_hash(x) as usize;
529528
}
530529
(false_positives as f64) / (total as f64)
531530
}
@@ -535,12 +534,12 @@ macro_rules! impl_tests {
535534
}
536535

537536
fn non_member_nums() -> impl Iterator<Item = u64> {
538-
random_numbers(TRIALS, 7).map(|x| x + u32::MAX as u64)
537+
random_numbers(TRIALS, 7).map(|x| x + (u64::MAX >> 1))
539538
}
540539

541540
fn random_numbers(num: usize, seed: u64) -> impl Iterator<Item = u64> {
542-
let mut rng = StdRng::seed_from_u64(seed);
543-
(0..=num).map(move |_| rng.random::<u32>() as u64)
541+
let mut rng = fastrand::Rng::with_seed(seed);
542+
(0..=num).map(move |_| rng.u64(0..(u64::MAX >> 1)))
544543
}
545544

546545
#[test]
@@ -569,18 +568,25 @@ macro_rules! impl_tests {
569568

570569
#[test]
571570
fn target_fp_is_accurate() {
572-
let thresh = 2.0f64;
573-
for mag in 1..=6 {
574-
let fp = 1.0f64 / 10u64.pow(mag) as f64;
575-
for num_items_mag in 1..7 {
571+
// actual false pos is at most twice as high as expected
572+
// this is slightly higher to account for random variance and limited time to sample false pos rate.
573+
let thresh = 1.0f64;
574+
575+
// fp: 10%, 1%, 0.1%, etc
576+
for fp_mag in 1..=7 {
577+
let fp = 1.0f64 / 10u64.pow(fp_mag) as f64;
578+
579+
// Expected items: 10, 100, 1000, etc
580+
for num_items_mag in 3..8 {
576581
let num_items = 10usize.pow(num_items_mag);
577582
let mut filter = $name::new_with_false_pos(fp)
578583
.seed(&42)
579584
.expected_items(num_items);
580585
filter.extend(member_nums(num_items));
581586
let sample_fp = false_pos_rate(&filter);
582-
let err = (fp - sample_fp).abs() / fp;
583-
assert!(sample_fp < fp || err < thresh, "err {err:}, thresh {thresh:}, num_items: {num_items:}, fp: {fp:}, sample fp: {sample_fp:}");
587+
let err = (sample_fp - fp) / fp;
588+
let size_bits = filter.num_bits();
589+
assert!(sample_fp < fp || err < thresh, "err {err:}, thresh {thresh:}, num_items: {num_items:}, size bits: {size_bits:}, fp: {fp:}, sample fp: {sample_fp:}");
584590
}
585591
}
586592
}
@@ -714,8 +720,8 @@ macro_rules! impl_tests {
714720
#[test]
715721
fn test_seeded_hash_from_hashes_depth() {
716722
for size in [1, 10, 100, 1000] {
717-
let mut rng = StdRng::seed_from_u64(524323);
718-
let mut hasher = DoubleHasher::new(rng.random_range(0..u64::MAX));
723+
let mut rng = fastrand::Rng::with_seed(524323);
724+
let mut hasher = DoubleHasher::new(rng.u64(..));
719725
let mut seeded_hash_counts: Vec<_> = repeat(0).take(size).collect();
720726
for _ in 0..(size * 10_000) {
721727
let hi = hasher.next();

0 commit comments

Comments
 (0)