@@ -386,3 +386,87 @@ mod tests {
386
386
Ok ( ( ) )
387
387
}
388
388
}
389
+
390
+ #[ cfg( all( test, feature = "unstable" ) ) ]
391
+ mod bench {
392
+ use std:: collections:: HashMap ;
393
+ use std:: path:: Path ;
394
+
395
+ use test:: { self , Bencher } ;
396
+
397
+ use super :: * ;
398
+ use crate :: directory:: { CompositeFile , Directory , RamDirectory , WritePtr } ;
399
+ use crate :: fastfield:: { CompositeFastFieldSerializer , FastFieldsWriter } ;
400
+ use crate :: schema:: { Cardinality , NumericOptions , Schema } ;
401
+ use crate :: Document ;
402
+
403
+ fn multi_values ( num_docs : usize , vals_per_doc : usize ) -> Vec < Vec < u64 > > {
404
+ let mut vals = vec ! [ ] ;
405
+ for _i in 0 ..num_docs {
406
+ let mut block = vec ! [ ] ;
407
+ for j in 0 ..vals_per_doc {
408
+ block. push ( j as u64 ) ;
409
+ }
410
+ vals. push ( block) ;
411
+ }
412
+
413
+ vals
414
+ }
415
+
416
+ #[ bench]
417
+ fn bench_multi_value_fflookup ( b : & mut Bencher ) {
418
+ let num_docs = 100_000 ;
419
+
420
+ let path = Path :: new ( "test" ) ;
421
+ let directory: RamDirectory = RamDirectory :: create ( ) ;
422
+ let field = {
423
+ let options = NumericOptions :: default ( ) . set_fast ( Cardinality :: MultiValues ) ;
424
+ let mut schema_builder = Schema :: builder ( ) ;
425
+ let field = schema_builder. add_u64_field ( "field" , options) ;
426
+ let schema = schema_builder. build ( ) ;
427
+
428
+ let write: WritePtr = directory. open_write ( Path :: new ( "test" ) ) . unwrap ( ) ;
429
+ let mut serializer = CompositeFastFieldSerializer :: from_write ( write) . unwrap ( ) ;
430
+ let mut fast_field_writers = FastFieldsWriter :: from_schema ( & schema) ;
431
+ for block in & multi_values ( num_docs, 1 ) {
432
+ let mut doc = Document :: new ( ) ;
433
+ for val in block {
434
+ doc. add_u64 ( field, * val) ;
435
+ }
436
+ fast_field_writers. add_document ( & doc) ;
437
+ }
438
+ fast_field_writers
439
+ . serialize ( & mut serializer, & HashMap :: new ( ) , None )
440
+ . unwrap ( ) ;
441
+ serializer. close ( ) . unwrap ( ) ;
442
+ field
443
+ } ;
444
+ let file = directory. open_read ( & path) . unwrap ( ) ;
445
+ {
446
+ let fast_fields_composite = CompositeFile :: open ( & file) . unwrap ( ) ;
447
+ let data_idx = fast_fields_composite
448
+ . open_read_with_idx ( field, 0 )
449
+ . unwrap ( )
450
+ . read_bytes ( )
451
+ . unwrap ( ) ;
452
+ let idx_reader = fastfield_codecs:: open ( data_idx) . unwrap ( ) ;
453
+
454
+ let data_vals = fast_fields_composite
455
+ . open_read_with_idx ( field, 1 )
456
+ . unwrap ( )
457
+ . read_bytes ( )
458
+ . unwrap ( ) ;
459
+ let vals_reader = fastfield_codecs:: open ( data_vals) . unwrap ( ) ;
460
+ let fast_field_reader = MultiValuedFastFieldReader :: open ( idx_reader, vals_reader) ;
461
+ b. iter ( || {
462
+ let mut sum = 0u64 ;
463
+ for i in 0u32 ..num_docs as u32 {
464
+ let mut data = vec ! [ ] ;
465
+ fast_field_reader. get_vals ( i, & mut data) ;
466
+ sum += data. iter ( ) . sum :: < u64 > ( ) ;
467
+ }
468
+ sum
469
+ } ) ;
470
+ }
471
+ }
472
+ }
0 commit comments