Skip to content

Commit e73f642

Browse files
committed
Update performance.rs
1 parent 170870e commit e73f642

1 file changed

Lines changed: 42 additions & 31 deletions

File tree

crates/hash-sorted-map/benchmarks/performance.rs

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,8 @@ fn bench_sort(c: &mut Criterion) {
430430
}
431431

432432
fn 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

Comments
 (0)