Skip to content

feat(collections): span-keyed lookups on the string-keyed collections + StringInternTable - #323

Merged
marius-bughiu merged 3 commits into
mainfrom
feat/issue-311-span-keyed-lookups
Jul 29, 2026
Merged

feat(collections): span-keyed lookups on the string-keyed collections + StringInternTable#323
marius-bughiu merged 3 commits into
mainfrom
feat/issue-311-span-keyed-lookups

Conversation

@marius-bughiu

Copy link
Copy Markdown
Owner

Implements #311 — the span-keyed lookup lane — end to end, including the full parity rollout.

The problem

grep -rn "ReadOnlySpan<char>" src/Celerity/Collections returned zero hits before this PR. A tokenizer, CSV/log reader, or route dispatcher holding a slice of its input buffer had to call new string(span) to probe any Celerity string-keyed type — one allocation plus a copy per lookup, on the hot path of exactly the workloads 23 string hashers, a perfect-hash FrozenCelerityDictionary, and a Trie exist to serve. .NET 9 closed that gap for the BCL Dictionary with GetAlternateLookup<ReadOnlySpan<char>>; net8.0 is this library's floor, so it had no answer at all.

What changed

1. ISpanHashProvider (Celerity.Hashing)

public interface ISpanHashProvider { int Hash(ReadOnlySpan<char> key); }

A sibling interface, not an overload on IHashProvider<T>: that interface is generic in its key type, and a ref struct could not be a generic type argument before allows ref struct (C# 13 / .NET 9). Expressing the span overload as a non-generic sibling sidesteps that entirely — the span is a method parameter, not a type argument. Same shape as the existing IHashProvider64<T> sibling.

All 23 built-in String*Hasher types implement it. Each now has exactly one body: Hash(string) null-checks and delegates to the span overload (or, for the 64-bit hashers, both public entry points route through a shared private Hash64Core(ReadOnlySpan<char>)), so the two overloads cannot drift apart.

2. Span lookups on the string-keyed collections

Type Added
FrozenCelerityDictionary<TValue, THasher> TryGetValue(ReadOnlySpan<char>, out TValue?), ContainsKey(ReadOnlySpan<char>)
FrozenCeleritySet<THasher> Contains(ReadOnlySpan<char>)
CelerityDictionary<string, TValue, THasher> TryGetValue(ReadOnlySpan<char>, out TValue?), ContainsKey(ReadOnlySpan<char>)
CeleritySet<string, THasher> Contains(ReadOnlySpan<char>)
Trie<TValue> TryGetValue(...), ContainsKey(...), ContainsPrefix(...)

On the four hashed types these are extension methods (SpanLookupExtensions). Adding ISpanHashProvider to a shipped class's THasher constraint would break every existing instantiation, so the extra constraint lives on the methods instead: they bind only when the hasher supplies both interfaces, resolve statically (no boxing — the JIT still devirtualizes through the struct type parameter), and read like instance methods at the call site. The probes themselves are internal generic methods on each collection, mirroring the existing string probe exactly (including the frozen types' perfect and linear-probing-fallback shapes with the same Mix/seed). Trie takes no hasher, so its overloads are ordinary instance methods and its FindNode was generalized to a span so both surfaces share one descent.

An empty span means "" (an ordinary key), never the out-of-band null key — a span has no null state. Pinned by tests.

3. StringInternTable / StringInternTable<THasher>

GetOrAdd(ReadOnlySpan<char>) returns the one canonical string for those characters and allocates only on a miss. A 10M-cell parse over 100 distinct tokens creates 100 strings, not 10,000,000.

This is the one collection you cannot build on the pre-.NET-9 BCL: HashSet<string>.TryGetValue takes a string, so you must allocate the string before you can discover you already had it. string.Intern is not a substitute — process-wide, never collected, and still needs a string.

Defaults to StringFnV1AFullHasher rather than the frozen family's low-byte StringFnV1AHasher, because an intern table's inputs are arbitrary parsed text rather than curated identifiers; documented, and a collision is never a correctness problem (the ordinal span compare resolves it).

Parity rollout

Facet Files
(a) Dedicated tests StringInternTableTests.cs, StringInternTableDifferentialTests.cs (seeded differential vs a Dictionary<string,string> oracle, both a weak and a strong hasher)
(b) Cross-collection tests SpanLookupTests.cs — one block per type, each asserting the span result against that type's own string overload rather than a hard-coded expectation. SpanHashParityTests.cs — roster test + a per-hasher Hash(s) == Hash(s.AsSpan()) assertion over every length class, checked as a whole string, as a slice of a padded string, and as a slice of a caller-owned char[]
(c) Benchmarks StringInternTableBenchmark.cs ([MemoryDiagnoser], [Params(1000, 100_000)] ItemCount, Dedupe + Lookup categories, HashSet<string> baseline) registered in Program.cs's CoreBenchmarks; new SpanLookup category on FrozenCelerityDictionaryBenchmark and TrieBenchmark
(d) Dashboard web/index.html ship card; COLLECTIONS entries in web/dev/bench/index.html and detail.html, plus SpanLookup added to the Trie and FrozenCelerityDictionary ops
(e) Docs docs/api/hashing.mdISpanHashProvider section; docs/api/collections.mdSpan-keyed lookups + StringInternTable sections, Trie method table rows, and pointers from the four hashed types' sections; README.md → collections list, "Choosing a collection" (two new rows), "Choosing a hasher" note, "API at a glance"
(f) CHANGELOG A bullet per facet under [Unreleased] → Added
(g) ROADMAP 2.4.0 span-keyed-lookups entry flipped to done with the design rationale
Extra Celerity.Fuzz StringInternTable target; Celerity.AotSmokeTest block exercising every new span instantiation, the hasher parity contract, and the intern table (incl. a second closed generic so the ILC generates more than one)

Deliberately out of scope, per the issue's own scoping paragraph: the optional ReadOnlySpan<byte> UTF-8 axis and the #if NET9_0_OR_GREATER IAlternateEqualityComparer plumbing. Neither is needed for the workload win, and each would widen a brand-new public abstraction before it is load-bearing. Noted in ROADMAP.md so it is a recorded decision, not drift.

Test plan

  • dotnet build clean across the full net8.0;net9.0;net10.0 matrix — no new warnings (GenerateDocumentationFile is on and CS1591 is an error, so every new public member is documented)
  • dotnet test5009 passed, 0 failed on net8.0 and on net10.0; 116 of those are new
  • Coverage measured locally with coverage.runsettings + scripts/coverage_report.py: identical to the pre-change baseline on the same machine (99.98% line / 99.82% branch vs 99.98% / 99.81%). The residual local shortfall is pre-existing and lives entirely in BitSet, Hash64Source, SimdReductions and the frozen types' unreachable 2^30 ceiling breakno new uncovered line or branch is introduced by this PR. CI is the authority on the 100% gate
  • Celerity.Fuzz --target StringInternTable --iterations 2000 — all cases passed
  • Celerity.AotSmokeTest run (managed, net10.0) — all checks passed; the Native AOT publish job in CI is the real gate for the new SpanLookupExtensions method-generic instantiations
  • CI matrix (Windows / Linux / macOS x net8.0 / net9.0 / net10.0), coverage gate, Native AOT publish, and the 8-shard Benchmarks run
  • gh-pages dashboard refresh on merge to main — the new StringInternTable card and the SpanLookup rows on the Trie / FrozenCelerityDictionary cards only render once data.js is republished from main

Heads-up on the benchmark shards: this PR adds a benchmark class, which is the exact shape described in #300 (head and base packs are built from different class lists, so a shard can time out). If a Benchmarks shard fails here, that is #300 rather than a regression in this change.

Closes #311

🤖 Generated with Claude Code

… + StringInternTable

Adds ISpanHashProvider to Celerity.Hashing and, on top of it, allocation-free
ReadOnlySpan<char> lookups across every string-keyed collection, plus the type
that pattern makes possible: StringInternTable.

Before this, a parser holding a slice of its input buffer had to call
new string(span) to probe any Celerity string-keyed type — one allocation plus
a copy per lookup, on the hot path of exactly the workloads those types exist
for. .NET 9 closed that gap for the BCL Dictionary with GetAlternateLookup;
net8.0 is this library's floor, so it had no answer at all.

- ISpanHashProvider (int Hash(ReadOnlySpan<char>)) is a sibling interface, not
  an overload on IHashProvider<T>: a ref struct could not be a generic type
  argument before allows ref struct, so the span has to be a method parameter.
  All 23 String*Hasher types implement it, each sharing one body between the
  two overloads so they cannot drift.
- Span TryGetValue / ContainsKey / Contains on FrozenCelerityDictionary,
  FrozenCeleritySet, CelerityDictionary<string, ...>, CeleritySet<string, ...>
  and Trie<TValue>. On the four hashed types these are extension methods
  carrying the extra constraint on the method, so no shipped type's own
  constraints change and the JIT still devirtualizes the hash call.
- StringInternTable / StringInternTable<THasher>: GetOrAdd(ReadOnlySpan<char>)
  returns the canonical string and allocates only on a miss.

Full parity rollout in this commit: dedicated + cross-collection tests, a
hasher parity suite, a CsCheck differential, a Celerity.Fuzz target, an AOT
smoke-test block, a tracked benchmark plus SpanLookup rows on two existing
ones, dashboard wiring, API reference and README sections, CHANGELOG, ROADMAP.

Closes #311

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 26, 2026 13:26
@github-actions

Copy link
Copy Markdown

Coverage

Metric Value
Line 100% (10009/10009)
Branch 100% (3942/3942)

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

Adds a span-keyed lookup “lane” for string-keyed collections (net8-compatible) by introducing ISpanHashProvider, implementing it across the built-in String*Hasher family, and exposing span lookup APIs (mostly via extension methods) plus a new StringInternTable for span-keyed string interning.

Changes:

  • Introduce ISpanHashProvider and implement span hashing across all built-in String*Hasher types, with parity tests enforcing Hash(string) == Hash(ReadOnlySpan<char>).
  • Add allocation-free span-keyed lookups for FrozenCelerityDictionary/Set, CelerityDictionary<string,...>, CeleritySet<string,...>, and Trie<TValue>.
  • Add StringInternTable (+ tests, fuzz target, benchmarks, and docs/dashboard wiring) to intern strings from spans with allocation only on misses.

Reviewed changes

Copilot reviewed 49 out of 49 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
web/index.html Adds StringInternTable to the “What ships in the box” list.
web/dev/bench/index.html Adds dashboard wiring for StringInternTable and SpanLookup ops.
web/dev/bench/detail.html Adds StringInternTable to benchmark detail list.
src/Celerity/Collections/Trie.cs Adds span overloads and generalizes descent to ReadOnlySpan<char>.
src/Celerity/Collections/StringInternTable.cs New span-probed interning table that allocates only on misses.
src/Celerity/Collections/SpanLookupExtensions.cs New extension-method surface for span-keyed lookups on hashed collections.
src/Celerity/Collections/FrozenCeleritySet.cs Adds internal span-slot probing + internal hasher accessor for extensions.
src/Celerity/Collections/FrozenCelerityDictionary.cs Adds internal span-slot probing, value accessor, and internal hasher accessor.
src/Celerity/Collections/CeleritySet.cs Adds internal span probing hook used by span lookup extensions.
src/Celerity/Collections/CelerityDictionary.cs Adds internal span probing hook + value/hasher accessors used by extensions.
src/Celerity.Tests/Hashing/SpanHashParityTests.cs New contract tests for ISpanHashProvider roster + parity assertions.
src/Celerity.Tests/Collections/StringInternTableTests.cs Dedicated unit tests for StringInternTable.
src/Celerity.Tests/Collections/StringInternTableDifferentialTests.cs Seeded differential tests vs a Dictionary<string,string> oracle.
src/Celerity.Tests/Collections/SpanLookupTests.cs Cross-collection tests asserting span lookups match string lookups.
src/Celerity.Hashing/StringXxHash64Hasher.cs Implements ISpanHashProvider; routes string hashing through span core.
src/Celerity.Hashing/StringXxHash3Hasher.cs Implements ISpanHashProvider; routes string hashing through span core.
src/Celerity.Hashing/StringXxHash32Hasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringSipHash24Hasher.cs Implements ISpanHashProvider; unifies core via span.
src/Celerity.Hashing/StringSipHash13Hasher.cs Implements ISpanHashProvider; unifies core via span.
src/Celerity.Hashing/StringSdbmHasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringMurmur3Hasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringMurmur2Hasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringMetroHash64Hasher.cs Implements ISpanHashProvider; unifies core via span.
src/Celerity.Hashing/StringJenkinsOaatHasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringHighwayHash64Hasher.cs Implements ISpanHashProvider; unifies core via span.
src/Celerity.Hashing/StringHalfSipHash24Hasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringFnV1Hasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringFnV1AHasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringFnV1AFullHasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringFnV1A64Hasher.cs Implements ISpanHashProvider; unifies core via span.
src/Celerity.Hashing/StringFnV164Hasher.cs Implements ISpanHashProvider; unifies core via span.
src/Celerity.Hashing/StringElfHasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringDjb2Hasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringDjb2AHasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringCrc32Hasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/StringCityHash64Hasher.cs Implements ISpanHashProvider; unifies core via span.
src/Celerity.Hashing/StringAdler32Hasher.cs Implements ISpanHashProvider with span overload.
src/Celerity.Hashing/ISpanHashProvider.cs New interface defining span hashing contract.
src/Celerity.Fuzz/Differential.cs Adds StringInternTable differential fuzz target.
src/Celerity.Benchmarks/TrieBenchmark.cs Adds SpanLookup benchmark category.
src/Celerity.Benchmarks/StringInternTableBenchmark.cs New benchmark for StringInternTable vs BCL shapes.
src/Celerity.Benchmarks/Program.cs Registers StringInternTableBenchmark in the suite.
src/Celerity.Benchmarks/FrozenCelerityDictionaryBenchmark.cs Adds SpanLookup benchmark category.
src/Celerity.AotSmokeTest/Program.cs Exercises new span APIs + intern table under AOT.
ROADMAP.md Marks the span-keyed lookup roadmap item as done (with rationale).
README.md Documents span lookups and StringInternTable in user-facing docs.
docs/api/hashing.md Adds ISpanHashProvider section and contract guidance.
docs/api/collections.md Adds span-keyed lookup documentation + StringInternTable docs.
CHANGELOG.md Adds [Unreleased] entries for the new features/tests/bench/docs.

Comment thread src/Celerity/Collections/CelerityDictionary.cs
Comment thread src/Celerity/Collections/CeleritySet.cs
…BCL baseline per benchmark category

Addresses the Copilot review on #323.

The span probes reinterpret each slot as a string via Unsafe.As, which is a
no-op only while the collection is closed over string. The extension methods'
signatures are what guarantee that, and nothing in the type system restates it
inside the probe — so a future in-assembly caller could silently get undefined
behaviour. Debug.Assert is [Conditional("DEBUG")], so the guardrail costs
nothing in a release build and the hot path is unchanged.

Separately, self-review of the dashboard wiring: StringInternTableBenchmark had
two BCL arms in its Dedupe category (HashSet and Dictionary). The dashboard
indexes one bcl value per collection|op|itemCount, so the two baselines would
have overwritten each other and the card would have compared against whichever
landed last. Dropped the HashSet arm — Dictionary is also the truer analogue,
since it hands back the canonical instance exactly as GetOrAdd does. The Lookup
category keeps HashSet<string> as its only BCL arm.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 26, 2026 13:37

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 49 out of 49 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

CHANGELOG.md:15

  • Same note as above: these bullets read more like PR body text than changelog entries. The repo’s release process uses the version section verbatim as the GitHub Release body, so keeping bullets terse helps avoid hitting size limits (CONTRIBUTING.md:118-124).
- **`SpanHashParityTests`** — a family-wide roster test plus a per-hasher `Hash(s) == Hash(s.AsSpan())` assertion over every length class, checked both as a whole string and as a slice of a larger buffer, since a divergence there would silently report a stored key as absent. Closes [#311](https://github.com/marius-bughiu/Celerity/issues/311).
- **`SpanLookupTests`, `StringInternTableTests`, `StringInternTableDifferentialTests`**, and a `StringInternTable` target in the `Celerity.Fuzz` differential harness — cross-collection coverage asserting each span path against its own type's string overload, plus seeded differential runs against a `Dictionary<string, string>` oracle. `Celerity.AotSmokeTest` exercises every new span instantiation and the intern table under a Native AOT publish. Closes [#311](https://github.com/marius-bughiu/Celerity/issues/311).
- **`StringInternTableBenchmark`** (registered in the CI-tracked suite) plus `SpanLookup` rows on `FrozenCelerityDictionaryBenchmark` and `TrieBenchmark`, with the matching dashboard cards. Allocation is the headline: the BCL arms allocate one string per occurrence, the Celerity arms one per distinct token. Closes [#311](https://github.com/marius-bughiu/Celerity/issues/311).
- API reference sections for `ISpanHashProvider`, span-keyed lookups, and `StringInternTable`, plus README entries in the collections list, the "Choosing a collection" decision table, and the hasher-picking notes. Closes [#311](https://github.com/marius-bughiu/Celerity/issues/311).

Comment thread CHANGELOG.md Outdated
Addresses the Copilot review on #323. The bullets were PR-body prose in a
changelog: CONTRIBUTING.md asks for a few sentences at most per entry, and the
release workflow lifts the whole version section verbatim into the GitHub
Release body, where an over-long section has actually broken a release here
before. Kept one bullet per rollout facet so the change is still reconstructable
from the changelog alone, but cut each to the observable change. The [Unreleased]
section drops from 6009 to 4439 characters.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 26, 2026 13:44

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 49 out of 49 changed files in this pull request and generated no new comments.

@github-actions

Copy link
Copy Markdown

Benchmarks

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

Highlights

Benchmark This PR StdDev main Δ
StringHasherBenchmark.FnV1A_Full(Shape: ShortAscii) 25.86 μs 16.8 ns 22.85 μs +13.1% ⚠️
StringHasherBenchmark.XxHash3(Shape: LongAscii) 82.02 μs 257.1 ns 69.91 μs +17.3% ⚠️
LruCacheBenchmark.Dictionary_Get(ItemCount: 1000) 27.04 μs 2.08 μs 24.48 μs +10.5% ⚠️
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 1000) 2.35 μs 7.4 ns 2.75 μs -14.7% ✅
CeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 34.72 μs 4.19 μs 26.40 μs +31.5% ⚠️
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 1000) 5.04 μs 72.6 ns 4.54 μs +10.8% ⚠️
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.31 μs 386.4 ns 12.95 μs +10.5% ⚠️
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 15.78 μs 778.9 ns 12.86 μs +22.7% ⚠️
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 1000) 12.05 μs 286.6 ns 10.78 μs +11.8% ⚠️
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.33 μs 147.9 ns 14.71 μs -9.4% ✅
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 100000) 6.91 ms 110.05 μs 2.04 ms +239.4% ⚠️
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 100000) 1.69 ms 63.17 μs 2.30 ms -26.8% ✅
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 100000) 1.55 s 47.21 ms 1.81 s -14.3% ✅
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 100000) 5.66 ms 30.03 μs 8.17 ms -30.8% ✅
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 100000) 202.48 ms 20.00 ms 159.21 ms +27.2% ⚠️
SwissSetBenchmark.HashSet_Remove(ItemCount: 1000) 33.26 μs 3.09 μs 27.61 μs +20.4% ⚠️
LongSetBenchmark.LongSet_Remove(ItemCount: 100000) 1.42 ms 45.42 μs 1.60 ms -11.7% ✅
SmallSetBenchmark.SmallSet_Add(ItemCount: 8) 44.5 ns 0.3 ns 50.8 ns -12.5% ✅
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 1.97 ms 165.81 μs 3.40 ms -42.1% ✅
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 100000) 1.75 ms 98.00 μs 2.59 ms -32.6% ✅
TrieBenchmark.Trie_Add(ItemCount: 1000) 632.94 μs 54.47 μs 552.12 μs +14.6% ⚠️
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 100000) 1.68 s 86.78 ms 1.45 s +15.7% ⚠️
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 1000) 0.2 ns 0.1 ns 0.0 ns +274224.2% ⚠️
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.11 μs 209.9 ns 16.59 μs -15.0% ✅
Collections (488)
Benchmark This PR StdDev main Δ
CeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 13.27 μs 311.9 ns 12.45 μs +6.6%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 1000) 13.85 μs 103.1 ns 14.11 μs -1.8%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 1000) 9.30 μs 68.1 ns 8.96 μs +3.8%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 1000) 87.55 μs 441.5 ns 88.21 μs -0.7%
CeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 5.14 ms 124.53 μs 5.03 ms +2.2%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 100000) 3.35 ms 77.07 μs 3.31 ms +1.3%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 100000) 3.20 ms 29.76 μs 3.20 ms -0.3%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 100000) 14.52 ms 195.87 μs 14.57 ms -0.4%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 14.6 ns 4.74 μs -0.0%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 1000) 1.85 μs 3.2 ns 1.96 μs -5.4%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.59 ms 21.27 μs 1.59 ms -0.2%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 100000) 599.71 μs 2.03 μs 591.73 μs +1.3%
LruCacheBenchmark.Dictionary_Get(ItemCount: 1000) 27.04 μs 2.08 μs 24.48 μs +10.5% ⚠️
LruCacheBenchmark.LruCache_Get(ItemCount: 1000) 6.84 μs 90.3 ns 6.84 μs +0.0%
LruCacheBenchmark.Dictionary_Get(ItemCount: 100000) 27.33 μs 2.16 μs 25.35 μs +7.8%
LruCacheBenchmark.LruCache_Get(ItemCount: 100000) 6.91 μs 60.7 ns 6.96 μs -0.7%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 1000) 4.85 μs 41.6 ns 4.84 μs +0.2%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 1000) 3.59 μs 4.0 ns 3.60 μs -0.2%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 100000) 536.59 μs 19.89 μs 519.90 μs +3.2%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 100000) 1.34 ms 424.7 ns 1.34 ms +0.0%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.56 μs 567.0 ns 15.41 μs -5.5%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 1000) 8.08 μs 46.3 ns 8.13 μs -0.7%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 5.03 ms 83.22 μs 5.17 ms -2.6%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 100000) 2.97 ms 12.83 μs 2.99 ms -0.6%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.73 μs 9.3 ns 4.72 μs +0.4%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 1000) 2.35 μs 7.4 ns 2.75 μs -14.7% ✅
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.62 ms 1.53 μs 1.63 ms -0.7%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 100000) 726.99 μs 1.72 μs 733.16 μs -0.8%
LruCacheBenchmark.Dictionary_Put(ItemCount: 1000) 106.97 μs 4.43 μs 111.77 μs -4.3%
LruCacheBenchmark.LruCache_Put(ItemCount: 1000) 491.89 μs 25.94 μs 480.24 μs +2.4%
LruCacheBenchmark.Dictionary_Put(ItemCount: 100000) 8.11 ms 61.98 μs 8.12 ms -0.2%
LruCacheBenchmark.LruCache_Put(ItemCount: 100000) 5.82 ms 28.22 μs 5.79 ms +0.5%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 34.72 μs 4.19 μs 26.40 μs +31.5% ⚠️
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 84.59 μs 6.86 μs 87.99 μs -3.9%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 1000) 127.65 μs 9.77 μs 124.07 μs +2.9%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 1000) 131.12 μs 5.66 μs 125.85 μs +4.2%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.75 ms 21.74 μs 1.72 ms +1.8%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.08 ms 18.95 μs 2.12 ms -1.6%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 100000) 1.36 ms 84.97 μs 1.38 ms -1.5%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 100000) 1.69 ms 68.27 μs 1.85 ms -8.5%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 1000) 31.4 ns 0.2 ns 31.7 ns -1.0%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 1000) 1.25 μs 6.2 ns 1.29 μs -3.4%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 100000) 30.5 ns 0.3 ns 32.7 ns -6.9%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 100000) 1.23 μs 14.3 ns 1.24 μs -0.9%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 1000) 67.32 μs 954.5 ns 68.57 μs -1.8%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 12.61 μs 124.6 ns 13.39 μs -5.8%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 1000) 53.97 μs 358.9 ns 54.19 μs -0.4%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 1000) 8.52 μs 50.8 ns 8.37 μs +1.8%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 100000) 24.06 ms 169.30 μs 24.13 ms -0.3%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 4.81 ms 95.11 μs 4.87 ms -1.1%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 100000) 16.06 ms 112.58 μs 16.16 ms -0.6%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 100000) 2.87 ms 8.79 μs 2.90 ms -1.0%
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 6.2 ns 4.75 μs -0.2%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 1000) 1.93 μs 15.6 ns 1.94 μs -0.2%
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.62 ms 5.40 μs 1.61 ms +0.5%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 100000) 586.54 μs 617.5 ns 586.96 μs -0.1%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 1000) 144.89 μs 896.1 ns 144.04 μs +0.6%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 1000) 263.74 μs 1.12 μs 258.65 μs +2.0%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 100000) 33.50 ms 343.42 μs 32.39 ms +3.4%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 100000) 57.67 ms 539.73 μs 55.97 ms +3.0%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 1000) 5.04 μs 72.6 ns 4.54 μs +10.8% ⚠️
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 1000) 30.39 μs 259.6 ns 29.34 μs +3.6%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 100000) 1.09 ms 14.99 μs 1.07 ms +1.7%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 100000) 6.57 ms 309.26 μs 6.31 ms +4.2%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 1000) 1.37 μs 1.4 ns 1.37 μs +0.1%
DequeBenchmark.Deque_Enumerate(ItemCount: 1000) 942.0 ns 0.8 ns 942.0 ns +0.0%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 100000) 135.10 μs 70.1 ns 135.39 μs -0.2%
DequeBenchmark.Deque_Enumerate(ItemCount: 100000) 94.18 μs 364.5 ns 93.89 μs +0.3%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.31 μs 386.4 ns 12.95 μs +10.5% ⚠️
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 15.78 μs 778.9 ns 12.86 μs +22.7% ⚠️
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 1000) 12.05 μs 286.6 ns 10.78 μs +11.8% ⚠️
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 1000) 18.22 μs 451.0 ns 17.01 μs +7.1%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.17 ms 79.89 μs 4.12 ms +1.2%
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.75 ms 49.50 μs 4.70 ms +1.1%
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 100000) 4.93 ms 82.01 μs 4.80 ms +2.7%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 100000) 8.58 ms 867.90 μs 7.75 ms +10.7%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 1000) 36.51 μs 1.33 μs 35.14 μs +3.9%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.74 μs 37.4 ns 4.72 μs +0.5%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.71 μs 20.0 ns 4.71 μs -0.1%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 1000) 25.39 μs 59.1 ns 25.31 μs +0.3%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 1000) 2.14 μs 3.3 ns 2.14 μs -0.2%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 1000) 2.89 μs 85.8 ns 2.82 μs +2.3%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 100000) 18.60 ms 59.40 μs 18.93 ms -1.7%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.60 ms 5.93 μs 1.59 ms +0.9%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.61 ms 3.98 μs 1.65 ms -2.6%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 100000) 12.89 ms 115.83 μs 13.22 ms -2.5%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 100000) 676.16 μs 1.89 μs 676.53 μs -0.1%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 100000) 860.05 μs 4.77 μs 853.17 μs +0.8%
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 1000) 191.68 μs 5.55 μs 187.42 μs +2.3%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 1000) 83.40 μs 2.77 μs 86.39 μs -3.5%
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 100000) 47.80 ms 448.46 μs 50.15 ms -4.7%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 100000) 26.76 ms 235.05 μs 26.31 ms +1.7%
DequeBenchmark.LinkedList_PushFront(ItemCount: 1000) 40.50 μs 7.25 μs 39.12 μs +3.5%
DequeBenchmark.Deque_PushFront(ItemCount: 1000) 24.45 μs 5.05 μs 20.29 μs +20.5%
DequeBenchmark.LinkedList_PushFront(ItemCount: 100000) 1.90 ms 30.66 μs 1.90 ms +0.3%
DequeBenchmark.Deque_PushFront(ItemCount: 100000) 757.27 μs 175.23 μs 666.91 μs +13.5%
DequeBenchmark.LinkedList_Queue(ItemCount: 1000) 59.60 μs 3.52 μs 60.83 μs -2.0%
DequeBenchmark.Deque_Queue(ItemCount: 1000) 35.25 μs 2.87 μs 39.54 μs -10.8%
DequeBenchmark.LinkedList_Queue(ItemCount: 100000) 4.44 ms 90.02 μs 4.27 ms +4.1%
DequeBenchmark.Deque_Queue(ItemCount: 100000) 426.95 μs 19.57 μs 435.60 μs -2.0%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 1000) 4.60 μs 27.1 ns 4.50 μs +2.1%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 1000) 77.4 ns 0.2 ns 77.9 ns -0.6%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 100000) 1.26 ms 5.67 μs 1.30 ms -2.8%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 100000) 5.79 μs 7.2 ns 5.78 μs +0.2%
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 1000) 783.91 μs 13.24 μs 786.16 μs -0.3%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 83.77 μs 7.70 μs 87.37 μs -4.1%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 31.51 μs 3.82 μs 33.34 μs -5.5%
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 81.19 μs 6.33 μs 88.56 μs -8.3%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 1000) 310.71 μs 14.18 μs 307.96 μs +0.9%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 1000) 91.32 μs 5.31 μs 93.03 μs -1.8%
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 1000) 117.63 μs 8.67 μs 135.39 μs -13.1%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 1000) 117.29 μs 9.91 μs 117.56 μs -0.2%
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 100000) 26.44 ms 624.32 μs 27.34 ms -3.3%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.08 ms 45.19 μs 2.04 ms +2.2%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.76 ms 26.75 μs 1.76 ms +0.3%
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.07 ms 18.54 μs 2.09 ms -0.7%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 100000) 18.46 ms 325.72 μs 18.51 ms -0.3%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 100000) 2.70 ms 2.09 ms 3.03 ms -10.9%
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 100000) 1.30 ms 58.27 μs 1.31 ms -0.2%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 100000) 1.79 ms 54.59 μs 1.75 ms +2.7%
BTreeSetBenchmark.SortedSet_Add(ItemCount: 1000) 43.01 μs 1.05 μs 44.13 μs -2.6%
IntSetBenchmark.HashSet_Add(ItemCount: 1000) 12.76 μs 141.1 ns 12.20 μs +4.6%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 1000) 41.63 μs 177.2 ns 41.76 μs -0.3%
IntSetBenchmark.IntSet_Add(ItemCount: 1000) 8.73 μs 79.1 ns 8.70 μs +0.3%
BTreeSetBenchmark.SortedSet_Add(ItemCount: 100000) 21.08 ms 254.85 μs 21.37 ms -1.4%
IntSetBenchmark.HashSet_Add(ItemCount: 100000) 5.08 ms 130.37 μs 5.03 ms +1.0%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 100000) 13.99 ms 34.16 μs 13.97 ms +0.1%
IntSetBenchmark.IntSet_Add(ItemCount: 100000) 3.18 ms 24.27 μs 3.16 ms +0.7%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 1000) 19.44 μs 285.5 ns 18.10 μs +7.4%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 1000) 16.52 μs 89.3 ns 16.09 μs +2.7%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 100000) 4.29 ms 93.69 μs 4.25 ms +1.0%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 100000) 3.13 ms 32.84 μs 3.17 ms -1.2%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 1000) 9.41 μs 258.7 ns 9.16 μs +2.8%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 1000) 12.12 μs 6.1 ns 12.89 μs -6.0%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 100000) 259.56 μs 2.84 μs 253.20 μs +2.5%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 100000) 337.03 μs 3.32 μs 322.57 μs +4.5%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 1000) 16.71 μs 25.0 ns 16.70 μs +0.0%
IntSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 10.1 ns 4.74 μs +0.0%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 1000) 17.29 μs 147.9 ns 17.31 μs -0.1%
IntSetBenchmark.IntSet_Contains(ItemCount: 1000) 1.80 μs 7.4 ns 1.81 μs -0.4%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 100000) 15.65 ms 86.49 μs 15.89 ms -1.5%
IntSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.69 ms 146.61 μs 1.58 ms +6.9%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 100000) 12.56 ms 31.85 μs 12.58 ms -0.2%
IntSetBenchmark.IntSet_Contains(ItemCount: 100000) 573.37 μs 1.37 μs 572.33 μs +0.2%
StringInternTableBenchmark.Dictionary_Dedupe(ItemCount: 1000) 34.58 μs 307.9 ns n/a 🆕 new
StringInternTableBenchmark.StringInternTable_Dedupe(ItemCount: 1000) 35.78 μs 44.3 ns n/a 🆕 new
StringInternTableBenchmark.Dictionary_Dedupe(ItemCount: 100000) 3.30 ms 16.54 μs n/a 🆕 new
StringInternTableBenchmark.StringInternTable_Dedupe(ItemCount: 100000) 3.20 ms 8.52 μs n/a 🆕 new
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 15.03 μs 247.0 ns 16.30 μs -7.8%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.33 μs 147.9 ns 14.71 μs -9.4% ✅
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 1000) 11.81 μs 190.4 ns 12.13 μs -2.7%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 1000) 29.39 μs 223.3 ns 30.73 μs -4.4%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 5.00 ms 52.62 μs 5.09 ms -1.7%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.54 ms 186.96 μs 4.89 ms -7.1%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 100000) 6.73 ms 78.13 μs 6.97 ms -3.4%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 100000) 3.92 ms 26.43 μs 4.00 ms -1.9%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.89 μs 20.2 ns 4.90 μs -0.2%
StringInternTableBenchmark.HashSet_Lookup(ItemCount: 1000) 32.93 μs 535.5 ns n/a 🆕 new
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.71 μs 18.6 ns 4.73 μs -0.4%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 1000) 2.27 μs 7.7 ns 2.27 μs +0.0%
StringInternTableBenchmark.StringInternTable_Lookup(ItemCount: 1000) 31.45 μs 20.8 ns n/a 🆕 new
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 1000) 3.00 μs 6.7 ns 2.99 μs +0.3%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.56 ms 27.31 μs 1.62 ms -3.2%
StringInternTableBenchmark.HashSet_Lookup(ItemCount: 100000) 3.37 ms 18.26 μs n/a 🆕 new
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.59 ms 5.41 μs 1.62 ms -2.0%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 100000) 696.06 μs 2.60 μs 707.41 μs -1.6%
StringInternTableBenchmark.StringInternTable_Lookup(ItemCount: 100000) 3.16 ms 2.00 μs n/a 🆕 new
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 100000) 814.95 μs 3.05 μs 824.87 μs -1.2%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 1000) 99.57 μs 1.06 μs 99.77 μs -0.2%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 1000) 62.71 μs 516.9 ns 58.72 μs +6.8%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 100000) 32.29 ms 456.40 μs 31.92 ms +1.2%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 100000) 24.12 ms 409.83 μs 23.97 ms +0.6%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 1000) 173.4 ns 1.5 ns 174.4 ns -0.6%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 1000) 74.1 ns 0.1 ns 74.1 ns +0.0%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 100000) 9.66 μs 1.11 μs 9.45 μs +2.2%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 100000) 5.24 μs 61.8 ns 5.20 μs +0.8%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 1000) 733.23 μs 27.50 μs 731.92 μs +0.2%
IntSetBenchmark.HashSet_Remove(ItemCount: 1000) 27.77 μs 2.37 μs 28.34 μs -2.0%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 84.22 μs 6.63 μs 84.23 μs -0.0%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 86.43 μs 6.76 μs 84.11 μs +2.8%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 1000) 268.95 μs 12.58 μs 268.35 μs +0.2%
IntSetBenchmark.IntSet_Remove(ItemCount: 1000) 89.23 μs 8.12 μs 89.56 μs -0.4%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 1000) 92.37 μs 9.18 μs 88.88 μs +3.9%
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 1000) 79.06 μs 8.01 μs 77.62 μs +1.9%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 100000) 25.13 ms 100.87 μs 25.26 ms -0.5%
IntSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.72 ms 16.73 μs 1.72 ms +0.0%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.02 ms 33.79 μs 2.38 ms -15.0%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.06 ms 21.93 μs 2.11 ms -2.4%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 100000) 15.34 ms 158.83 μs 15.32 ms +0.1%
IntSetBenchmark.IntSet_Remove(ItemCount: 100000) 1.34 ms 9.71 μs 1.33 ms +0.6%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 100000) 6.91 ms 110.05 μs 2.04 ms +239.4% ⚠️
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 100000) 1.69 ms 63.17 μs 2.30 ms -26.8% ✅
DisjointSetBenchmark.Dictionary_Union(ItemCount: 1000) 97.59 μs 565.3 ns 97.20 μs +0.4%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 1000) 26.91 μs 166.1 ns 26.19 μs +2.8%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 100000) 43.84 ms 1.04 ms 40.12 ms +9.3%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 100000) 8.18 ms 57.60 μs 8.20 ms -0.2%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 1000) 12.52 μs 166.4 ns 12.48 μs +0.3%
LongSetBenchmark.HashSet_Add(ItemCount: 1000) 13.56 μs 250.5 ns 14.02 μs -3.3%
SwissSetBenchmark.HashSet_Add(ItemCount: 1000) 12.48 μs 126.7 ns 12.52 μs -0.3%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 1000) 7.15 μs 33.5 ns 7.16 μs -0.0%
LongSetBenchmark.LongSet_Add(ItemCount: 1000) 9.30 μs 122.5 ns 9.84 μs -5.5%
SwissSetBenchmark.SwissSet_Add(ItemCount: 1000) 26.58 μs 174.4 ns 26.66 μs -0.3%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 100000) 4.63 ms 83.33 μs 4.67 ms -0.8%
LongSetBenchmark.HashSet_Add(ItemCount: 100000) 4.65 ms 191.75 μs 4.47 ms +3.9%
SwissSetBenchmark.HashSet_Add(ItemCount: 100000) 4.76 ms 87.63 μs 4.72 ms +0.8%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 100000) 2.06 ms 13.74 μs 2.08 ms -0.7%
LongSetBenchmark.LongSet_Add(ItemCount: 100000) 6.07 ms 51.40 μs 6.21 ms -2.3%
SwissSetBenchmark.SwissSet_Add(ItemCount: 100000) 4.59 ms 39.32 μs 4.58 ms +0.1%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 1000) 160.32 μs 641.9 ns 161.78 μs -0.9%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 1000) 3.75 ms 41.18 μs 3.85 ms -2.8%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 100000) 29.04 ms 380.05 μs 29.23 ms -0.7%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 100000) 1.55 s 47.21 ms 1.81 s -14.3% ✅
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.89 μs 174.3 ns 4.72 μs +3.8%
LongSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 5.2 ns 4.80 μs -1.1%
SwissSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.73 μs 10.4 ns 4.74 μs -0.3%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 1000) 4.91 μs 3.8 ns 4.91 μs -0.0%
LongSetBenchmark.LongSet_Contains(ItemCount: 1000) 2.01 μs 7.6 ns 2.00 μs +0.5%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 1000) 2.88 μs 24.1 ns 2.86 μs +0.5%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 1000) 18.21 μs 158.4 ns 18.18 μs +0.2%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 1000) 24.29 μs 33.0 ns 24.28 μs +0.0%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.55 ms 44.14 μs 1.58 ms -2.1%
LongSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.63 ms 12.87 μs 1.67 ms -2.0%
SwissSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.56 ms 14.38 μs 1.55 ms +0.7%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 100000) 1.74 ms 3.82 μs 1.77 ms -1.8%
LongSetBenchmark.LongSet_Contains(ItemCount: 100000) 637.97 μs 921.2 ns 649.45 μs -1.8%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 100000) 627.93 μs 1.79 μs 600.91 μs +4.5%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 100000) 3.41 ms 19.13 μs 3.56 ms -4.2%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 100000) 4.81 ms 41.72 μs 5.04 ms -4.6%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 3.9 ns 4.54 μs -0.1%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 3.5 ns 4.54 μs -0.1%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 1000) 8.43 μs 4.9 ns 8.43 μs -0.0%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 1000) 2.37 μs 4.9 ns 2.37 μs +0.1%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.92 ms 8.05 μs 1.93 ms -0.3%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.93 ms 3.13 μs 1.93 ms -0.1%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 100000) 874.66 μs 1.39 μs 879.69 μs -0.6%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 100000) 348.90 μs 3.04 μs 347.86 μs +0.3%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 1000) 18.65 μs 222.0 ns 18.71 μs -0.3%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 26.99 μs 104.9 ns 26.86 μs +0.5%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 1000) 7.32 μs 9.8 ns 7.35 μs -0.4%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 1000) 86.80 μs 3.04 μs 87.94 μs -1.3%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 100000) 3.53 ms 17.22 μs 3.82 ms -7.5%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 5.23 ms 392.00 μs 5.73 ms -8.7%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 100000) 1.98 ms 10.17 μs 1.95 ms +1.1%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 100000) 7.37 ms 282.22 μs 7.46 ms -1.2%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 1000) 15.11 μs 122.3 ns 14.99 μs +0.8%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 1000) 28.41 μs 43.9 ns 28.85 μs -1.5%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 100000) 3.86 ms 28.15 μs 4.23 ms -8.6%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 100000) 5.66 ms 30.03 μs 8.17 ms -30.8% ✅
FenwickTreeBenchmark.Array_Mixed(ItemCount: 1000) 181.80 μs 213.4 ns 181.92 μs -0.1%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 1000) 11.05 μs 26.6 ns 11.29 μs -2.1%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 100000) 167.67 ms 710.91 μs 166.89 ms +0.5%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 100000) 622.67 μs 11.78 μs 640.33 μs -2.8%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 1000) 221.08 μs 572.0 ns 220.82 μs +0.1%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 1000) 7.45 μs 3.8 ns 7.46 μs -0.1%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 100000) 202.48 ms 20.00 ms 159.21 ms +27.2% ⚠️
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 100000) 353.14 μs 20.84 μs 328.70 μs +7.4%
LongSetBenchmark.HashSet_Remove(ItemCount: 1000) 80.92 μs 5.46 μs 80.71 μs +0.3%
LongSetBenchmark.LongSet_Remove(ItemCount: 1000) 84.35 μs 4.02 μs 91.64 μs -8.0%
SwissSetBenchmark.HashSet_Remove(ItemCount: 1000) 33.26 μs 3.09 μs 27.61 μs +20.4% ⚠️
SwissSetBenchmark.SwissSet_Remove(ItemCount: 1000) 74.23 μs 5.58 μs 68.59 μs +8.2%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 1000) 13.06 μs 162.0 ns 13.06 μs +0.0%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 1000) 12.95 μs 183.5 ns 13.03 μs -0.6%
LongSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.97 ms 21.02 μs 2.03 ms -2.8%
LongSetBenchmark.LongSet_Remove(ItemCount: 100000) 1.42 ms 45.42 μs 1.60 ms -11.7% ✅
SwissSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.71 ms 14.63 μs 1.71 ms -0.1%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 100000) 1.06 ms 7.37 μs 1.06 ms +0.1%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 100000) 3.78 ms 28.47 μs 3.90 ms -3.0%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 100000) 3.98 ms 7.70 μs 3.97 ms +0.0%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_SpanLookup(ItemCount: 1000) 30.14 μs 196.8 ns n/a 🆕 new
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_SpanLookup(ItemCount: 1000) 91.36 μs 140.9 ns n/a 🆕 new
FrozenCelerityDictionaryBenchmark.FrozenDictionary_SpanLookup(ItemCount: 100000) 5.87 ms 45.97 μs n/a 🆕 new
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_SpanLookup(ItemCount: 100000) 8.57 ms 29.66 μs n/a 🆕 new
EnumMapBenchmark.Dictionary_Add 600.5 ns 8.3 ns 610.4 ns -1.6%
EnumSetBenchmark.HashSet_Add 557.1 ns 2.6 ns 570.8 ns -2.4%
EnumMapBenchmark.EnumMap_Add 150.2 ns 1.0 ns 150.2 ns +0.0%
EnumSetBenchmark.EnumSet_Add 84.1 ns 0.3 ns 87.0 ns -3.3%
SmallSetBenchmark.HashSet_Add(ItemCount: 8) 189.4 ns 21.2 ns 176.0 ns +7.6%
SmallSetBenchmark.SmallSet_Add(ItemCount: 8) 44.5 ns 0.3 ns 50.8 ns -12.5% ✅
SmallSetBenchmark.HashSet_Add(ItemCount: 64) 726.1 ns 7.2 ns 796.8 ns -8.9%
SmallSetBenchmark.SmallSet_Add(ItemCount: 64) 1.67 μs 10.0 ns 1.95 μs -14.8%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 1000) 12.06 μs 214.9 ns 11.96 μs +0.8%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 1000) 17.27 μs 177.8 ns 17.39 μs -0.7%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 100000) 4.25 ms 499.76 μs 4.35 ms -2.4%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 100000) 6.26 ms 55.55 μs 6.26 ms +0.1%
BitSetBenchmark.BitArray_And(ItemCount: 1024) 54.3 ns 0.7 ns 53.2 ns +2.2%
BitSetBenchmark.BitSet_And(ItemCount: 1024) 1.22 μs 27.3 ns 1.25 μs -2.1%
BitSetBenchmark.BitArray_And(ItemCount: 1000000) 44.64 μs 491.5 ns 44.94 μs -0.7%
BitSetBenchmark.BitSet_And(ItemCount: 1000000) 4.48 ms 3.89 μs 4.48 ms +0.0%
EnumSetBenchmark.HashSet_Contains 179.6 ns 4.9 ns 175.3 ns +2.5%
EnumSetBenchmark.EnumSet_Contains 46.0 ns 0.1 ns 45.9 ns +0.3%
SmallSetBenchmark.HashSet_Contains(ItemCount: 8) 37.2 ns 0.1 ns 37.2 ns -0.2%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 8) 19.0 ns 0.2 ns 19.1 ns -0.7%
SmallSetBenchmark.HashSet_Contains(ItemCount: 64) 299.4 ns 0.2 ns 299.8 ns -0.1%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 64) 1.11 μs 11.9 ns 1.09 μs +2.0%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.75 μs 28.8 ns 4.72 μs +0.6%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 1000) 2.50 μs 10.3 ns 2.50 μs +0.2%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.59 ms 6.08 μs 1.59 ms +0.3%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 100000) 739.49 μs 744.2 ns 747.35 μs -1.1%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 8.6 ns 4.54 μs -0.0%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 1000) 2.74 μs 2.3 ns 2.74 μs -0.0%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.92 ms 20.99 μs 1.94 ms -0.9%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 100000) 1.19 ms 1.22 μs 1.18 ms +0.5%
EnumMapBenchmark.Dictionary_Enumerate 50.4 ns 0.2 ns 50.1 ns +0.6%
EnumMapBenchmark.EnumMap_Enumerate 39.7 ns 0.0 ns 39.6 ns +0.2%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 1000) 29.08 μs 158.4 ns 31.61 μs -8.0%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 1000) 37.52 μs 206.0 ns 40.10 μs -6.4%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 100000) 12.27 ms 599.22 μs 13.22 ms -7.2%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 100000) 16.94 ms 123.53 μs 17.82 ms -4.9%
EnumMapBenchmark.Dictionary_Lookup 117.2 ns 0.6 ns 117.7 ns -0.5%
EnumMapBenchmark.EnumMap_Lookup 63.7 ns 0.2 ns 63.4 ns +0.5%
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.04 μs 25.8 ns 5.04 μs -0.1%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 1000) 2.36 μs 5.1 ns 2.36 μs +0.2%
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.75 ms 8.80 μs 1.81 ms -3.6%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 100000) 734.34 μs 852.1 ns 757.51 μs -3.1%
BitSetBenchmark.BitArray_Or(ItemCount: 1024) 54.8 ns 0.4 ns 53.0 ns +3.4%
BitSetBenchmark.BitSet_Or(ItemCount: 1024) 1.21 μs 19.4 ns 1.21 μs +0.6%
BitSetBenchmark.BitArray_Or(ItemCount: 1000000) 44.65 μs 526.3 ns 44.57 μs +0.2%
BitSetBenchmark.BitSet_Or(ItemCount: 1000000) 4.48 ms 3.32 μs 4.48 ms +0.1%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1024) 1.24 μs 2.7 ns 1.24 μs +0.1%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1024) 7.1 ns 0.0 ns 7.1 ns +0.2%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1000000) 4.82 ms 2.18 μs 4.82 ms +0.0%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1000000) 4.99 μs 42.4 ns 4.94 μs +1.1%
EnumMapBenchmark.Dictionary_Remove 3.34 μs 154.1 ns 3.17 μs +5.4%
EnumSetBenchmark.HashSet_Remove 3.54 μs 496.0 ns 2.98 μs +18.9%
EnumMapBenchmark.EnumMap_Remove 1.47 μs 64.3 ns 1.45 μs +1.4%
EnumSetBenchmark.EnumSet_Remove 1.24 μs 276.1 ns 1.08 μs +15.1%
SmallSetBenchmark.HashSet_Remove(ItemCount: 8) 645.1 ns 203.2 ns 479.8 ns +34.4%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 8) 1.14 μs 68.2 ns 1.49 μs -23.5%
SmallSetBenchmark.HashSet_Remove(ItemCount: 64) 1.73 μs 318.0 ns 1.47 μs +17.8%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 64) 25.05 μs 4.74 μs 29.92 μs -16.3%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 1000) 28.09 μs 482.0 ns 30.68 μs -8.4%
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 1000) 130.34 μs 14.49 μs 137.08 μs -4.9%
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 1000) 28.41 μs 3.89 μs 28.35 μs +0.2%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 1000) 112.13 μs 7.23 μs 119.16 μs -5.9%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 1.97 ms 165.81 μs 3.40 ms -42.1% ✅
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 100000) 1.75 ms 98.00 μs 2.59 ms -32.6% ✅
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.73 ms 14.52 μs 1.72 ms +0.5%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 100000) 1.37 ms 34.76 μs 1.38 ms -0.4%
EnumSetBenchmark.HashSet_Union 405.6 ns 3.0 ns 427.0 ns -5.0%
EnumSetBenchmark.EnumSet_Union 21.5 ns 0.1 ns 21.9 ns -1.9%
BitSetBenchmark.BitArray_Xor(ItemCount: 1024) 54.9 ns 0.4 ns 54.5 ns +0.7%
BitSetBenchmark.BitSet_Xor(ItemCount: 1024) 1.18 μs 29.3 ns 1.19 μs -0.4%
BitSetBenchmark.BitArray_Xor(ItemCount: 1000000) 44.72 μs 578.4 ns 44.54 μs +0.4%
BitSetBenchmark.BitSet_Xor(ItemCount: 1000000) 4.48 ms 3.37 μs 4.48 ms +0.0%
TrieBenchmark.Dictionary_Add(ItemCount: 1000) 43.47 μs 6.96 μs 37.41 μs +16.2%
TrieBenchmark.Trie_Add(ItemCount: 1000) 632.94 μs 54.47 μs 552.12 μs +14.6% ⚠️
BloomFilterBenchmark.HashSet_Add(ItemCount: 1000) 13.47 μs 130.5 ns 12.67 μs +6.4%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 1000) 13.37 μs 72.0 ns 13.60 μs -1.7%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 1000) 13.77 μs 267.1 ns 14.69 μs -6.2%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 1000) 14.53 μs 46.8 ns 14.49 μs +0.3%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 1000) 11.60 μs 239.9 ns 11.95 μs -2.9%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 1000) 27.62 μs 26.6 ns 27.17 μs +1.7%
TrieBenchmark.Dictionary_Add(ItemCount: 100000) 6.31 ms 1.44 ms 5.95 ms +6.2%
TrieBenchmark.Trie_Add(ItemCount: 100000) 28.35 ms 603.92 μs 25.94 ms +9.3%
BloomFilterBenchmark.HashSet_Add(ItemCount: 100000) 4.85 ms 203.24 μs 4.52 ms +7.2%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 100000) 4.48 ms 501.01 μs 4.47 ms +0.2%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 100000) 4.95 ms 64.78 μs 4.79 ms +3.3%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 100000) 1.10 ms 5.00 μs 1.10 ms +0.1%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 100000) 5.40 ms 62.86 μs 5.39 ms +0.2%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 100000) 575.48 μs 334.8 ns 575.47 μs +0.0%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 1000) 167.82 μs 525.2 ns 165.79 μs +1.2%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 1000) 2.91 ms 384.91 μs 2.49 ms +17.0%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 100000) 30.20 ms 487.97 μs 28.91 ms +4.5%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 100000) 1.68 s 86.78 ms 1.45 s +15.7% ⚠️
BloomFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.75 μs 39.3 ns 4.71 μs +0.7%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 1000) 6.88 μs 8.7 ns 6.79 μs +1.3%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.73 μs 9.0 ns 4.72 μs +0.2%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 1000) 12.52 μs 8.9 ns 12.52 μs +0.0%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 1000) 92.60 μs 3.31 μs 95.10 μs -2.6%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 1000) 2.53 μs 5.7 ns 2.53 μs +0.1%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.57 ms 46.74 μs 1.56 ms +0.4%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 100000) 2.04 ms 18.35 μs 1.95 ms +4.5%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.58 ms 3.03 μs 1.53 ms +2.9%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 100000) 868.19 μs 2.32 μs 869.86 μs -0.2%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 100000) 7.80 ms 235.57 μs 7.16 ms +8.9%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 100000) 738.20 μs 2.95 μs 736.86 μs +0.2%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.55 μs 7.3 ns 4.57 μs -0.5%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 7.2 ns 4.54 μs -0.0%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 1000) 3.53 μs 12.5 ns 3.54 μs -0.2%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 1000) 3.13 μs 160.0 ns 2.96 μs +5.7%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.96 ms 8.43 μs 1.94 ms +1.4%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.96 ms 9.21 μs 1.95 ms +0.8%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 100000) 1.49 ms 950.3 ns 1.49 ms +0.0%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 100000) 1.14 ms 1.90 μs 1.14 ms -0.2%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 1000) 10.53 μs 23.4 ns 10.41 μs +1.1%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 1000) 5.58 μs 144.4 ns 5.46 μs +2.2%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 100000) 1.51 ms 19.50 μs 1.47 ms +3.0%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 100000) 741.74 μs 7.82 μs 746.15 μs -0.6%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 1000) 0.2 ns 0.1 ns 0.0 ns +274224.2% ⚠️
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 1000) 23.45 μs 14.1 ns 23.44 μs +0.1%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 100000) 0.0 ns 0.0 ns 0.0 ns +503.9%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 100000) 22.98 μs 12.4 ns 22.98 μs +0.0%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.52 μs 160.1 ns 4.37 μs +3.4%
TrieBenchmark.Dictionary_Lookup(ItemCount: 1000) 13.22 μs 571.6 ns 13.19 μs +0.2%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 1000) 1.72 μs 2.5 ns 1.72 μs +0.1%
TrieBenchmark.Trie_Lookup(ItemCount: 1000) 41.15 μs 262.6 ns 40.17 μs +2.4%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 100000) 649.35 μs 1.71 μs 639.36 μs +1.6%
TrieBenchmark.Dictionary_Lookup(ItemCount: 100000) 2.77 ms 18.73 μs 2.73 ms +1.3%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 100000) 190.68 μs 222.8 ns 189.35 μs +0.7%
TrieBenchmark.Trie_Lookup(ItemCount: 100000) 9.18 ms 47.33 μs 9.01 ms +1.9%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 1000) 73.64 μs 316.6 ns 77.94 μs -5.5%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 1000) 58.50 μs 223.7 ns 54.61 μs +7.1%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 100000) 7.42 ms 11.30 μs 7.42 ms -0.0%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 100000) 9.18 ms 248.80 μs 9.43 ms -2.7%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 1000) 49.01 μs 3.55 μs 48.85 μs +0.3%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 1000) 83.04 μs 11.09 μs 79.51 μs +4.4%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 1000) 32.34 μs 4.49 μs 33.61 μs -3.8%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 1000) 116.70 μs 7.83 μs 120.16 μs -2.9%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 100000) 547.03 μs 15.40 μs 537.39 μs +1.8%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 100000) 1.27 ms 16.94 μs 1.28 ms -0.1%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.73 ms 16.90 μs 1.90 ms -8.9%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 100000) 1.62 ms 135.44 μs 1.72 ms -5.8%
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 1000) 41.91 μs 176.9 ns n/a 🆕 new
TrieBenchmark.Trie_SpanLookup(ItemCount: 1000) 43.42 μs 368.8 ns n/a 🆕 new
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 100000) 6.18 ms 56.02 μs n/a 🆕 new
TrieBenchmark.Trie_SpanLookup(ItemCount: 100000) 9.15 ms 36.71 μs n/a 🆕 new
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 1000) 10.54 μs 31.1 ns 10.44 μs +1.0%
SparseSetBenchmark.HashSet_Add(ItemCount: 1000) 7.10 μs 198.8 ns 6.69 μs +6.2%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 1000) 10.75 μs 60.8 ns 10.61 μs +1.3%
SparseSetBenchmark.SparseSet_Add(ItemCount: 1000) 6.19 μs 60.8 ns 5.79 μs +6.8%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 100000) 1.44 ms 9.44 μs 1.44 ms +0.2%
SparseSetBenchmark.HashSet_Add(ItemCount: 100000) 1.70 ms 18.53 μs 1.69 ms +0.8%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 100000) 963.41 μs 1.54 μs 962.37 μs +0.1%
SparseSetBenchmark.SparseSet_Add(ItemCount: 100000) 1.48 ms 73.53 μs 1.41 ms +4.8%
XorFilterBenchmark.HashSet_Build(ItemCount: 1000) 8.10 μs 70.2 ns 7.87 μs +2.9%
XorFilterBenchmark.XorFilter_Build(ItemCount: 1000) 40.39 μs 728.7 ns 39.57 μs +2.1%
XorFilterBenchmark.HashSet_Build(ItemCount: 100000) 2.08 ms 20.76 μs 2.06 ms +0.8%
XorFilterBenchmark.XorFilter_Build(ItemCount: 100000) 12.35 ms 225.23 μs 12.52 ms -1.4%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 1000) 5.98 μs 35.8 ns 6.02 μs -0.7%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 1000) 4.63 μs 25.3 ns 4.70 μs -1.6%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 100000) 1.39 ms 4.16 μs 1.36 ms +1.9%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 100000) 658.64 μs 7.35 μs 645.96 μs +2.0%
SparseSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.66 μs 12.2 ns 4.66 μs -0.0%
XorFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.75 μs 42.4 ns 4.75 μs -0.1%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 1000) 1.29 μs 2.9 ns 1.32 μs -2.8%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 1000) 6.77 μs 3.1 ns 6.78 μs -0.1%
SparseSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.39 ms 8.00 μs 1.37 ms +1.0%
XorFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.62 ms 8.92 μs 1.58 ms +2.3%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 100000) 259.31 μs 1.91 μs 254.17 μs +2.0%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 100000) 705.13 μs 2.60 μs 703.63 μs +0.2%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 3.4 ns 4.54 μs -0.1%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 1000) 6.77 μs 2.9 ns 6.78 μs -0.1%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.96 ms 5.87 μs 1.91 ms +2.9%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 100000) 705.78 μs 342.5 ns 705.06 μs +0.1%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 1000) 4.37 μs 7.2 ns 4.37 μs -0.0%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 1000) 10.06 μs 12.3 ns 10.07 μs -0.1%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 100000) 528.08 μs 28.63 μs 488.20 μs +8.2%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 100000) 1.97 ms 4.49 μs 1.97 ms +0.1%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 8) 169.5 ns 2.8 ns 166.5 ns +1.8%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 8) 88.3 ns 2.8 ns 86.4 ns +2.2%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 64) 802.6 ns 8.2 ns 767.9 ns +4.5%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 64) 1.10 μs 20.7 ns 1.08 μs +2.1%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.11 μs 209.9 ns 16.59 μs -15.0% ✅
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.44 μs 328.6 ns 15.03 μs -3.9%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 1000) 12.00 μs 100.0 ns 12.43 μs -3.4%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 1000) 12.81 μs 126.3 ns 11.83 μs +8.3%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.26 ms 81.01 μs 4.31 ms -1.2%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.79 ms 104.90 μs 4.72 ms +1.6%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 100000) 4.86 ms 54.30 μs 5.01 ms -3.1%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 100000) 6.70 ms 255.36 μs 6.59 ms +1.8%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 8) 36.8 ns 0.1 ns 37.0 ns -0.4%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 8) 22.8 ns 0.6 ns 26.4 ns -13.5%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 64) 296.8 ns 0.3 ns 298.2 ns -0.5%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 64) 1.11 μs 10.2 ns 1.11 μs -0.1%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.72 μs 16.9 ns 4.74 μs -0.3%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.71 μs 18.6 ns 4.71 μs +0.0%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 2.49 μs 11.8 ns 2.47 μs +0.5%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 1000) 2.72 μs 59.9 ns 2.68 μs +1.5%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.61 ms 4.51 μs 1.61 ms -0.2%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.63 ms 8.26 μs 1.60 ms +1.7%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 770.55 μs 23.52 μs 742.19 μs +3.8%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 100000) 828.32 μs 4.37 μs 824.67 μs +0.4%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 8) 1.30 μs 238.9 ns 1.30 μs -0.1%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 8) 1.34 μs 246.2 ns 1.47 μs -8.8%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 64) 4.81 μs 131.2 ns 4.91 μs -2.0%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 64) 27.53 μs 5.01 μs 24.63 μs +11.7%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 86.94 μs 8.29 μs 89.74 μs -3.1%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 81.82 μs 7.41 μs 81.61 μs +0.3%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 1000) 127.82 μs 10.85 μs 124.14 μs +3.0%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 1000) 121.46 μs 10.85 μs 115.86 μs +4.8%
SparseSetBenchmark.HashSet_Remove(ItemCount: 1000) 24.97 μs 1.32 μs 28.48 μs -12.3%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 1000) 23.75 μs 4.02 μs 26.16 μs -9.2%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.07 ms 29.95 μs 2.10 ms -1.2%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.09 ms 26.51 μs 2.08 ms +0.2%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 100000) 1.62 ms 31.94 μs 1.86 ms -12.7%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 100000) 1.83 ms 64.24 μs 1.78 ms +2.6%
SparseSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.52 ms 28.96 μs 1.49 ms +1.8%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 100000) 825.80 μs 33.21 μs 792.54 μs +4.2%
Hashers (111)
Benchmark This PR StdDev main Δ
StringHasherBenchmark.Bcl_GetHashCode(Shape: ShortAscii) 15.41 μs 40.9 ns 15.41 μs -0.0%
StringHasherBenchmark.EqualityComparer_Default(Shape: ShortAscii) 15.37 μs 11.6 ns 15.38 μs -0.1%
StringHasherBenchmark.Djb2(Shape: ShortAscii) 22.72 μs 35.8 ns 22.02 μs +3.2%
StringHasherBenchmark.Djb2A(Shape: ShortAscii) 22.74 μs 37.8 ns 22.02 μs +3.2%
StringHasherBenchmark.Sdbm(Shape: ShortAscii) 33.13 μs 33.0 ns 32.84 μs +0.9%
StringHasherBenchmark.Elf(Shape: ShortAscii) 44.82 μs 123.4 ns 44.02 μs +1.8%
StringHasherBenchmark.Crc32(Shape: ShortAscii) 50.54 μs 52.5 ns 49.88 μs +1.3%
StringHasherBenchmark.Adler32(Shape: ShortAscii) 96.55 μs 113.1 ns 96.26 μs +0.3%
StringHasherBenchmark.FnV1(Shape: ShortAscii) 27.14 μs 18.4 ns 25.35 μs +7.0%
StringHasherBenchmark.FnV1_64(Shape: ShortAscii) 25.83 μs 54.2 ns 25.15 μs +2.7%
StringHasherBenchmark.FnV1A(Shape: ShortAscii) 11.07 μs 39.8 ns 10.69 μs +3.6%
StringHasherBenchmark.FnV1A_Full(Shape: ShortAscii) 25.86 μs 16.8 ns 22.85 μs +13.1% ⚠️
StringHasherBenchmark.FnV1A_64(Shape: ShortAscii) 27.87 μs 14.8 ns 26.32 μs +5.9%
StringHasherBenchmark.JenkinsOaat(Shape: ShortAscii) 39.51 μs 33.9 ns 39.24 μs +0.7%
StringHasherBenchmark.Murmur2(Shape: ShortAscii) 15.41 μs 52.2 ns 15.18 μs +1.5%
StringHasherBenchmark.Murmur3(Shape: ShortAscii) 17.18 μs 43.2 ns 17.31 μs -0.7%
StringHasherBenchmark.XxHash32(Shape: ShortAscii) 16.90 μs 10.7 ns 16.91 μs -0.0%
StringHasherBenchmark.XxHash64(Shape: ShortAscii) 18.37 μs 9.1 ns 18.12 μs +1.4%
StringHasherBenchmark.XxHash3(Shape: ShortAscii) 15.44 μs 15.2 ns 15.03 μs +2.7%
StringHasherBenchmark.CityHash64(Shape: ShortAscii) 15.57 μs 19.7 ns 15.22 μs +2.3%
StringHasherBenchmark.MetroHash64(Shape: ShortAscii) 15.44 μs 18.5 ns 15.06 μs +2.5%
StringHasherBenchmark.SipHash13(Shape: ShortAscii) 27.64 μs 41.0 ns 27.71 μs -0.3%
StringHasherBenchmark.SipHash24(Shape: ShortAscii) 37.90 μs 19.6 ns 38.48 μs -1.5%
StringHasherBenchmark.HalfSipHash24(Shape: ShortAscii) 49.81 μs 77.2 ns 49.99 μs -0.4%
StringHasherBenchmark.HighwayHash64(Shape: ShortAscii) 436.15 μs 20.84 μs 477.46 μs -8.7%
StringHasherBenchmark.XxHash64_Hash64(Shape: ShortAscii) 17.34 μs 10.2 ns 17.13 μs +1.2%
StringHasherBenchmark.SipHash24_Hash64(Shape: ShortAscii) 37.85 μs 19.8 ns 37.76 μs +0.2%
StringHasherBenchmark.Bcl_GetHashCode(Shape: LongAscii) 96.94 μs 79.0 ns 97.00 μs -0.1%
StringHasherBenchmark.EqualityComparer_Default(Shape: LongAscii) 96.53 μs 57.8 ns 96.65 μs -0.1%
StringHasherBenchmark.Djb2(Shape: LongAscii) 223.88 μs 137.5 ns 229.34 μs -2.4%
StringHasherBenchmark.Djb2A(Shape: LongAscii) 223.86 μs 136.2 ns 229.48 μs -2.4%
StringHasherBenchmark.Sdbm(Shape: LongAscii) 308.27 μs 134.5 ns 308.23 μs +0.0%
StringHasherBenchmark.Elf(Shape: LongAscii) 578.71 μs 141.3 ns 578.10 μs +0.1%
StringHasherBenchmark.Crc32(Shape: LongAscii) 591.61 μs 311.3 ns 589.79 μs +0.3%
StringHasherBenchmark.Adler32(Shape: LongAscii) 786.88 μs 296.3 ns 788.58 μs -0.2%
StringHasherBenchmark.FnV1(Shape: LongAscii) 289.15 μs 101.4 ns 289.52 μs -0.1%
StringHasherBenchmark.FnV1_64(Shape: LongAscii) 282.96 μs 143.3 ns 282.66 μs +0.1%
StringHasherBenchmark.FnV1A(Shape: LongAscii) 123.02 μs 79.1 ns 122.28 μs +0.6%
StringHasherBenchmark.FnV1A_Full(Shape: LongAscii) 282.55 μs 157.2 ns 281.79 μs +0.3%
StringHasherBenchmark.FnV1A_64(Shape: LongAscii) 287.02 μs 358.9 ns 286.28 μs +0.3%
StringHasherBenchmark.JenkinsOaat(Shape: LongAscii) 378.63 μs 223.0 ns 378.68 μs -0.0%
StringHasherBenchmark.Murmur2(Shape: LongAscii) 101.70 μs 96.9 ns 101.97 μs -0.3%
StringHasherBenchmark.Murmur3(Shape: LongAscii) 115.76 μs 141.5 ns 113.13 μs +2.3%
StringHasherBenchmark.XxHash32(Shape: LongAscii) 73.50 μs 53.2 ns 73.16 μs +0.5%
StringHasherBenchmark.XxHash64(Shape: LongAscii) 94.45 μs 680.6 ns 90.01 μs +4.9%
StringHasherBenchmark.XxHash3(Shape: LongAscii) 82.02 μs 257.1 ns 69.91 μs +17.3% ⚠️
StringHasherBenchmark.CityHash64(Shape: LongAscii) 124.32 μs 1.33 μs 123.66 μs +0.5%
StringHasherBenchmark.MetroHash64(Shape: LongAscii) 74.73 μs 243.1 ns 74.31 μs +0.6%
StringHasherBenchmark.SipHash13(Shape: LongAscii) 117.14 μs 162.7 ns 115.20 μs +1.7%
StringHasherBenchmark.SipHash24(Shape: LongAscii) 162.52 μs 669.9 ns 161.36 μs +0.7%
StringHasherBenchmark.HalfSipHash24(Shape: LongAscii) 250.93 μs 181.3 ns 247.61 μs +1.3%
StringHasherBenchmark.HighwayHash64(Shape: LongAscii) 867.24 μs 43.58 μs 820.39 μs +5.7%
StringHasherBenchmark.XxHash64_Hash64(Shape: LongAscii) 88.11 μs 1.52 μs 88.71 μs -0.7%
StringHasherBenchmark.SipHash24_Hash64(Shape: LongAscii) 162.39 μs 261.4 ns 161.68 μs +0.4%
StringHasherBenchmark.Bcl_GetHashCode(Shape: NonAscii) 22.88 μs 18.3 ns 22.88 μs +0.0%
StringHasherBenchmark.EqualityComparer_Default(Shape: NonAscii) 22.84 μs 22.6 ns 22.84 μs +0.0%
StringHasherBenchmark.Djb2(Shape: NonAscii) 43.05 μs 29.9 ns 43.42 μs -0.9%
StringHasherBenchmark.Djb2A(Shape: NonAscii) 43.05 μs 34.3 ns 43.46 μs -0.9%
StringHasherBenchmark.Sdbm(Shape: NonAscii) 61.70 μs 70.7 ns 61.57 μs +0.2%
StringHasherBenchmark.Elf(Shape: NonAscii) 100.25 μs 254.2 ns 99.64 μs +0.6%
StringHasherBenchmark.Crc32(Shape: NonAscii) 103.53 μs 50.9 ns 102.70 μs +0.8%
StringHasherBenchmark.Adler32(Shape: NonAscii) 174.53 μs 132.4 ns 175.63 μs -0.6%
StringHasherBenchmark.FnV1(Shape: NonAscii) 48.40 μs 55.4 ns 47.67 μs +1.5%
StringHasherBenchmark.FnV1_64(Shape: NonAscii) 50.23 μs 56.0 ns 49.76 μs +1.0%
StringHasherBenchmark.FnV1A(Shape: NonAscii) 22.07 μs 53.5 ns 21.75 μs +1.5%
StringHasherBenchmark.FnV1A_Full(Shape: NonAscii) 46.13 μs 66.7 ns 45.06 μs +2.4%
StringHasherBenchmark.FnV1A_64(Shape: NonAscii) 50.07 μs 52.8 ns 49.43 μs +1.3%
StringHasherBenchmark.JenkinsOaat(Shape: NonAscii) 73.34 μs 53.4 ns 73.17 μs +0.2%
StringHasherBenchmark.Murmur2(Shape: NonAscii) 27.07 μs 129.8 ns 27.32 μs -0.9%
StringHasherBenchmark.Murmur3(Shape: NonAscii) 31.62 μs 99.2 ns 31.88 μs -0.8%
StringHasherBenchmark.XxHash32(Shape: NonAscii) 23.88 μs 28.4 ns 23.91 μs -0.2%
StringHasherBenchmark.XxHash64(Shape: NonAscii) 30.06 μs 42.6 ns 29.24 μs +2.8%
StringHasherBenchmark.XxHash3(Shape: NonAscii) 23.69 μs 31.6 ns 22.82 μs +3.8%
StringHasherBenchmark.CityHash64(Shape: NonAscii) 22.29 μs 33.1 ns 22.02 μs +1.2%
StringHasherBenchmark.MetroHash64(Shape: NonAscii) 25.88 μs 30.1 ns 25.65 μs +0.9%
StringHasherBenchmark.SipHash13(Shape: NonAscii) 37.91 μs 117.6 ns 36.45 μs +4.0%
StringHasherBenchmark.SipHash24(Shape: NonAscii) 50.08 μs 63.3 ns 52.00 μs -3.7%
StringHasherBenchmark.HalfSipHash24(Shape: NonAscii) 73.83 μs 1.35 μs 73.20 μs +0.9%
StringHasherBenchmark.HighwayHash64(Shape: NonAscii) 491.08 μs 16.02 μs 505.69 μs -2.9%
StringHasherBenchmark.XxHash64_Hash64(Shape: NonAscii) 29.10 μs 229.8 ns 28.32 μs +2.7%
StringHasherBenchmark.SipHash24_Hash64(Shape: NonAscii) 51.47 μs 481.2 ns 49.85 μs +3.3%
IntegerHasherBenchmark.Guid_Bcl 1.27 μs 4.6 ns 1.26 μs +0.5%
IntegerHasherBenchmark.Guid_EqualityComparer 3.47 μs 2.1 ns 3.49 μs -0.4%
IntegerHasherBenchmark.Guid_Celerity 8.50 μs 15.2 ns 8.51 μs -0.2%
IntegerHasherBenchmark.Guid_Celerity_Hash64 8.04 μs 12.5 ns 8.04 μs +0.1%
IntegerHasherBenchmark.Int32_Bcl 705.1 ns 1.7 ns 685.8 ns +2.8%
IntegerHasherBenchmark.Int32_EqualityComparer 708.7 ns 3.1 ns 704.4 ns +0.6%
IntegerHasherBenchmark.Int32_Identity 690.5 ns 4.4 ns 686.4 ns +0.6%
IntegerHasherBenchmark.Int32_WangNaive 1.25 μs 0.8 ns 1.25 μs +0.0%
IntegerHasherBenchmark.Int32_Wang 3.03 μs 2.4 ns 3.03 μs -0.0%
IntegerHasherBenchmark.Int32_Murmur3 2.65 μs 4.0 ns 2.65 μs +0.1%
IntegerHasherBenchmark.Int64_Bcl 1.27 μs 1.0 ns 1.27 μs -0.0%
IntegerHasherBenchmark.Int64_EqualityComparer 1.25 μs 0.6 ns 1.25 μs -0.0%
IntegerHasherBenchmark.Int64_Identity 683.2 ns 7.8 ns 684.1 ns -0.1%
IntegerHasherBenchmark.Int64_WangNaive 1.87 μs 0.9 ns 1.87 μs -0.0%
IntegerHasherBenchmark.Int64_Wang 4.16 μs 4.2 ns 4.16 μs -0.1%
IntegerHasherBenchmark.Int64_Murmur3 2.37 μs 1.0 ns 2.37 μs +0.0%
IntegerHasherBenchmark.Int64_Wang_Hash64 4.16 μs 2.4 ns 4.16 μs -0.1%
IntegerHasherBenchmark.Int64_Murmur3_Hash64 2.37 μs 2.1 ns 2.37 μs +0.0%
IntegerHasherBenchmark.UInt32_Bcl 685.0 ns 0.6 ns 685.3 ns -0.1%
IntegerHasherBenchmark.UInt32_EqualityComparer 700.9 ns 1.7 ns 698.6 ns +0.3%
IntegerHasherBenchmark.UInt32_Default 1.25 μs 0.5 ns 1.25 μs -0.0%
IntegerHasherBenchmark.UInt32_Wang 3.02 μs 2.7 ns 3.02 μs -0.0%
IntegerHasherBenchmark.UInt32_Murmur3 2.65 μs 1.7 ns 2.64 μs +0.1%
IntegerHasherBenchmark.UInt64_Bcl 1.37 μs 104.2 ns 1.37 μs -0.5%
IntegerHasherBenchmark.UInt64_EqualityComparer 1.25 μs 0.4 ns 1.25 μs -0.0%
IntegerHasherBenchmark.UInt64_Default 2.37 μs 2.7 ns 2.37 μs +0.0%
IntegerHasherBenchmark.UInt64_Wang 4.16 μs 2.2 ns 4.16 μs -0.1%
IntegerHasherBenchmark.UInt64_WangNaive 1.87 μs 1.9 ns 1.87 μs +0.0%
IntegerHasherBenchmark.UInt64_Default_Hash64 2.37 μs 1.9 ns 2.37 μs -0.0%
IntegerHasherBenchmark.UInt64_Wang_Hash64 4.16 μs 2.6 ns 4.16 μs -0.0%

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.

@marius-bughiu
marius-bughiu merged commit 9610e9a into main Jul 29, 2026
17 checks passed
@marius-bughiu
marius-bughiu deleted the feat/issue-311-span-keyed-lookups branch July 29, 2026 06:29
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.

Span-keyed lookups on the string-keyed collections + a span-keyed intern table

2 participants