Skip to content

Commit 7fa6e87

Browse files
committed
Provide some benchmarks for bitset hybrid union
1 parent 50a0def commit 7fa6e87

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

src/librustc_data_structures/bit_set.rs

+88
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ use std::iter;
55
use std::marker::PhantomData;
66
use std::mem;
77
use std::slice;
8+
#[cfg(test)]
9+
extern crate test;
10+
#[cfg(test)]
11+
use test::Bencher;
812

913
pub type Word = u64;
1014
pub const WORD_BYTES: usize = mem::size_of::<Word>();
@@ -1132,3 +1136,87 @@ fn sparse_matrix_iter() {
11321136
}
11331137
assert!(iter.next().is_none());
11341138
}
1139+
1140+
/// Merge dense hybrid set into empty sparse hybrid set.
1141+
#[bench]
1142+
fn union_hybrid_sparse_empty_to_dense(b: &mut Bencher) {
1143+
let mut pre_dense: HybridBitSet<usize> = HybridBitSet::new_empty(256);
1144+
for i in 0..10 {
1145+
assert!(pre_dense.insert(i));
1146+
}
1147+
let pre_sparse: HybridBitSet<usize> = HybridBitSet::new_empty(256);
1148+
b.iter(|| {
1149+
let dense = pre_dense.clone();
1150+
let mut sparse = pre_sparse.clone();
1151+
sparse.union(&dense);
1152+
})
1153+
}
1154+
1155+
/// Merge dense hybrid set into full hybrid set with same indices.
1156+
#[bench]
1157+
fn union_hybrid_sparse_full_to_dense(b: &mut Bencher) {
1158+
let mut pre_dense: HybridBitSet<usize> = HybridBitSet::new_empty(256);
1159+
for i in 0..10 {
1160+
assert!(pre_dense.insert(i));
1161+
}
1162+
let mut pre_sparse: HybridBitSet<usize> = HybridBitSet::new_empty(256);
1163+
for i in 0..SPARSE_MAX {
1164+
assert!(pre_sparse.insert(i));
1165+
}
1166+
b.iter(|| {
1167+
let dense = pre_dense.clone();
1168+
let mut sparse = pre_sparse.clone();
1169+
sparse.union(&dense);
1170+
})
1171+
}
1172+
1173+
/// Merge dense hybrid set into full hybrid set with indices over the whole domain.
1174+
#[bench]
1175+
fn union_hybrid_sparse_domain_to_dense(b: &mut Bencher) {
1176+
let mut pre_dense: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX*64);
1177+
for i in 0..10 {
1178+
assert!(pre_dense.insert(i));
1179+
}
1180+
let mut pre_sparse: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX*64);
1181+
for i in 0..SPARSE_MAX {
1182+
assert!(pre_sparse.insert(i*64));
1183+
}
1184+
b.iter(|| {
1185+
let dense = pre_dense.clone();
1186+
let mut sparse = pre_sparse.clone();
1187+
sparse.union(&dense);
1188+
})
1189+
}
1190+
1191+
/// Merge dense hybrid set into empty hybrid set where the domain is very small.
1192+
#[bench]
1193+
fn union_hybrid_sparse_empty_small_domain(b: &mut Bencher) {
1194+
let mut pre_dense: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX);
1195+
for i in 0..SPARSE_MAX {
1196+
assert!(pre_dense.insert(i));
1197+
}
1198+
let pre_sparse: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX);
1199+
b.iter(|| {
1200+
let dense = pre_dense.clone();
1201+
let mut sparse = pre_sparse.clone();
1202+
sparse.union(&dense);
1203+
})
1204+
}
1205+
1206+
/// Merge dense hybrid set into full hybrid set where the domain is very small.
1207+
#[bench]
1208+
fn union_hybrid_sparse_full_small_domain(b: &mut Bencher) {
1209+
let mut pre_dense: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX);
1210+
for i in 0..SPARSE_MAX {
1211+
assert!(pre_dense.insert(i));
1212+
}
1213+
let mut pre_sparse: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX);
1214+
for i in 0..SPARSE_MAX {
1215+
assert!(pre_sparse.insert(i));
1216+
}
1217+
b.iter(|| {
1218+
let dense = pre_dense.clone();
1219+
let mut sparse = pre_sparse.clone();
1220+
sparse.union(&dense);
1221+
})
1222+
}

0 commit comments

Comments
 (0)