@@ -5,6 +5,10 @@ use std::iter;
5
5
use std:: marker:: PhantomData ;
6
6
use std:: mem;
7
7
use std:: slice;
8
+ #[ cfg( test) ]
9
+ extern crate test;
10
+ #[ cfg( test) ]
11
+ use test:: Bencher ;
8
12
9
13
pub type Word = u64 ;
10
14
pub const WORD_BYTES : usize = mem:: size_of :: < Word > ( ) ;
@@ -1132,3 +1136,87 @@ fn sparse_matrix_iter() {
1132
1136
}
1133
1137
assert ! ( iter. next( ) . is_none( ) ) ;
1134
1138
}
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