@@ -430,6 +430,8 @@ fn bench_sort(c: &mut Criterion) {
430430}
431431
432432fn bench_merge_sort ( c : & mut Criterion ) {
433+ use hash_sorted_map:: HashSortedContainer ;
434+
433435 const NUM_MAPS : usize = 100 ;
434436 const KEYS_PER_MAP : usize = 100_000 ;
435437
@@ -443,40 +445,49 @@ fn bench_merge_sort(c: &mut Criterion) {
443445 } )
444446 . collect ( ) ;
445447
448+ // Pre-build sorted containers from the input data.
449+ let sorted_containers: Vec < HashSortedContainer < u32 , u32 > > = maps_data
450+ . iter ( )
451+ . map ( |keys| {
452+ let mut map: HashSortedMap < u32 , u32 , _ > =
453+ HashSortedMap :: with_hasher ( IdentityBuildHasher :: default ( ) ) ;
454+ for & key in keys {
455+ * map. entry ( key) . or_default ( ) += 1u32 ;
456+ }
457+ map. sort_by_hash ( )
458+ } )
459+ . collect ( ) ;
460+
446461 let hasher = IdentityBuildHasher :: default ( ) ;
447462 let mut group = c. benchmark_group ( "merge_100_maps_sorted" ) ;
448463 group. sample_size ( 10 ) ;
449464
450- // ── 1. HashSortedMap: merge all , then sort_by_hash ───────────── ─
465+ // ── 1. HashSortedMap: merge sorted containers , then sort_by_hash ─
451466 group. bench_function ( "HashSortedMap merge + sort_by_hash" , |b| {
452467 b. iter ( || {
453468 let mut map: HashSortedMap < u32 , u32 , _ > =
454469 HashSortedMap :: with_hasher ( IdentityBuildHasher :: default ( ) ) ;
455- for keys in & maps_data {
456- for & key in keys {
457- * map. entry ( key) . or_default ( ) += 1u32 ;
470+ for container in & sorted_containers {
471+ for ( & key, & value ) in container {
472+ * map. entry ( key) . or_default ( ) += value ;
458473 }
459474 }
460475 map. sort_by_hash ( )
461476 } ) ;
462477 } ) ;
463478
464- // ── 2. K-way merge over pre-sorted vectors ── ────────────────────
465- group. bench_function ( "k-way merge sorted vecs " , |b| {
479+ // ── 2. K-way merge over pre-sorted containers ────────────────────
480+ group. bench_function ( "k-way merge sorted containers " , |b| {
466481 use itertools:: Itertools ;
467482
468483 b. iter ( || {
469- // Phase 1: build per-map sorted (hash, key, count) vectors.
470- let sorted_vecs: Vec < Vec < ( u64 , u32 , u32 ) > > = maps_data
484+ // Phase 1: build per-container sorted (hash, key, count) vectors.
485+ let sorted_vecs: Vec < Vec < ( u64 , u32 , u32 ) > > = sorted_containers
471486 . iter ( )
472- . map ( |keys| {
473- let mut counts = std:: collections:: HashMap :: < u32 , u32 , IdentityBuildHasher > :: with_hasher ( IdentityBuildHasher :: default ( ) ) ;
474- for & key in keys {
475- * counts. entry ( key) . or_default ( ) += 1 ;
476- }
477- let mut vec: Vec < ( u64 , u32 , u32 ) > = counts
478- . into_iter ( )
479- . map ( |( k, v) | ( hasher. hash_one ( k) , k, v) )
487+ . map ( |container| {
488+ let mut vec: Vec < ( u64 , u32 , u32 ) > = container
489+ . iter ( )
490+ . map ( |( & k, & v) | ( hasher. hash_one ( k) , k, v) )
480491 . collect ( ) ;
481492 vec. sort_unstable_by_key ( |& ( h, _, _) | h) ;
482493 vec
@@ -501,9 +512,9 @@ fn bench_merge_sort(c: &mut Criterion) {
501512 b. iter ( || {
502513 let mut map =
503514 hashbrown:: HashMap :: < u32 , u32 , IdentityBuildHasher > :: with_hasher ( IdentityBuildHasher :: default ( ) ) ;
504- for keys in & maps_data {
505- for & key in keys {
506- * map. entry ( key) . or_default ( ) += 1 ;
515+ for container in & sorted_containers {
516+ for ( & key, & value ) in container {
517+ * map. entry ( key) . or_default ( ) += value ;
507518 }
508519 }
509520 let mut vec: Vec < ( u32 , u32 ) > = map. into_iter ( ) . collect ( ) ;
@@ -517,9 +528,9 @@ fn bench_merge_sort(c: &mut Criterion) {
517528 b. iter ( || {
518529 let mut map =
519530 hashbrown:: HashMap :: < u32 , u32 , IdentityBuildHasher > :: with_hasher ( IdentityBuildHasher :: default ( ) ) ;
520- for keys in & maps_data {
521- for & key in keys {
522- * map. entry ( key) . or_default ( ) += 1 ;
531+ for container in & sorted_containers {
532+ for ( & key, & value ) in container {
533+ * map. entry ( key) . or_default ( ) += value ;
523534 }
524535 }
525536 map
@@ -531,9 +542,9 @@ fn bench_merge_sort(c: &mut Criterion) {
531542 b. iter ( || {
532543 let mut map: HashSortedMap < u32 , u32 , _ > =
533544 HashSortedMap :: with_hasher ( IdentityBuildHasher :: default ( ) ) ;
534- for keys in & maps_data {
535- for & key in keys {
536- * map. entry ( key) . or_default ( ) += 1u32 ;
545+ for container in & sorted_containers {
546+ for ( & key, & value ) in container {
547+ * map. entry ( key) . or_default ( ) += value ;
537548 }
538549 }
539550 map
@@ -548,9 +559,9 @@ fn bench_merge_sort(c: &mut Criterion) {
548559 1_000_000 ,
549560 IdentityBuildHasher :: default ( ) ,
550561 ) ;
551- for keys in & maps_data {
552- for & key in keys {
553- * map. entry ( key) . or_default ( ) += 1 ;
562+ for container in & sorted_containers {
563+ for ( & key, & value ) in container {
564+ * map. entry ( key) . or_default ( ) += value ;
554565 }
555566 }
556567 map
@@ -565,9 +576,9 @@ fn bench_merge_sort(c: &mut Criterion) {
565576 1_000_000 ,
566577 IdentityBuildHasher :: default ( ) ,
567578 ) ;
568- for keys in & maps_data {
569- for & key in keys {
570- * map. entry ( key) . or_default ( ) += 1u32 ;
579+ for container in & sorted_containers {
580+ for ( & key, & value ) in container {
581+ * map. entry ( key) . or_default ( ) += value ;
571582 }
572583 }
573584 map
0 commit comments