@@ -5,6 +5,10 @@ use std::iter;
55use std:: marker:: PhantomData ;
66use std:: mem;
77use std:: slice;
8+ #[ cfg( test) ]
9+ extern crate test;
10+ #[ cfg( test) ]
11+ use test:: Bencher ;
812
913pub type Word = u64 ;
1014pub 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