mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-17 23:40:08 +00:00
134 lines
2.9 KiB
Rust
134 lines
2.9 KiB
Rust
#![feature(test)]
|
|
|
|
extern crate test;
|
|
extern crate fixedbitset;
|
|
use test::Bencher;
|
|
use fixedbitset::{FixedBitSet};
|
|
use std::mem::size_of;
|
|
|
|
#[inline]
|
|
fn iter_ones_using_contains<F: FnMut(usize)>(fb: &FixedBitSet, f: &mut F) {
|
|
for bit in 0 .. fb.len() {
|
|
if fb.contains(bit) {
|
|
f(bit);
|
|
}
|
|
}
|
|
}
|
|
|
|
#[inline]
|
|
fn iter_ones_using_slice_directly<F: FnMut(usize)>(fb: &FixedBitSet, f: &mut F) {
|
|
for (block_idx, &block) in fb.as_slice().iter().enumerate() {
|
|
let mut bit_pos = block_idx * size_of::<u32>() * 8;
|
|
let mut block: u32 = block;
|
|
|
|
while block != 0 {
|
|
if (block & 1) == 1 {
|
|
f(bit_pos);
|
|
}
|
|
block = block >> 1;
|
|
bit_pos += 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_iter_ones_using_contains_all_zeros(b: &mut Bencher) {
|
|
const N: usize = 1_000_000;
|
|
let fb = FixedBitSet::with_capacity(N);
|
|
|
|
b.iter(|| {
|
|
let mut count = 0;
|
|
iter_ones_using_contains(&fb, &mut |_bit| count += 1);
|
|
count
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_iter_ones_using_contains_all_ones(b: &mut Bencher) {
|
|
const N: usize = 1_000_000;
|
|
let mut fb = FixedBitSet::with_capacity(N);
|
|
fb.insert_range(..);
|
|
|
|
b.iter(|| {
|
|
let mut count = 0;
|
|
iter_ones_using_contains(&fb, &mut |_bit| count += 1);
|
|
count
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_iter_ones_using_slice_directly_all_zero(b: &mut Bencher) {
|
|
const N: usize = 1_000_000;
|
|
let fb = FixedBitSet::with_capacity(N);
|
|
|
|
b.iter(|| {
|
|
let mut count = 0;
|
|
iter_ones_using_slice_directly(&fb, &mut |_bit| count += 1);
|
|
count
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_iter_ones_using_slice_directly_all_ones(b: &mut Bencher) {
|
|
const N: usize = 1_000_000;
|
|
let mut fb = FixedBitSet::with_capacity(N);
|
|
fb.insert_range(..);
|
|
|
|
b.iter(|| {
|
|
let mut count = 0;
|
|
iter_ones_using_slice_directly(&fb, &mut |_bit| count += 1);
|
|
count
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_iter_ones_all_zeros(b: &mut Bencher) {
|
|
const N: usize = 1_000_000;
|
|
let fb = FixedBitSet::with_capacity(N);
|
|
|
|
b.iter(|| {
|
|
let mut count = 0;
|
|
for _ in fb.ones() {
|
|
count += 1;
|
|
}
|
|
count
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_iter_ones_all_ones(b: &mut Bencher) {
|
|
const N: usize = 1_000_000;
|
|
let mut fb = FixedBitSet::with_capacity(N);
|
|
fb.insert_range(..);
|
|
|
|
b.iter(|| {
|
|
let mut count = 0;
|
|
for _ in fb.ones() {
|
|
count += 1;
|
|
}
|
|
count
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_insert_range(b: &mut Bencher) {
|
|
const N: usize = 1_000_000;
|
|
let mut fb = FixedBitSet::with_capacity(N);
|
|
|
|
b.iter(|| {
|
|
fb.insert_range(..)
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_insert_range_using_loop(b: &mut Bencher) {
|
|
const N: usize = 1_000_000;
|
|
let mut fb = FixedBitSet::with_capacity(N);
|
|
|
|
b.iter(|| {
|
|
for i in 0..N {
|
|
fb.insert(i);
|
|
}
|
|
});
|
|
}
|