Skip to content

perf(collections): delete the per-probe virtual call on reference-type keys - #322

Merged
marius-bughiu merged 3 commits into
mainfrom
perf/issue-308-empty-slot-devirt
Jul 26, 2026
Merged

perf(collections): delete the per-probe virtual call on reference-type keys#322
marius-bughiu merged 3 commits into
mainfrom
perf/issue-308-empty-slot-devirt

Conversation

@marius-bughiu

Copy link
Copy Markdown
Owner

Closes #308.

What

The probe loops asked "is this slot vacant?" with EqualityComparer<TKey>.Default.Equals(slot, default(TKey)). For a value-type key the JIT's EqualityComparer<T>.Default intrinsic devirtualizes and inlines that, so it is free. For a reference-type key it does not: the collection JITs as a __Canon-shared body and the call stays a real interface dispatch — one callvirt per probe iteration, to ask whether a reference is null.

All 66 such call sites across twelve collections now route through a new internal EmptySlot.Is<T> helper:

internal static bool Is<T>(T? value)
{
    if (typeof(T).IsValueType)
        return EqualityComparer<T>.Default.Equals(value, default);

    return value is null;
}

typeof(T).IsValueType is a JIT-time constant (__Canon only ever stands in for a reference type), so exactly one arm is compiled into each instantiation. The codebase already relies on this pattern in HyperLogLog.Hash64.

The substitution is exact, not an approximation. Every EqualityComparer<T> the runtime supplies for a reference type resolves a null right-hand side structurally, before it consults the element's own Equals — so Equals(x, null) is true exactly when x is null, even for a type whose Equals claims equality with everything. That invariant is now pinned by a test rather than assumed.

Hoisted comparer locals that became unused after the substitution were removed; the comparer.Equals(slot, key) calls (the actual key match) are untouched.

Measurements

Local dotnet run -c Release -- --filter "*StringKeyProbeBenchmark*" --job medium, before vs after on the same machine, Celerity arms only. Run-to-run variance on the "after" side was ±1–2% on the 1k rows.

Row before after Δ
CelerityDictionary_Lookup @1k 10.40 µs 9.34 / 9.44 µs −10%
CelerityDictionary_LookupMissing @1k 17.92 µs 15.99 / 16.12 µs −10%
CelerityDictionary_Lookup @100k 3,715 µs 3,639 / 3,349 µs −2 to −10%
CelerityDictionary_LookupMissing @100k 5,254 µs 5,223 / 4,990 µs −1 to −5%
CeleritySet_Contains @1k 12.56 µs 13.11 / 12.84 µs within noise
CeleritySet_Contains @100k 4,115 µs 3,900 / 4,086 µs −1 to −5%

The in-cache 1k dictionary rows are where the removed dispatch is the largest fraction of the probe; the 100k rows are memory-bound, so the win is smaller and noisier. No row regressed outside noise. Value-type keys are unaffected by construction — the same expression is compiled.

The IEqualityProvider<T> follow-up: closed, with the reason

#308 asks to either open the IEqualityProvider<T> issue with numbers attached or close the idea. Closing it. A throwaway HashCachingDictionary control arm (added, measured, removed) settles it:

100k string keys vs Dictionary<string, int>
CelerityDictionary lookup (hit) 1.33× slower
CelerityDictionary lookup (miss) 1.60× slower
HashCachingDictionary lookup (hit) 1.18× slower
HashCachingDictionary lookup (miss) 0.94× — faster

Caching the hash per slot — which changes nothing about the equality dispatch — recovers essentially the whole deficit on the probe-heavy miss path. So the residual reference-type-key cost is dominated by re-hashing the key on every probe, not by the remaining comparer.Equals. The generic-signature blast radius of an IEqualityProvider<T> axis is not justified by that; the actionable answer for string keys is the hash-caching variants Celerity already ships, and that is now documented instead.

Parity rollout

Facet What changed
Collection EmptySlot.cs (new internal helper); 66 call sites across CelerityDictionary, RobinHoodDictionary, SwissDictionary, HashCachingDictionary, PooledCelerityDictionary, CelerityMultiMap, CeleritySet, RobinHoodSet, SwissSet, HashCachingSet, PooledCeleritySet, CelerityMultiSet
Dedicated tests ReferenceKeyProbeTests.cs — 26 tests. Covers all twelve collections with a NullGreedyKey whose Equals claims equality with null (fill past several resizes → lookups → half-delete → survivors), the null-key/element out-of-band round trip on each, a value-type-key control, and an explicit assertion of the EqualityComparer null contract the whole substitution rests on
Cross-collection shared tests N/A as new rows — no new type was introduced, so no existing shared suite gains a block. ReferenceKeyProbeTests is the cross-collection suite for this behaviour and covers the whole family in one file
Benchmarks StringKeyProbeBenchmark.cs (new) — first string-keyed rows in the suite: Lookup, LookupMissing (CelerityDictionary<string, …> vs Dictionary<string, int>) and Contains (CeleritySet<string, …> vs HashSet<string>), at 1k / 100k, library default load factor. Registered in Program.cs CoreBenchmarks
Dashboard web/dev/bench/index.html and web/dev/bench/detail.html gain a StringKeyProbe entry. web/index.html ship cards: N/A — no new public type ships
Docs docs/performance.md §1 gains Reference-type keys: cache the hash with the measured table; docs/api/collections.md HashCachingDictionary section calls out the string-key case; README.md decision table points string-keyed workloads at HashCachingDictionary
CHANGELOG [Unreleased] — bullets for the benchmark, the tests, the perf change, and the documentation correction
ROADMAP Delete the per-probe virtual call flipped to done, including why IEqualityProvider<T> was not opened

Test plan

  • dotnet build clean, 0 errors, no new warnings
  • dotnet test green on net8.0 / net9.0 / net10.0 — 4,736 tests (4,710 pre-existing, all untouched, plus 26 new). The existing suite passing unchanged is the primary evidence that behaviour is identical
  • Showcase suites green (Celerity.Ring 31, Celerity.Sentinel 20, Celerity.Cardinality 23)
  • Benchmark project builds in Release and StringKeyProbeBenchmark runs end to end locally
  • CI matrix (build + test across the target frameworks and OSes)
  • Coverage gate ≥95% line / ≥90% branch — EmptySlot.Is has both arms exercised (value-type keys via the integer collections, reference-type via the new tests)
  • Per-PR benchmark comparison. Note: this PR adds a benchmark class, so the head and base packs run different class lists — the known shard-timeout hazard in Benchmark shard can time out on any PR that adds a benchmark class (head/base pack from different class lists) #300
  • gh-pages dashboard refresh on main merge, rendering the new String-keyed probe card

🤖 Generated with Claude Code

…e keys

The probe loops tested for a vacant slot with
`EqualityComparer<TKey>.Default.Equals(slot, default(TKey))`. The JIT
devirtualizes that for value-type keys, but not under __Canon-shared
reference-type instantiations — so every string-keyed table paid a real
interface call per probe iteration to ask whether a reference is null.

Route every vacant-slot test through a new internal `EmptySlot.Is<T>`
helper whose `typeof(T).IsValueType` guard the JIT folds to a constant:
reference-type instantiations compile to a plain null test, value-type
ones keep the existing intrinsic comparison. The substitution is exact —
the runtime's default comparers resolve a null right-hand side
structurally, before consulting the key's own Equals.

Also adds the suite's first string-keyed benchmark rows and documents,
with numbers, that `CelerityDictionary` measures behind the BCL
`Dictionary` on string keys and that `HashCachingDictionary` is the
answer there.

Closes #308
Copilot AI review requested due to automatic review settings July 26, 2026 08:06
@github-actions

github-actions Bot commented Jul 26, 2026

Copy link
Copy Markdown

Coverage

Metric Value
Line 100% (9780/9780)
Branch 100% (3864/3864)

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves probe-loop performance for reference-type keys across Celerity’s open-addressed collections by routing vacant-slot checks through a new EmptySlot.Is<T> helper that compiles to a plain null test under __Canon sharing, while preserving value-type semantics. It also adds cross-collection tests and a new benchmark row to keep this reference-key path tracked and documented.

Changes:

  • Introduce EmptySlot.Is<T> and replace EqualityComparer<T>.Default.Equals(slot, default) vacant-slot checks across multiple collections.
  • Add ReferenceKeyProbeTests to pin the null-comparer contract and probe correctness for adversarial reference keys.
  • Add StringKeyProbeBenchmark + dashboard entries, and update docs/README/roadmap/changelog to reflect guidance for string-keyed workloads.

Reviewed changes

Copilot reviewed 23 out of 23 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
web/dev/bench/index.html Adds the “String-keyed probe” card entry to the dev benchmark dashboard.
web/dev/bench/detail.html Adds “String-keyed probe” to the detail page collection list.
src/Celerity/Collections/SwissSet.cs Routes default/empty checks through EmptySlot.Is.
src/Celerity/Collections/SwissDictionary.cs Routes default/empty key checks through EmptySlot.Is.
src/Celerity/Collections/RobinHoodSet.cs Replaces vacant-slot checks with EmptySlot.Is and removes now-unused comparer locals.
src/Celerity/Collections/RobinHoodDictionary.cs Replaces vacant-slot checks with EmptySlot.Is and removes now-unused comparer locals.
src/Celerity/Collections/PooledCeleritySet.cs Replaces vacant-slot checks with EmptySlot.Is and removes now-unused comparer locals.
src/Celerity/Collections/PooledCelerityDictionary.cs Replaces vacant-slot checks with EmptySlot.Is and removes now-unused comparer locals.
src/Celerity/Collections/HashCachingSet.cs Routes default/empty checks through EmptySlot.Is.
src/Celerity/Collections/HashCachingDictionary.cs Routes default/empty key checks through EmptySlot.Is.
src/Celerity/Collections/EmptySlot.cs New internal helper that folds vacant-slot checks to a null test for reference-type instantiations.
src/Celerity/Collections/CeleritySet.cs Replaces vacant-slot checks with EmptySlot.Is and removes now-unused comparer locals.
src/Celerity/Collections/CelerityMultiSet.cs Replaces vacant-slot checks with EmptySlot.Is and removes now-unused comparer locals.
src/Celerity/Collections/CelerityMultiMap.cs Replaces vacant-slot checks with EmptySlot.Is and removes now-unused comparer locals.
src/Celerity/Collections/CelerityDictionary.cs Replaces vacant-slot checks with EmptySlot.Is, removes unused comparer locals, and documents the rationale inline.
src/Celerity.Tests/Collections/ReferenceKeyProbeTests.cs Adds adversarial reference-key tests that pin the null-comparer behavior and cross-collection probe correctness.
src/Celerity.Benchmarks/StringKeyProbeBenchmark.cs Adds first string-keyed probe-path benchmarks (lookup hit/miss, set contains).
src/Celerity.Benchmarks/Program.cs Registers StringKeyProbeBenchmark in the core benchmark suite.
ROADMAP.md Marks the roadmap item as done with rationale and documentation pointer.
README.md Updates the decision table guidance for string keys toward hash-caching variants.
docs/performance.md Adds a “Reference-type keys: cache the hash” section with measured results and dashboard pointer.
docs/api/collections.md Calls out the string-key case and links to the performance guidance.
CHANGELOG.md Adds unreleased entries for the perf change, new benchmark/tests, and updated guidance.

Comment thread CHANGELOG.md Outdated
Copilot review on #322: the [Unreleased] bullets recited the JIT/codegen
detail and enumerated every affected type, against CLAUDE.md's rule that
entries stay short and user-facing (the release workflow extracts the
section verbatim).
Copilot AI review requested due to automatic review settings July 26, 2026 08:11

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 23 out of 23 changed files in this pull request and generated no new comments.

@github-actions

github-actions Bot commented Jul 26, 2026

Copy link
Copy Markdown

Benchmarks

11 regressions ⚠️ vs main, 14 improvements ✅ (rows past ±10% beyond noise).

Highlights

Benchmark This PR StdDev main Δ
FenwickTreeBenchmark.Array_Mixed(ItemCount: 1000) 182.57 μs 637.3 ns 202.46 μs -9.8% ✅
FenwickTreeBenchmark.Array_Mixed(ItemCount: 100000) 166.48 ms 589.18 μs 184.48 ms -9.8% ✅
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 1000) 221.08 μs 345.1 ns 249.01 μs -11.2% ✅
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 100000) 326.03 μs 1.34 μs 218.76 μs +49.0% ⚠️
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.68 ms 171.36 μs 2.29 ms +17.1% ⚠️
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 100000) 8.04 ms 350.11 μs 6.44 ms +24.9% ⚠️
EnumSetBenchmark.EnumSet_Add 83.3 ns 0.8 ns 106.8 ns -22.0% ✅
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 1000) 4.63 ms 80.37 μs 4.20 ms +10.0% ⚠️
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 100000) 2.08 s 187.06 ms 1.82 s +14.7% ⚠️
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 100000) 1.41 ms 9.29 μs 964.42 μs +46.5% ⚠️
CuckooFilterBenchmark.HashSet_Add(ItemCount: 1000) 12.68 μs 82.6 ns 14.63 μs -13.4% ✅
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 8) 166.9 ns 5.6 ns 191.2 ns -12.7% ✅
LruCacheBenchmark.Dictionary_Put(ItemCount: 100000) 6.39 ms 920.90 μs 8.30 ms -23.0% ✅
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 1000) 26.58 μs 1.04 μs 35.58 μs -25.3% ✅
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 1000) 3.29 μs 11.3 ns 2.79 μs +18.0% ⚠️
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 15.39 μs 183.6 ns 13.94 μs +10.4% ⚠️
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 2.58 μs 172.0 ns 2.15 μs +20.0% ⚠️
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 1000) 2.48 μs 23.4 ns 12.42 μs -80.0% ✅
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 100000) 805.84 μs 16.24 μs 659.70 μs +22.2% ⚠️
DequeBenchmark.LinkedList_Queue(ItemCount: 1000) 57.15 μs 3.13 μs 49.77 μs +14.8% ⚠️
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 1000) 128.62 μs 3.75 μs 154.40 μs -16.7% ✅
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 1000) 125.67 μs 8.37 μs 155.96 μs -19.4% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 1000) 119.55 μs 4.86 μs 152.75 μs -21.7% ✅
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 100000) 1.75 ms 62.27 μs 1.95 ms -10.5% ✅
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 1000) 4.58 μs 39.4 ns 5.83 μs -21.4% ✅
Collections (472)
Benchmark This PR StdDev main Δ
TrieBenchmark.Dictionary_Add(ItemCount: 1000) 33.89 μs 1.30 μs 38.38 μs -11.7%
TrieBenchmark.Trie_Add(ItemCount: 1000) 549.77 μs 16.73 μs 552.12 μs -0.4%
LongSetBenchmark.HashSet_Add(ItemCount: 1000) 16.48 μs 1.04 μs 16.78 μs -1.8%
LongSetBenchmark.LongSet_Add(ItemCount: 1000) 10.57 μs 159.0 ns 10.71 μs -1.3%
TrieBenchmark.Dictionary_Add(ItemCount: 100000) 5.71 ms 1.90 ms 5.17 ms +10.5%
TrieBenchmark.Trie_Add(ItemCount: 100000) 26.99 ms 354.61 μs 26.78 ms +0.8%
LongSetBenchmark.HashSet_Add(ItemCount: 100000) 5.12 ms 120.96 μs 5.19 ms -1.3%
LongSetBenchmark.LongSet_Add(ItemCount: 100000) 6.41 ms 72.56 μs 6.47 ms -1.0%
LongSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.87 μs 22.0 ns 5.18 μs -5.8%
LongSetBenchmark.LongSet_Contains(ItemCount: 1000) 2.01 μs 10.4 ns 2.01 μs +0.1%
LongSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.66 ms 14.08 μs 1.68 ms -1.1%
LongSetBenchmark.LongSet_Contains(ItemCount: 100000) 644.61 μs 720.9 ns 646.54 μs -0.3%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 19.23 μs 796.4 ns 19.20 μs +0.2%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 1000) 13.02 μs 229.6 ns 12.89 μs +1.0%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 5.41 ms 154.90 μs 5.27 ms +2.7%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 100000) 7.49 ms 199.04 μs 7.31 ms +2.3%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.89 μs 24.5 ns 4.90 μs -0.2%
TrieBenchmark.Dictionary_Lookup(ItemCount: 1000) 13.19 μs 589.4 ns 13.42 μs -1.7%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 1000) 2.28 μs 6.6 ns 2.28 μs +0.0%
TrieBenchmark.Trie_Lookup(ItemCount: 1000) 40.43 μs 301.8 ns 40.12 μs +0.8%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.64 ms 10.97 μs 1.61 ms +1.7%
TrieBenchmark.Dictionary_Lookup(ItemCount: 100000) 2.86 ms 52.27 μs 2.96 ms -3.3%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 100000) 711.45 μs 4.98 μs 704.44 μs +1.0%
TrieBenchmark.Trie_Lookup(ItemCount: 100000) 9.26 ms 27.14 μs 9.32 ms -0.6%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 1000) 182.57 μs 637.3 ns 202.46 μs -9.8% ✅
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 1000) 11.30 μs 59.8 ns 11.40 μs -0.9%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 100000) 166.48 ms 589.18 μs 184.48 ms -9.8% ✅
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 100000) 666.35 μs 15.96 μs 642.29 μs +3.7%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 1000) 73.55 μs 100.8 ns 73.58 μs -0.0%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 1000) 55.77 μs 141.5 ns 56.08 μs -0.6%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 100000) 7.42 ms 16.04 μs 7.45 ms -0.3%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 100000) 11.38 ms 726.19 μs 10.78 ms +5.5%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 1000) 221.08 μs 345.1 ns 249.01 μs -11.2% ✅
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 1000) 7.46 μs 7.5 ns 6.87 μs +8.6%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 100000) 208.52 ms 12.99 ms 224.77 ms -7.2%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 100000) 326.03 μs 1.34 μs 218.76 μs +49.0% ⚠️
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 89.26 μs 10.47 μs 86.13 μs +3.6%
LongSetBenchmark.HashSet_Remove(ItemCount: 1000) 77.63 μs 6.53 μs 83.01 μs -6.5%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 1000) 95.90 μs 12.23 μs 93.03 μs +3.1%
LongSetBenchmark.LongSet_Remove(ItemCount: 1000) 85.33 μs 8.73 μs 88.83 μs -3.9%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.68 ms 171.36 μs 2.29 ms +17.1% ⚠️
LongSetBenchmark.HashSet_Remove(ItemCount: 100000) 2.20 ms 204.85 μs 2.31 ms -4.7%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 100000) 2.59 ms 394.29 μs 2.29 ms +13.2%
LongSetBenchmark.LongSet_Remove(ItemCount: 100000) 1.73 ms 221.45 μs 1.79 ms -3.8%
SmallSetBenchmark.HashSet_Add(ItemCount: 8) 170.3 ns 5.5 ns 178.0 ns -4.4%
SmallSetBenchmark.SmallSet_Add(ItemCount: 8) 47.0 ns 0.8 ns 48.8 ns -3.7%
SmallSetBenchmark.HashSet_Add(ItemCount: 64) 836.5 ns 11.5 ns 789.1 ns +6.0%
SmallSetBenchmark.SmallSet_Add(ItemCount: 64) 1.95 μs 294.6 ns 1.93 μs +1.1%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 1000) 64.02 μs 1.58 μs 69.17 μs -7.5%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 1000) 54.37 μs 651.0 ns 54.30 μs +0.1%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 100000) 23.91 ms 131.58 μs 24.61 ms -2.9%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 100000) 16.16 ms 110.79 μs 16.02 ms +0.9%
SmallSetBenchmark.HashSet_Contains(ItemCount: 8) 37.3 ns 0.1 ns 37.2 ns +0.2%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 8) 18.9 ns 0.1 ns 18.9 ns +0.2%
SmallSetBenchmark.HashSet_Contains(ItemCount: 64) 299.9 ns 0.7 ns 299.4 ns +0.2%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 64) 1.09 μs 13.0 ns 1.08 μs +0.7%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 1000) 18.24 μs 187.7 ns 18.21 μs +0.2%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 1000) 24.38 μs 147.4 ns 24.14 μs +1.0%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 100000) 3.57 ms 39.33 μs 3.67 ms -2.8%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 100000) 5.02 ms 130.02 μs 5.17 ms -2.9%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 1000) 32.06 μs 2.47 μs 30.90 μs +3.7%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 16.36 μs 2.66 μs 14.49 μs +12.9%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 1000) 38.84 μs 522.0 ns 41.28 μs -5.9%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 1000) 30.15 μs 354.9 ns 29.78 μs +1.2%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 100000) 13.07 ms 765.37 μs 13.39 ms -2.4%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.73 ms 239.49 μs 4.58 ms +3.2%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 100000) 17.72 ms 183.73 μs 18.04 ms -1.8%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 100000) 3.96 ms 22.78 μs 3.98 ms -0.4%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 1000) 18.52 μs 334.2 ns 18.36 μs +0.9%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 26.76 μs 136.1 ns 26.67 μs +0.4%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 1000) 38.39 μs 2.01 μs 35.07 μs +9.4%
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.06 μs 27.3 ns 5.03 μs +0.7%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.73 μs 16.6 ns 4.73 μs -0.0%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 1000) 25.50 μs 154.4 ns 25.35 μs +0.6%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 1000) 2.36 μs 6.9 ns 2.37 μs -0.3%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 1000) 3.04 μs 27.9 ns 3.01 μs +1.0%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 100000) 3.72 ms 60.70 μs 3.58 ms +3.9%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 5.55 ms 134.25 μs 5.83 ms -4.9%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 100000) 18.74 ms 90.81 μs 18.78 ms -0.2%
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.78 ms 6.54 μs 1.81 ms -1.9%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.62 ms 6.12 μs 1.62 ms -0.2%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 100000) 13.12 ms 83.46 μs 13.11 ms +0.1%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 100000) 736.33 μs 15.54 μs 778.54 μs -5.4%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 100000) 821.24 μs 6.35 μs 851.27 μs -3.5%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 1000) 14.99 μs 54.8 ns 14.93 μs +0.4%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 1000) 28.69 μs 280.0 ns 28.68 μs +0.0%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 100000) 4.40 ms 197.62 μs 4.14 ms +6.3%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 100000) 8.04 ms 350.11 μs 6.44 ms +24.9% ⚠️
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 1000) 184.52 μs 911.4 ns 189.62 μs -2.7%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 1000) 85.77 μs 2.27 μs 83.68 μs +2.5%
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 100000) 49.59 ms 367.67 μs 48.37 ms +2.5%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 100000) 26.82 ms 84.55 μs 26.43 ms +1.5%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 1000) 4.49 μs 23.4 ns 4.45 μs +0.9%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 1000) 77.6 ns 0.5 ns 77.0 ns +0.8%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 100000) 1.28 ms 11.69 μs 1.27 ms +1.3%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 100000) 5.81 μs 48.5 ns 5.79 μs +0.4%
SmallSetBenchmark.HashSet_Remove(ItemCount: 8) 506.8 ns 68.6 ns 477.9 ns +6.1%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 8) 1.25 μs 151.2 ns 1.29 μs -2.8%
SmallSetBenchmark.HashSet_Remove(ItemCount: 64) 1.38 μs 60.8 ns 1.38 μs -0.3%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 64) 25.10 μs 4.71 μs 24.53 μs +2.3%
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 1000) 815.03 μs 32.16 μs 784.50 μs +3.9%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 1000) 30.89 μs 5.86 μs 29.91 μs +3.3%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 80.64 μs 6.62 μs 85.11 μs -5.2%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 1000) 312.32 μs 14.36 μs 315.46 μs -1.0%
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 1000) 135.30 μs 8.96 μs 132.51 μs +2.1%
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 1000) 83.96 μs 4.29 μs 78.43 μs +7.0%
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 100000) 26.16 ms 132.72 μs 26.94 ms -2.9%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 2.49 ms 379.51 μs 3.21 ms -22.2%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.07 ms 15.61 μs 2.10 ms -1.4%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 100000) 18.25 ms 102.06 μs 18.58 ms -1.8%
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 100000) 2.33 ms 207.68 μs 2.57 ms -9.0%
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 100000) 1.74 ms 44.78 μs 1.73 ms +0.9%
EnumSetBenchmark.HashSet_Add 601.1 ns 10.1 ns 602.0 ns -0.2%
EnumSetBenchmark.EnumSet_Add 83.3 ns 0.8 ns 106.8 ns -22.0% ✅
BTreeSetBenchmark.SortedSet_Add(ItemCount: 1000) 41.38 μs 622.7 ns 43.90 μs -5.7%
BloomFilterBenchmark.HashSet_Add(ItemCount: 1000) 13.92 μs 152.6 ns 13.84 μs +0.6%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 1000) 41.61 μs 1.17 μs 41.84 μs -0.6%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 1000) 16.40 μs 18.0 ns 16.41 μs -0.1%
BTreeSetBenchmark.SortedSet_Add(ItemCount: 100000) 22.70 ms 147.34 μs 22.63 ms +0.3%
BloomFilterBenchmark.HashSet_Add(ItemCount: 100000) 4.81 ms 160.76 μs 4.94 ms -2.6%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 100000) 15.58 ms 51.01 μs 15.57 ms +0.1%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 100000) 1.27 ms 2.28 μs 1.27 ms -0.3%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 1000) 168.89 μs 524.6 ns 167.08 μs +1.1%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 1000) 4.63 ms 80.37 μs 4.20 ms +10.0% ⚠️
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 100000) 31.20 ms 313.52 μs 29.88 ms +4.4%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 100000) 2.08 s 187.06 ms 1.82 s +14.7% ⚠️
EnumSetBenchmark.HashSet_Contains 170.4 ns 0.2 ns 172.8 ns -1.4%
EnumSetBenchmark.EnumSet_Contains 52.1 ns 0.7 ns 51.4 ns +1.4%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 1000) 18.94 μs 143.1 ns 18.94 μs -0.0%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 5.7 ns 5.12 μs -7.5%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 1000) 16.55 μs 31.2 ns 16.51 μs +0.3%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 1000) 14.18 μs 4.3 ns 14.21 μs -0.2%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 100000) 17.21 ms 82.26 μs 17.42 ms -1.2%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.52 ms 2.94 μs 1.48 ms +2.4%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 100000) 13.97 ms 56.88 μs 14.09 ms -0.8%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 100000) 982.01 μs 750.1 ns 982.01 μs +0.0%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.58 μs 7.4 ns 4.56 μs +0.3%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 1000) 3.98 μs 7.9 ns 3.98 μs +0.1%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 2.19 ms 200.87 μs 1.99 ms +10.2%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 100000) 1.67 ms 1.94 μs 1.67 ms -0.0%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 1000) 9.89 μs 32.4 ns 9.96 μs -0.6%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 1000) 5.47 μs 27.7 ns 5.47 μs -0.0%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 100000) 1.36 ms 10.64 μs 1.38 ms -1.4%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 100000) 693.69 μs 52.12 μs 772.32 μs -10.2%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.62 μs 103.0 ns 14.88 μs -8.4%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 1000) 10.31 μs 149.1 ns 11.03 μs -6.5%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 5.10 ms 130.11 μs 5.09 ms +0.2%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 100000) 7.22 ms 409.94 μs 7.20 ms +0.3%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.64 μs 20.5 ns 4.64 μs -0.1%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 1000) 7.64 μs 32.3 ns 7.63 μs +0.2%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.84 μs 4.8 ns 4.73 μs +2.4%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 1000) 1.96 μs 6.1 ns 1.95 μs +0.3%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 1000) 83.12 μs 251.3 ns 82.10 μs +1.2%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 1000) 2.82 μs 11.4 ns 2.89 μs -2.5%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 100000) 562.50 μs 2.03 μs 561.05 μs +0.3%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 100000) 1.86 ms 37.28 μs 1.98 ms -6.3%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.55 ms 54.39 μs 1.61 ms -3.5%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 100000) 215.00 μs 396.2 ns 215.17 μs -0.1%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 100000) 9.15 ms 505.44 μs 8.68 ms +5.5%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 100000) 852.90 μs 4.61 μs 857.10 μs -0.5%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 1000) 59.10 μs 298.2 ns 57.82 μs +2.2%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 1000) 55.28 μs 1.57 μs 58.35 μs -5.3%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 100000) 33.73 ms 123.21 μs 33.98 ms -0.7%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 100000) 26.18 ms 145.73 μs 26.19 ms -0.1%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 1000) 173.3 ns 1.2 ns 176.3 ns -1.7%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 1000) 79.4 ns 0.1 ns 80.0 ns -0.7%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 100000) 9.99 μs 135.1 ns 9.93 μs +0.7%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 100000) 4.94 μs 3.9 ns 4.93 μs +0.2%
EnumSetBenchmark.HashSet_Remove 3.14 μs 490.8 ns 2.67 μs +17.9%
EnumSetBenchmark.EnumSet_Remove 1.09 μs 231.9 ns 1.10 μs -0.9%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 1000) 611.23 μs 12.89 μs 517.68 μs +18.1%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 1000) 48.16 μs 3.83 μs 50.18 μs -4.0%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 80.94 μs 7.14 μs 76.54 μs +5.7%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 1000) 255.36 μs 13.72 μs 253.74 μs +0.6%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 1000) 86.27 μs 5.55 μs 85.71 μs +0.7%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 1000) 109.46 μs 7.10 μs 112.53 μs -2.7%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 100000) 26.62 ms 189.40 μs 26.81 ms -0.7%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 100000) 570.90 μs 18.78 μs 552.94 μs +3.2%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.04 ms 60.94 μs 2.02 ms +0.8%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 100000) 16.33 ms 51.35 μs 16.64 ms -1.9%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 100000) 1.41 ms 9.29 μs 964.42 μs +46.5% ⚠️
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 100000) 2.25 ms 197.35 μs 2.18 ms +2.9%
EnumSetBenchmark.HashSet_Union 443.8 ns 6.8 ns 444.5 ns -0.2%
EnumSetBenchmark.EnumSet_Union 22.9 ns 0.4 ns 23.1 ns -0.7%
EnumMapBenchmark.Dictionary_Add 606.3 ns 11.1 ns 639.1 ns -5.1%
EnumMapBenchmark.EnumMap_Add 151.3 ns 0.7 ns 153.2 ns -1.2%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 1000) 12.68 μs 82.6 ns 14.63 μs -13.4% ✅
HyperLogLogBenchmark.HashSet_Add(ItemCount: 1000) 12.54 μs 356.9 ns 12.84 μs -2.3%
SwissSetBenchmark.HashSet_Add(ItemCount: 1000) 12.85 μs 316.6 ns 12.76 μs +0.7%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 1000) 7.22 μs 55.7 ns 7.30 μs -1.1%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 1000) 27.00 μs 52.6 ns 27.19 μs -0.7%
SwissSetBenchmark.SwissSet_Add(ItemCount: 1000) 26.88 μs 223.4 ns 26.80 μs +0.3%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 100000) 4.71 ms 78.74 μs 4.95 ms -5.0%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 100000) 4.90 ms 49.38 μs 4.83 ms +1.6%
SwissSetBenchmark.HashSet_Add(ItemCount: 100000) 4.75 ms 85.84 μs 4.80 ms -1.0%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 100000) 2.09 ms 7.07 μs 2.09 ms -0.0%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 100000) 575.08 μs 263.5 ns 570.77 μs +0.8%
SwissSetBenchmark.SwissSet_Add(ItemCount: 100000) 4.61 ms 69.01 μs 4.59 ms +0.5%
XorFilterBenchmark.HashSet_Build(ItemCount: 1000) 7.91 μs 27.6 ns 8.12 μs -2.6%
XorFilterBenchmark.XorFilter_Build(ItemCount: 1000) 40.19 μs 1.50 μs 39.35 μs +2.1%
XorFilterBenchmark.HashSet_Build(ItemCount: 100000) 2.05 ms 24.43 μs 2.07 ms -0.8%
XorFilterBenchmark.XorFilter_Build(ItemCount: 100000) 12.65 ms 110.70 μs 12.59 ms +0.4%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.97 μs 249.1 ns 4.72 μs +5.3%
SwissSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.73 μs 57.7 ns 4.75 μs -0.4%
XorFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.75 μs 40.8 ns 4.77 μs -0.5%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 1000) 4.91 μs 3.4 ns 4.92 μs -0.1%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 1000) 2.87 μs 5.9 ns 2.86 μs +0.4%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 1000) 6.78 μs 13.4 ns 6.77 μs +0.1%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.60 ms 4.04 μs 1.61 ms -0.7%
SwissSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.56 ms 4.41 μs 1.56 ms +0.1%
XorFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.55 ms 50.61 μs 1.59 ms -2.2%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 100000) 1.74 ms 7.38 μs 1.75 ms -0.4%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 100000) 634.53 μs 6.81 μs 640.36 μs -0.9%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 100000) 703.48 μs 348.3 ns 703.61 μs -0.0%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 3.5 ns 4.54 μs -0.0%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.45 μs 92.7 ns 4.54 μs -2.1%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 6.5 ns 4.54 μs +0.1%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 1000) 8.44 μs 7.8 ns 8.43 μs +0.0%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 1000) 2.37 μs 6.1 ns 2.37 μs -0.2%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 1000) 6.78 μs 8.1 ns 6.77 μs +0.1%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.93 ms 8.07 μs 1.95 ms -1.3%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.95 ms 5.40 μs 1.95 ms -0.3%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.93 ms 6.13 μs 1.94 ms -0.5%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 100000) 874.56 μs 1.77 μs 875.62 μs -0.1%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 100000) 335.98 μs 1.58 μs 348.46 μs -3.6%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 100000) 704.88 μs 246.7 ns 705.23 μs -0.0%
EnumMapBenchmark.Dictionary_Enumerate 50.4 ns 0.2 ns 50.5 ns -0.3%
EnumMapBenchmark.EnumMap_Enumerate 40.2 ns 0.5 ns 39.8 ns +1.1%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 1000) 0.0 ns 0.0 ns 0.0 ns +206.8%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 1000) 23.45 μs 14.4 ns 23.44 μs +0.0%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 100000) 0.0 ns 0.0 ns 0.0 ns +127.6%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 100000) 22.98 μs 6.8 ns 22.98 μs +0.0%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 8) 166.9 ns 5.6 ns 191.2 ns -12.7% ✅
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 8) 89.9 ns 2.5 ns 95.4 ns -5.8%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 64) 835.8 ns 17.1 ns 911.7 ns -8.3%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 64) 1.13 μs 17.9 ns 1.12 μs +0.7%
EnumMapBenchmark.Dictionary_Lookup 117.7 ns 0.1 ns 117.7 ns -0.0%
EnumMapBenchmark.EnumMap_Lookup 63.6 ns 0.6 ns 63.3 ns +0.5%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 8) 37.1 ns 0.1 ns 36.9 ns +0.5%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 8) 25.9 ns 4.1 ns 27.2 ns -4.7%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 64) 297.5 ns 0.9 ns 305.8 ns -2.7%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 64) 1.14 μs 11.5 ns 1.13 μs +0.7%
EnumMapBenchmark.Dictionary_Remove 3.78 μs 496.3 ns 3.76 μs +0.7%
EnumMapBenchmark.EnumMap_Remove 1.94 μs 330.0 ns 1.97 μs -1.8%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 8) 1.27 μs 74.7 ns 1.39 μs -8.7%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 8) 1.31 μs 266.1 ns 1.40 μs -6.7%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 64) 5.98 μs 700.2 ns 5.76 μs +3.7%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 64) 26.90 μs 3.69 μs 26.18 μs +2.8%
SwissSetBenchmark.HashSet_Remove(ItemCount: 1000) 26.18 μs 1.47 μs 31.17 μs -16.0%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 1000) 71.75 μs 2.63 μs 71.56 μs +0.3%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 1000) 13.14 μs 156.1 ns 13.77 μs -4.6%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 1000) 12.87 μs 36.4 ns 13.21 μs -2.6%
SwissSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.71 ms 14.49 μs 1.76 ms -2.9%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 100000) 1.07 ms 12.50 μs 1.08 ms -1.1%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 100000) 3.77 ms 38.16 μs 3.98 ms -5.2%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 100000) 4.00 ms 22.37 μs 4.03 ms -0.7%
CeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 13.66 μs 103.2 ns 13.90 μs -1.7%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 1000) 10.96 μs 318.5 ns 10.67 μs +2.8%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 1000) 13.38 μs 115.3 ns 13.64 μs -1.9%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 1000) 9.48 μs 87.0 ns 9.49 μs -0.1%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 1000) 10.86 μs 319.6 ns 11.06 μs -1.8%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 1000) 18.06 μs 126.2 ns 18.33 μs -1.5%
CeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 5.20 ms 129.13 μs 5.16 ms +0.7%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 100000) 1.48 ms 11.27 μs 1.52 ms -2.7%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 100000) 4.30 ms 516.95 μs 4.26 ms +1.0%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 100000) 3.18 ms 14.65 μs 3.30 ms -3.6%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 100000) 963.90 μs 2.51 μs 965.72 μs -0.2%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 100000) 6.32 ms 52.54 μs 6.35 ms -0.4%
BitSetBenchmark.BitArray_And(ItemCount: 1024) 59.1 ns 0.5 ns 57.6 ns +2.6%
BitSetBenchmark.BitSet_And(ItemCount: 1024) 1.25 μs 5.0 ns 1.25 μs +0.1%
BitSetBenchmark.BitArray_And(ItemCount: 1000000) 43.14 μs 720.0 ns 43.62 μs -1.1%
BitSetBenchmark.BitSet_And(ItemCount: 1000000) 4.48 ms 4.60 μs 4.48 ms -0.0%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 1000) 167.50 μs 522.7 ns 171.80 μs -2.5%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 1000) 3.37 ms 80.37 μs 3.52 ms -4.3%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 100000) 30.18 ms 245.85 μs 30.05 ms +0.4%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 100000) 1.57 s 51.88 ms 1.60 s -2.1%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 4.76 μs 31.9 ns 4.75 μs +0.4%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 1000) 6.81 μs 71.7 ns 6.85 μs -0.5%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.73 μs 8.0 ns 4.72 μs +0.1%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 1000) 1.96 μs 110.5 ns 1.96 μs +0.1%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 1000) 94.98 μs 599.1 ns 94.88 μs +0.1%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 1000) 2.50 μs 10.8 ns 2.50 μs -0.2%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.61 ms 4.14 μs 1.60 ms +0.4%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 100000) 2.07 ms 40.56 μs 2.05 ms +0.9%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.60 ms 12.46 μs 1.60 ms -0.1%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 100000) 600.64 μs 791.0 ns 599.87 μs +0.1%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 100000) 7.81 ms 199.35 μs 8.01 ms -2.4%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 100000) 753.26 μs 1.48 μs 752.48 μs +0.1%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 6.6 ns 4.54 μs -0.0%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 1000) 2.74 μs 3.6 ns 2.74 μs -0.0%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.94 ms 20.69 μs 1.96 ms -1.1%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 100000) 1.19 ms 1.91 μs 1.19 ms +0.2%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 1000) 4.38 μs 7.2 ns 4.37 μs +0.1%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 1000) 10.07 μs 19.1 ns 10.07 μs -0.0%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 100000) 488.81 μs 1.11 μs 496.06 μs -1.5%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 100000) 1.97 ms 2.43 μs 2.05 ms -3.9%
LruCacheBenchmark.Dictionary_Get(ItemCount: 1000) 24.91 μs 33.1 ns 25.13 μs -0.9%
LruCacheBenchmark.LruCache_Get(ItemCount: 1000) 6.79 μs 43.0 ns 6.88 μs -1.4%
LruCacheBenchmark.Dictionary_Get(ItemCount: 100000) 25.32 μs 27.6 ns 25.11 μs +0.8%
LruCacheBenchmark.LruCache_Get(ItemCount: 100000) 6.87 μs 61.3 ns 7.11 μs -3.3%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 1000) 5.11 μs 257.9 ns 4.80 μs +6.4%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 1000) 3.59 μs 5.4 ns 3.59 μs +0.0%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 100000) 520.87 μs 1.54 μs 520.06 μs +0.2%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 100000) 1.34 ms 515.4 ns 1.34 ms +0.1%
BitSetBenchmark.BitArray_Or(ItemCount: 1024) 59.1 ns 0.4 ns 59.8 ns -1.2%
BitSetBenchmark.BitSet_Or(ItemCount: 1024) 1.25 μs 6.9 ns 1.25 μs -0.4%
BitSetBenchmark.BitArray_Or(ItemCount: 1000000) 43.22 μs 639.5 ns 43.34 μs -0.3%
BitSetBenchmark.BitSet_Or(ItemCount: 1000000) 4.48 ms 3.78 μs 4.48 ms -0.0%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1024) 1.24 μs 4.2 ns 1.24 μs +0.1%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1024) 7.0 ns 0.0 ns 7.1 ns -0.2%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1000000) 4.83 ms 5.08 μs 4.82 ms +0.0%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1000000) 4.93 μs 4.0 ns 4.94 μs -0.1%
LruCacheBenchmark.Dictionary_Put(ItemCount: 1000) 108.70 μs 6.75 μs 110.86 μs -1.9%
LruCacheBenchmark.LruCache_Put(ItemCount: 1000) 478.35 μs 19.03 μs 474.37 μs +0.8%
LruCacheBenchmark.Dictionary_Put(ItemCount: 100000) 6.39 ms 920.90 μs 8.30 ms -23.0% ✅
LruCacheBenchmark.LruCache_Put(ItemCount: 100000) 5.78 ms 22.83 μs 5.80 ms -0.3%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 31.64 μs 3.94 μs 29.01 μs +9.1%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 1000) 116.59 μs 4.46 μs 119.77 μs -2.7%
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 1000) 26.58 μs 1.04 μs 35.58 μs -25.3% ✅
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 1000) 109.52 μs 7.20 μs 114.32 μs -4.2%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.76 ms 20.93 μs 1.74 ms +1.5%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 100000) 1.40 ms 20.29 μs 1.35 ms +3.9%
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.74 ms 28.85 μs 1.75 ms -0.8%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 100000) 1.44 ms 63.91 μs 1.63 ms -11.2%
BitSetBenchmark.BitArray_Xor(ItemCount: 1024) 58.4 ns 0.8 ns 57.9 ns +0.9%
BitSetBenchmark.BitSet_Xor(ItemCount: 1024) 1.25 μs 3.3 ns 1.25 μs +0.1%
BitSetBenchmark.BitArray_Xor(ItemCount: 1000000) 43.32 μs 586.8 ns 43.50 μs -0.4%
BitSetBenchmark.BitSet_Xor(ItemCount: 1000000) 4.48 ms 2.76 μs 4.48 ms -0.0%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 1000) 14.25 μs 237.4 ns 13.46 μs +5.9%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 13.43 μs 278.0 ns 13.88 μs -3.3%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 1000) 14.03 μs 48.5 ns n/a 🆕 new
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 1000) 11.80 μs 101.8 ns 11.63 μs +1.5%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 1000) 8.80 μs 45.4 ns 9.65 μs -8.8%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 1000) 80.11 μs 97.0 ns n/a 🆕 new
HashCachingSetBenchmark.HashSet_Add(ItemCount: 100000) 5.19 ms 126.61 μs 5.19 ms -0.0%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 5.12 ms 79.72 μs 5.10 ms +0.4%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 100000) 3.37 ms 109.77 μs n/a 🆕 new
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 100000) 5.79 ms 60.92 μs 5.73 ms +1.2%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 100000) 3.18 ms 10.77 μs 3.17 ms +0.4%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 100000) 15.10 ms 50.86 μs n/a 🆕 new
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.76 μs 5.8 ns 4.74 μs +0.4%
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 4.72 μs 6.4 ns 4.72 μs +0.0%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 1000) 2.73 μs 21.6 ns 2.64 μs +3.1%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 1000) 2.05 μs 56.7 ns 2.05 μs +0.0%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.53 ms 7.35 μs 1.51 ms +1.2%
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.50 ms 7.81 μs 1.44 ms +4.3%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 100000) 731.42 μs 7.08 μs 740.05 μs -1.2%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 100000) 510.86 μs 22.50 μs 514.17 μs -0.6%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.56 μs 4.5 ns 4.56 μs +0.0%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 1000) 3.29 μs 11.3 ns 2.79 μs +18.0% ⚠️
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 2.00 ms 2.17 μs 2.05 ms -2.5%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 100000) 1.25 ms 1.06 μs 1.26 ms -0.5%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 1000) 1.66 μs 1.3 ns 1.66 μs +0.2%
DequeBenchmark.Deque_Enumerate(ItemCount: 1000) 1.06 μs 1.2 ns 1.06 μs -0.1%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 100000) 152.34 μs 79.4 ns 152.26 μs +0.0%
DequeBenchmark.Deque_Enumerate(ItemCount: 100000) 105.66 μs 75.7 ns 105.70 μs -0.0%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 15.39 μs 183.6 ns 13.94 μs +10.4% ⚠️
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.23 μs 304.9 ns 14.30 μs -0.5%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 1000) 9.86 μs 205.1 ns 9.22 μs +6.9%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 1000) 8.37 μs 26.2 ns 8.18 μs +2.3%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.47 ms 69.97 μs 4.41 ms +1.3%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 5.33 ms 99.35 μs 5.26 ms +1.3%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 100000) 5.42 ms 63.09 μs 5.30 ms +2.3%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 100000) 3.31 ms 8.35 μs 3.23 ms +2.4%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.72 μs 116.3 ns 4.73 μs -0.2%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.83 μs 3.0 ns 4.87 μs -0.8%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 2.58 μs 172.0 ns 2.15 μs +20.0% ⚠️
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 1000) 2.48 μs 23.4 ns 12.42 μs -80.0% ✅
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.60 ms 9.00 μs 1.60 ms +0.2%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.56 ms 50.89 μs 1.60 ms -2.5%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 727.21 μs 2.43 μs 693.17 μs +4.9%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 100000) 805.84 μs 16.24 μs 659.70 μs +22.2% ⚠️
DequeBenchmark.LinkedList_PushFront(ItemCount: 1000) 38.26 μs 5.70 μs 40.69 μs -6.0%
DequeBenchmark.Deque_PushFront(ItemCount: 1000) 19.02 μs 1.36 μs 19.22 μs -1.0%
DequeBenchmark.LinkedList_PushFront(ItemCount: 100000) 1.81 ms 28.47 μs 1.81 ms +0.0%
DequeBenchmark.Deque_PushFront(ItemCount: 100000) 723.63 μs 42.33 μs 808.12 μs -10.5%
DequeBenchmark.LinkedList_Queue(ItemCount: 1000) 57.15 μs 3.13 μs 49.77 μs +14.8% ⚠️
DequeBenchmark.Deque_Queue(ItemCount: 1000) 31.98 μs 4.02 μs 29.96 μs +6.7%
DequeBenchmark.LinkedList_Queue(ItemCount: 100000) 4.99 ms 179.21 μs 4.94 ms +1.1%
DequeBenchmark.Deque_Queue(ItemCount: 100000) 458.83 μs 13.21 μs 456.00 μs +0.6%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 79.79 μs 3.60 μs 78.62 μs +1.5%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 81.78 μs 5.74 μs 82.56 μs -0.9%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 27.73 μs 2.76 μs 32.80 μs -15.5%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 1000) 128.62 μs 3.75 μs 154.40 μs -16.7% ✅
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 1000) 125.67 μs 8.37 μs 155.96 μs -19.4% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 1000) 119.55 μs 4.86 μs 152.75 μs -21.7% ✅
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 1000) 29.85 μs 3.37 μs 28.91 μs +3.3%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 1000) 115.76 μs 11.02 μs 108.98 μs +6.2%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.00 ms 21.70 μs 2.03 ms -1.5%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.37 ms 206.00 μs 2.09 ms +13.4%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.70 ms 15.60 μs 1.69 ms +0.4%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 100000) 1.73 ms 44.79 μs 1.68 ms +3.0%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 100000) 1.75 ms 62.27 μs 1.95 ms -10.5% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 100000) 1.39 ms 68.41 μs 1.37 ms +1.6%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.73 ms 23.58 μs 1.74 ms -0.3%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 100000) 1.92 ms 251.18 μs 1.85 ms +3.7%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 1000) 33.3 ns 0.3 ns n/a 🆕 new
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 1000) 1.24 μs 13.5 ns n/a 🆕 new
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 100000) 32.8 ns 0.5 ns n/a 🆕 new
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 100000) 1.17 μs 14.5 ns n/a 🆕 new
IntSetBenchmark.HashSet_Add(ItemCount: 1000) 14.06 μs 127.4 ns 14.83 μs -5.2%
SparseSetBenchmark.HashSet_Add(ItemCount: 1000) 7.35 μs 175.5 ns 7.76 μs -5.4%
IntSetBenchmark.IntSet_Add(ItemCount: 1000) 9.08 μs 77.1 ns 9.34 μs -2.8%
SparseSetBenchmark.SparseSet_Add(ItemCount: 1000) 6.47 μs 52.2 ns 6.47 μs -0.0%
IntSetBenchmark.HashSet_Add(ItemCount: 100000) 5.11 ms 115.43 μs 5.11 ms +0.1%
SparseSetBenchmark.HashSet_Add(ItemCount: 100000) 1.76 ms 28.73 μs 1.74 ms +1.3%
IntSetBenchmark.IntSet_Add(ItemCount: 100000) 3.26 ms 56.16 μs 3.37 ms -3.2%
SparseSetBenchmark.SparseSet_Add(ItemCount: 100000) 1.50 ms 65.54 μs 1.50 ms +0.4%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 1000) 6.07 μs 100.6 ns 5.97 μs +1.7%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 1000) 4.58 μs 39.4 ns 5.83 μs -21.4% ✅
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 100000) 1.37 ms 3.49 μs 1.38 ms -0.4%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 100000) 628.90 μs 24.78 μs 653.27 μs -3.7%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 1000) 19.10 μs 85.1 ns 19.49 μs -2.0%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 1000) 17.68 μs 233.4 ns 17.31 μs +2.1%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 100000) 4.57 ms 146.82 μs 4.50 ms +1.4%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 100000) 3.20 ms 31.05 μs 3.32 ms -3.7%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 1000) 9.44 μs 264.2 ns 9.41 μs +0.3%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 1000) 12.35 μs 128.8 ns 12.11 μs +2.0%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 100000) 258.55 μs 1.45 μs 261.31 μs -1.1%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 100000) 350.29 μs 2.14 μs 347.66 μs +0.8%
IntSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.93 μs 167.4 ns 4.75 μs +3.8%
SparseSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.65 μs 5.7 ns 4.66 μs -0.2%
IntSetBenchmark.IntSet_Contains(ItemCount: 1000) 1.81 μs 15.0 ns 1.83 μs -0.9%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 1000) 1.28 μs 2.6 ns 1.29 μs -0.4%
IntSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.56 ms 2.97 μs 1.55 ms +1.2%
SparseSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.37 ms 12.16 μs 1.37 ms +0.0%
IntSetBenchmark.IntSet_Contains(ItemCount: 100000) 577.26 μs 1.65 μs 579.13 μs -0.3%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 100000) 259.05 μs 953.7 ns 258.72 μs +0.1%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 1000) 145.90 μs 1.24 μs 145.51 μs +0.3%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 1000) 264.86 μs 1.45 μs 262.96 μs +0.7%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 100000) 33.25 ms 422.05 μs 33.56 ms -0.9%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 100000) 57.92 ms 610.70 μs 57.61 ms +0.5%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 1000) 4.93 μs 77.4 ns 5.10 μs -3.3%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 1000) 30.24 μs 117.2 ns 30.31 μs -0.2%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 100000) 1.09 ms 15.80 μs 1.10 ms -1.1%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 100000) 6.57 ms 198.76 μs 6.48 ms +1.4%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 16.19 μs 300.7 ns 16.40 μs -1.3%
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 15.55 μs 320.1 ns 14.78 μs +5.2%
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 1000) 12.34 μs 331.9 ns 12.34 μs -0.0%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 1000) 19.55 μs 306.4 ns 18.98 μs +3.0%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.32 ms 58.21 μs 4.32 ms +0.0%
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.94 ms 93.52 μs 4.84 ms +2.0%
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 100000) 5.04 ms 59.76 μs 5.05 ms -0.1%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 100000) 8.73 ms 95.55 μs 8.37 ms +4.3%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.79 μs 61.0 ns 4.74 μs +1.2%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.85 μs 149.4 ns 4.76 μs +2.1%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 1000) 2.15 μs 11.5 ns 2.14 μs +0.6%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 1000) 3.12 μs 264.0 ns 2.88 μs +8.2%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.62 ms 7.03 μs 1.62 ms -0.1%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.63 ms 4.90 μs 1.63 ms +0.2%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 100000) 705.71 μs 28.19 μs 679.53 μs +3.9%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 100000) 861.25 μs 3.33 μs 858.86 μs +0.3%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 83.67 μs 10.18 μs 86.03 μs -2.7%
IntSetBenchmark.HashSet_Remove(ItemCount: 1000) 26.67 μs 1.19 μs 30.16 μs -11.6%
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 83.93 μs 7.48 μs 85.13 μs -1.4%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 1000) 94.32 μs 7.87 μs 89.53 μs +5.4%
IntSetBenchmark.IntSet_Remove(ItemCount: 1000) 87.92 μs 5.84 μs 82.99 μs +5.9%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 1000) 117.43 μs 8.09 μs 112.50 μs +4.4%
SparseSetBenchmark.HashSet_Remove(ItemCount: 1000) 25.12 μs 1.71 μs 29.45 μs -14.7%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 1000) 25.61 μs 3.40 μs 26.67 μs -4.0%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.23 ms 179.47 μs 2.19 ms +1.5%
IntSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.73 ms 16.86 μs 1.79 ms -3.8%
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.16 ms 74.07 μs 2.14 ms +0.9%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 100000) 1.89 ms 319.36 μs 1.91 ms -1.1%
IntSetBenchmark.IntSet_Remove(ItemCount: 100000) 1.31 ms 46.06 μs 1.38 ms -5.3%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 100000) 2.35 ms 405.78 μs 2.25 ms +4.6%
SparseSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.52 ms 17.77 μs 1.51 ms +0.9%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 100000) 813.24 μs 28.96 μs 813.65 μs -0.1%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 1000) 102.89 μs 1.42 μs 107.06 μs -3.9%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 1000) 27.81 μs 130.5 ns 28.08 μs -1.0%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 100000) 51.66 ms 1.15 ms 55.33 ms -6.6%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 100000) 8.58 ms 65.66 μs 8.89 ms -3.5%
Hashers (111)
Benchmark This PR StdDev main Δ
StringHasherBenchmark.Bcl_GetHashCode(Shape: ShortAscii) 15.39 μs 19.4 ns 15.39 μs +0.1%
StringHasherBenchmark.EqualityComparer_Default(Shape: ShortAscii) 15.40 μs 40.6 ns 15.39 μs +0.0%
StringHasherBenchmark.Djb2(Shape: ShortAscii) 22.05 μs 28.1 ns 22.06 μs -0.0%
StringHasherBenchmark.Djb2A(Shape: ShortAscii) 22.04 μs 36.5 ns 22.03 μs +0.0%
StringHasherBenchmark.Sdbm(Shape: ShortAscii) 32.85 μs 25.5 ns 32.87 μs -0.1%
StringHasherBenchmark.Elf(Shape: ShortAscii) 43.95 μs 170.2 ns 43.93 μs +0.0%
StringHasherBenchmark.Crc32(Shape: ShortAscii) 49.97 μs 131.6 ns 49.91 μs +0.1%
StringHasherBenchmark.Adler32(Shape: ShortAscii) 96.26 μs 70.1 ns 96.30 μs -0.0%
StringHasherBenchmark.FnV1(Shape: ShortAscii) 25.36 μs 26.4 ns 25.34 μs +0.1%
StringHasherBenchmark.FnV1_64(Shape: ShortAscii) 25.18 μs 46.8 ns 25.16 μs +0.1%
StringHasherBenchmark.FnV1A(Shape: ShortAscii) 10.66 μs 38.4 ns 10.68 μs -0.2%
StringHasherBenchmark.FnV1A_Full(Shape: ShortAscii) 22.85 μs 24.8 ns 22.86 μs -0.0%
StringHasherBenchmark.FnV1A_64(Shape: ShortAscii) 26.33 μs 33.3 ns 26.36 μs -0.1%
StringHasherBenchmark.JenkinsOaat(Shape: ShortAscii) 39.28 μs 37.6 ns 39.30 μs -0.0%
StringHasherBenchmark.Murmur2(Shape: ShortAscii) 15.20 μs 40.1 ns 15.19 μs +0.1%
StringHasherBenchmark.Murmur3(Shape: ShortAscii) 17.31 μs 21.4 ns 17.35 μs -0.2%
StringHasherBenchmark.XxHash32(Shape: ShortAscii) 16.92 μs 10.7 ns 16.92 μs -0.0%
StringHasherBenchmark.XxHash64(Shape: ShortAscii) 18.12 μs 21.2 ns 18.13 μs -0.0%
StringHasherBenchmark.XxHash3(Shape: ShortAscii) 15.02 μs 44.9 ns 14.88 μs +0.9%
StringHasherBenchmark.CityHash64(Shape: ShortAscii) 15.23 μs 5.5 ns 15.24 μs -0.1%
StringHasherBenchmark.MetroHash64(Shape: ShortAscii) 15.06 μs 15.5 ns 15.06 μs -0.0%
StringHasherBenchmark.SipHash13(Shape: ShortAscii) 27.69 μs 16.5 ns 27.71 μs -0.0%
StringHasherBenchmark.SipHash24(Shape: ShortAscii) 38.50 μs 25.6 ns 38.50 μs -0.0%
StringHasherBenchmark.HalfSipHash24(Shape: ShortAscii) 50.00 μs 40.4 ns 50.02 μs -0.0%
StringHasherBenchmark.HighwayHash64(Shape: ShortAscii) 478.24 μs 1.65 μs 476.41 μs +0.4%
StringHasherBenchmark.XxHash64_Hash64(Shape: ShortAscii) 17.12 μs 10.6 ns 17.13 μs -0.1%
StringHasherBenchmark.SipHash24_Hash64(Shape: ShortAscii) 37.77 μs 24.5 ns 37.77 μs +0.0%
StringHasherBenchmark.Bcl_GetHashCode(Shape: LongAscii) 96.91 μs 51.8 ns 97.01 μs -0.1%
StringHasherBenchmark.EqualityComparer_Default(Shape: LongAscii) 96.73 μs 113.1 ns 96.61 μs +0.1%
StringHasherBenchmark.Djb2(Shape: LongAscii) 229.38 μs 87.0 ns 229.42 μs -0.0%
StringHasherBenchmark.Djb2A(Shape: LongAscii) 229.38 μs 82.8 ns 229.40 μs -0.0%
StringHasherBenchmark.Sdbm(Shape: LongAscii) 308.11 μs 127.5 ns 308.21 μs -0.0%
StringHasherBenchmark.Elf(Shape: LongAscii) 578.19 μs 262.1 ns 582.55 μs -0.7%
StringHasherBenchmark.Crc32(Shape: LongAscii) 589.60 μs 188.0 ns 589.79 μs -0.0%
StringHasherBenchmark.Adler32(Shape: LongAscii) 789.27 μs 233.1 ns 789.55 μs -0.0%
StringHasherBenchmark.FnV1(Shape: LongAscii) 289.69 μs 115.7 ns 289.74 μs -0.0%
StringHasherBenchmark.FnV1_64(Shape: LongAscii) 282.85 μs 133.8 ns 283.08 μs -0.1%
StringHasherBenchmark.FnV1A(Shape: LongAscii) 122.32 μs 46.2 ns 122.48 μs -0.1%
StringHasherBenchmark.FnV1A_Full(Shape: LongAscii) 281.76 μs 160.8 ns 281.81 μs -0.0%
StringHasherBenchmark.FnV1A_64(Shape: LongAscii) 286.40 μs 74.5 ns 286.46 μs -0.0%
StringHasherBenchmark.JenkinsOaat(Shape: LongAscii) 378.69 μs 233.1 ns 378.64 μs +0.0%
StringHasherBenchmark.Murmur2(Shape: LongAscii) 102.00 μs 127.8 ns 100.98 μs +1.0%
StringHasherBenchmark.Murmur3(Shape: LongAscii) 113.10 μs 116.0 ns 113.09 μs +0.0%
StringHasherBenchmark.XxHash32(Shape: LongAscii) 73.33 μs 131.5 ns 73.28 μs +0.1%
StringHasherBenchmark.XxHash64(Shape: LongAscii) 91.21 μs 1.17 μs 90.92 μs +0.3%
StringHasherBenchmark.XxHash3(Shape: LongAscii) 70.01 μs 162.6 ns 70.32 μs -0.4%
StringHasherBenchmark.CityHash64(Shape: LongAscii) 122.02 μs 878.7 ns 123.78 μs -1.4%
StringHasherBenchmark.MetroHash64(Shape: LongAscii) 74.63 μs 425.0 ns 77.67 μs -3.9%
StringHasherBenchmark.SipHash13(Shape: LongAscii) 114.91 μs 286.8 ns 115.20 μs -0.3%
StringHasherBenchmark.SipHash24(Shape: LongAscii) 161.17 μs 703.3 ns 160.74 μs +0.3%
StringHasherBenchmark.HalfSipHash24(Shape: LongAscii) 247.73 μs 219.4 ns 247.66 μs +0.0%
StringHasherBenchmark.HighwayHash64(Shape: LongAscii) 824.49 μs 7.62 μs 822.97 μs +0.2%
StringHasherBenchmark.XxHash64_Hash64(Shape: LongAscii) 89.37 μs 1.27 μs 89.99 μs -0.7%
StringHasherBenchmark.SipHash24_Hash64(Shape: LongAscii) 161.59 μs 864.7 ns 161.24 μs +0.2%
StringHasherBenchmark.Bcl_GetHashCode(Shape: NonAscii) 22.90 μs 23.5 ns 22.89 μs +0.1%
StringHasherBenchmark.EqualityComparer_Default(Shape: NonAscii) 22.85 μs 17.0 ns 22.85 μs -0.0%
StringHasherBenchmark.Djb2(Shape: NonAscii) 43.41 μs 38.3 ns 43.46 μs -0.1%
StringHasherBenchmark.Djb2A(Shape: NonAscii) 43.43 μs 39.5 ns 43.43 μs +0.0%
StringHasherBenchmark.Sdbm(Shape: NonAscii) 61.62 μs 41.2 ns 61.59 μs +0.0%
StringHasherBenchmark.Elf(Shape: NonAscii) 99.63 μs 122.4 ns 99.68 μs -0.0%
StringHasherBenchmark.Crc32(Shape: NonAscii) 102.68 μs 87.4 ns 102.65 μs +0.0%
StringHasherBenchmark.Adler32(Shape: NonAscii) 175.43 μs 103.2 ns 175.53 μs -0.1%
StringHasherBenchmark.FnV1(Shape: NonAscii) 47.67 μs 37.2 ns 47.67 μs +0.0%
StringHasherBenchmark.FnV1_64(Shape: NonAscii) 49.72 μs 45.6 ns 49.73 μs -0.0%
StringHasherBenchmark.FnV1A(Shape: NonAscii) 21.71 μs 74.0 ns 21.74 μs -0.1%
StringHasherBenchmark.FnV1A_Full(Shape: NonAscii) 45.07 μs 51.1 ns 45.10 μs -0.1%
StringHasherBenchmark.FnV1A_64(Shape: NonAscii) 49.45 μs 56.3 ns 49.42 μs +0.1%
StringHasherBenchmark.JenkinsOaat(Shape: NonAscii) 73.16 μs 46.2 ns 73.16 μs -0.0%
StringHasherBenchmark.Murmur2(Shape: NonAscii) 27.28 μs 132.5 ns 27.30 μs -0.1%
StringHasherBenchmark.Murmur3(Shape: NonAscii) 31.89 μs 80.4 ns 31.91 μs -0.1%
StringHasherBenchmark.XxHash32(Shape: NonAscii) 23.93 μs 10.5 ns 23.92 μs +0.0%
StringHasherBenchmark.XxHash64(Shape: NonAscii) 29.25 μs 47.8 ns 29.24 μs +0.1%
StringHasherBenchmark.XxHash3(Shape: NonAscii) 22.86 μs 49.9 ns 22.89 μs -0.2%
StringHasherBenchmark.CityHash64(Shape: NonAscii) 22.04 μs 33.2 ns 22.03 μs +0.0%
StringHasherBenchmark.MetroHash64(Shape: NonAscii) 25.64 μs 23.9 ns 25.64 μs +0.0%
StringHasherBenchmark.SipHash13(Shape: NonAscii) 36.42 μs 98.1 ns 36.42 μs +0.0%
StringHasherBenchmark.SipHash24(Shape: NonAscii) 51.41 μs 609.0 ns 51.51 μs -0.2%
StringHasherBenchmark.HalfSipHash24(Shape: NonAscii) 72.62 μs 717.1 ns 73.31 μs -0.9%
StringHasherBenchmark.HighwayHash64(Shape: NonAscii) 504.80 μs 946.2 ns 504.08 μs +0.1%
StringHasherBenchmark.XxHash64_Hash64(Shape: NonAscii) 28.28 μs 23.1 ns 28.27 μs +0.0%
StringHasherBenchmark.SipHash24_Hash64(Shape: NonAscii) 49.86 μs 46.9 ns 49.85 μs +0.0%
IntegerHasherBenchmark.Guid_Bcl 1.27 μs 2.2 ns 1.26 μs +0.5%
IntegerHasherBenchmark.Guid_EqualityComparer 3.48 μs 2.1 ns 3.47 μs +0.0%
IntegerHasherBenchmark.Guid_Celerity 8.52 μs 15.3 ns 8.52 μs +0.0%
IntegerHasherBenchmark.Guid_Celerity_Hash64 8.02 μs 6.5 ns 8.04 μs -0.3%
IntegerHasherBenchmark.Int32_Bcl 692.0 ns 7.1 ns 688.8 ns +0.5%
IntegerHasherBenchmark.Int32_EqualityComparer 707.6 ns 4.1 ns 705.9 ns +0.2%
IntegerHasherBenchmark.Int32_Identity 694.5 ns 7.7 ns 687.3 ns +1.0%
IntegerHasherBenchmark.Int32_WangNaive 1.25 μs 1.2 ns 1.25 μs +0.0%
IntegerHasherBenchmark.Int32_Wang 3.03 μs 4.8 ns 3.03 μs +0.1%
IntegerHasherBenchmark.Int32_Murmur3 2.65 μs 2.0 ns 2.65 μs +0.0%
IntegerHasherBenchmark.Int64_Bcl 1.27 μs 1.5 ns 1.27 μs +0.0%
IntegerHasherBenchmark.Int64_EqualityComparer 1.25 μs 1.2 ns 1.25 μs +0.1%
IntegerHasherBenchmark.Int64_Identity 690.8 ns 4.3 ns 690.2 ns +0.1%
IntegerHasherBenchmark.Int64_WangNaive 1.87 μs 0.9 ns 1.87 μs -0.0%
IntegerHasherBenchmark.Int64_Wang 4.17 μs 18.4 ns 4.16 μs +0.3%
IntegerHasherBenchmark.Int64_Murmur3 2.37 μs 4.1 ns 2.37 μs +0.1%
IntegerHasherBenchmark.Int64_Wang_Hash64 4.16 μs 5.0 ns 4.16 μs +0.1%
IntegerHasherBenchmark.Int64_Murmur3_Hash64 2.37 μs 3.8 ns 2.37 μs +0.1%
IntegerHasherBenchmark.UInt32_Bcl 693.1 ns 6.0 ns 673.9 ns +2.8%
IntegerHasherBenchmark.UInt32_EqualityComparer 711.4 ns 1.5 ns 702.1 ns +1.3%
IntegerHasherBenchmark.UInt32_Default 1.25 μs 1.1 ns 1.25 μs -0.0%
IntegerHasherBenchmark.UInt32_Wang 3.02 μs 5.7 ns 3.03 μs -0.2%
IntegerHasherBenchmark.UInt32_Murmur3 2.65 μs 1.0 ns 2.65 μs +0.0%
IntegerHasherBenchmark.UInt64_Bcl 1.27 μs 1.0 ns 1.37 μs -7.6%
IntegerHasherBenchmark.UInt64_EqualityComparer 1.25 μs 1.3 ns 1.25 μs +0.0%
IntegerHasherBenchmark.UInt64_Default 2.37 μs 1.2 ns 2.37 μs -0.1%
IntegerHasherBenchmark.UInt64_Wang 4.16 μs 4.4 ns 4.16 μs -0.0%
IntegerHasherBenchmark.UInt64_WangNaive 1.87 μs 0.8 ns 1.87 μs -0.0%
IntegerHasherBenchmark.UInt64_Default_Hash64 2.37 μs 2.4 ns 2.37 μs -0.0%
IntegerHasherBenchmark.UInt64_Wang_Hash64 4.16 μs 7.0 ns 4.16 μs +0.1%

Same-runner A/B (sharded 8-way): main (b961162) and this PR were built and benchmarked back-to-back on the same runner per shard, so hardware variance cancels out. ⚠️ = PR mean ≥ +10% slower than main and beyond combined std-dev; ✅ = correspondingly faster.

Copilot AI review requested due to automatic review settings July 26, 2026 12:13

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 23 out of 23 changed files in this pull request and generated no new comments.

@marius-bughiu
marius-bughiu merged commit b961162 into main Jul 26, 2026
16 checks passed
@marius-bughiu
marius-bughiu deleted the perf/issue-308-empty-slot-devirt branch July 26, 2026 12:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Remove one virtual call per probe iteration: the empty-slot check is a callvirt for reference-type keys

2 participants