Skip to content

fix(Deque): a Clear() that removes nothing no longer invalidates enumerators - #334

Merged
marius-bughiu merged 5 commits into
mainfrom
fix/issue-333-deque-clear-noop-version
Jul 30, 2026
Merged

fix(Deque): a Clear() that removes nothing no longer invalidates enumerators#334
marius-bughiu merged 5 commits into
mainfrom
fix/issue-333-deque-clear-noop-version

Conversation

@marius-bughiu

Copy link
Copy Markdown
Owner

Closes #333.

The bug

Deque<T>.Clear() bumped _version outside the guard that skips the array clearing, so clearing an already-empty deque invalidated every live enumerator. It was the only count-based collection in the library that did this — the other 28 return early on an empty collection and never touch _version. It also contradicted Deque's own documented contract, which describes the enumerator guard as a check for a structural modification and separately notes that an indexer set does not invalidate.

Narrow in practice (you have to Clear() an already-empty deque mid-enumeration to see it), but it is exactly the kind of family-wide invariant that drifts silently when nothing pins it.

The decision

Option A of the issue: align Deque with the rest of the family. The BCL is not a tiebreaker — Dictionary<K,V>.Clear() bumps only when non-empty, while Queue<T> and Stack<T> bump unconditionally, and Deque is the queue-shaped one. Celerity's own family points only one way, and the library is otherwise strict about it (FenwickTree documents a zero delta as a no-op, BTreeDictionary a rejected duplicate TryAdd, LruCache a hit on the already-MRU entry).

The old code also reset _head = 0 unconditionally. That was pure normalization — with _count == 0 no reader consults _head, and the next push writes relative to it either way — so skipping it changes nothing observable. A test covers the drained-by-popping shape where the head is parked mid-buffer to prove that.

Clearing a populated deque still invalidates enumerators, exactly as before.

Parity rollout

Fixsrc/Celerity/Collections/Deque.cs: the bump moves inside the guard, which becomes an early return; the XML doc states the no-op contract.

Dedicated testsDequeEnumerationTests.cs gains three:

  • Clear_ShouldNotInvalidateEnumerator_WhenTheDequeIsAlreadyEmpty — the regression, across all three ways a deque reaches empty (never populated, emptied by a prior Clear(), drained by popping).
  • Clear_ShouldInvalidateEnumerator_WhenTheDequeHeldElements — the positive control, so the fix cannot degenerate into "never bump".
  • Clear_ShouldReleaseEveryOccupiedSlot_WhenTheLayoutIsWrapped — guards the early-out against being hoisted above the two reference-releasing Array.Clear runs.

Cross-collection shared suite — new ClearNoOpVersionTests.cs. The rule was previously pinned per-collection for a handful of types (EnumeratorInvalidationAndClearCoverageTests), which is how the outlier shipped. This asserts it once per collection for all 29 count-based version-tracking types — every hashed dictionary and set, BTreeDictionary / BTreeSet, EnumMap / EnumSet, Trie, SparseSet, DisjointSet, StringInternTable, CelerityMultiMap / CelerityMultiSet, LruCache, IndexedPriorityQueue, Deque — each driven through the three states that matter (never populated → populated → emptied by a preceding Clear()). Enumerators are taken through the non-generic IEnumerator so one helper covers every element shape in the family.

It also pins the two deliberate exceptions: BitSet and FenwickTree are fixed-length, so establishing "already empty" means scanning every word — the same work as the unconditional clear it would be trying to skip. Both bump every time, they agree with each other, and the tests say so explicitly, so the behaviour reads as a decision rather than as the same oversight repeated. The five probabilistic sketches are out of scope: they track no version and expose no enumerator, so a redundant Clear() has nothing to invalidate.

Docsdocs/api/collections.md Deque<T> Clear() entry states the no-op contract (the surrounding sections already state the analogous rule for FenwickTree and BTreeDictionary). docs/testing.md gains a "family-wide invariant suites" bullet describing the new category and why it exists.

CHANGELOG — two bullets under [Unreleased]Fixed, one for the behaviour fix and one for the family-wide suite.

ROADMAP — rostered under milestone 2.4.0, "drop-in parity and correctness in the shipped surface", status done, recording the Option A rationale and the two exceptions.

Parity items that do not apply

  • Benchmarks + Program.cs registration — no new type and no new public API; the change is one branch on an empty-Clear() path, which no benchmark measures and which cannot move a number.
  • Dashboard wiring (web/index.html, web/dev/bench/{index,detail}.html) — the COLLECTIONS arrays and ship cards key off collections, and Deque is already listed in all three.
  • README.md — its Deque<T> entries (collections list, "Sequences" section, decision table) describe shape and performance, not per-method enumerator semantics; nothing there was made stale. Enumerator-invalidation detail belongs in the API reference, where it now lives.

Test plan

  • dotnet build — 0 errors; the new files add no warnings.
  • dotnet test5088 passed, 0 failed on each of net8.0 / net9.0 / net10.0, plus the three showcase projects (46 + 37 + 30), all green.
  • Both regression tests confirmed failing on unfixed code: stashing only the Deque.cs change makes DequeClear_ShouldNotBumpTheVersion_WhenAlreadyEmpty and Clear_ShouldNotInvalidateEnumerator_WhenTheDequeIsAlreadyEmpty fail while the two positive controls still pass.
  • CI matrix (build + test on Windows / Linux / macOS across all three TFMs, coverage gate at 100% line and branch, Native AOT publish smoke test, release gates). The new early-return branch is covered from both sides, so the branch gate should hold.
  • Benchmarks CI job — expected to be a no-op for this change; the gh-pages dashboard refresh on main needs no new card, since Deque is already charted.

🤖 Generated with Claude Code

…erators

Deque<T>.Clear() bumped _version outside the guard that skips the array
clearing, so clearing an already-empty deque tore down every live
enumerator. It was the only count-based collection in the library that did
this: the other 28 return early on an empty collection and never touch
_version. It also contradicted Deque's own documented contract, which calls
the enumerator guard a check for "structural modification" and separately
notes that an indexer set does not invalidate.

Option A of the issue: match Celerity's own family rather than the BCL,
which points both ways (Dictionary<K,V>.Clear() bumps only when non-empty
while Queue<T> / Stack<T> bump unconditionally). Resetting _head on an empty
deque was pure normalization and is not observable through the public
surface, so skipping it changes nothing else.

The rule was previously pinned only per-collection, for a handful of types,
which is how the outlier shipped. ClearNoOpVersionTests now asserts it once
per count-based collection (29 of them), each in all three states that
matter: never populated, populated, and emptied by a preceding Clear(). It
also pins the two deliberate exceptions - BitSet and FenwickTree are
fixed-length, so establishing "already empty" costs the same scan as the
unconditional clear it would skip - so they read as a decision rather than
as the same oversight repeated. The probabilistic sketches track no version
and expose no enumerator, so they are out of scope.

Closes #333

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 30, 2026 01:16
…ion suites

The parity expectation listed the per-layer coverage (behavioural, CsCheck,
fuzz) but not the family-wide invariant suites, which is the gap that let
Deque ship without the no-op-Clear() row.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

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 fixes an enumerator-invalidation edge case in Deque<T>.Clear() by ensuring that a no-op Clear() on an already-empty deque does not bump the internal version, aligning Deque with the established behavior across the rest of Celerity’s count-based collections. It also adds both dedicated regression/behavior tests and a new cross-collection invariant suite to prevent this contract from drifting again, plus accompanying documentation updates.

Changes:

  • Move Deque<T>.Clear()’s version bump behind an early-return for the empty case, so an empty no-op clear no longer invalidates enumerators.
  • Add focused Deque enumeration/clear tests and a new family-wide ClearNoOpVersionTests suite covering all count-based, version-tracked collections (with documented exceptions).
  • Update docs/roadmap/changelog to document the contract and the new invariant suite coverage.

Reviewed changes

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

Show a summary per file
File Description
src/Celerity/Collections/Deque.cs Fix Clear() so empty clears are true no-ops (no version bump).
src/Celerity.Tests/Collections/DequeEnumerationTests.cs Add regression + behavioral tests for enumerator validity and slot clearing.
src/Celerity.Tests/Collections/ClearNoOpVersionTests.cs Add cross-collection invariant suite for no-op Clear() version behavior.
ROADMAP.md Record the parity/correctness item as done with rationale and exceptions.
docs/testing.md Document the “family-wide invariant suites” testing category.
docs/api/collections.md Document Deque<T>.Clear() no-op enumerator contract.
CONTRIBUTING.md Add contributor guidance about adding new collections to cross-collection suites.
CHANGELOG.md Add release notes for the fix and the new invariant suite.

Comment thread src/Celerity/Collections/Deque.cs Outdated
Comment thread CHANGELOG.md Outdated
Copilot AI review requested due to automatic review settings July 30, 2026 01:20
@github-actions

Copy link
Copy Markdown

Coverage

Metric Value
Line 100% (10135/10135)
Branch 100% (3986/3986)

- Deque.Clear()'s early-return comment now says "no observable state to
  reset": _head can be non-zero while _count is 0 (after a drain by
  popping), and the old wording read as if it could not.
- The _version field comment no longer implies clear/trim always bump; both
  return early when there is nothing to do.
- Tightened the two CHANGELOG bullets to observable behaviour, dropping the
  test-suite and guard-placement internals that belong in the PR body.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

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

Comments suppressed due to low confidence (2)

src/Celerity.Tests/Collections/DequeEnumerationTests.cs:175

  • This test claims to verify that Clear() releases references by reaching both Array.Clear runs in a wrapped layout, but the assertions only check logical behavior (Count == 0, Contains/enumeration). Those would still pass even if Clear() forgot to clear the underlying slots, leaving stale references pinned for GC. Consider asserting the backing array contents are reset to default for the occupied physical indices (e.g., via reflection on the private _items/_head fields) so the test actually pins the reference-release behavior it describes.
        // Guards the early-out against being placed above the reference-releasing Array.Clear calls: a wrapped
        // layout clears two runs, and both must still be reached for a non-empty deque.
        var deque = new Deque<string>(4);
        deque.PushBack("b");
        deque.PushBack("c");

CHANGELOG.md:30

  • These new CHANGELOG bullets read more like implementation notes than the brief, user-facing entries required by the CONTRIBUTING “Changelog entries” guidance (“a few sentences at most”, avoid private-field/implementation detail). Can these be condensed to the observable behavior change + the existence of the new family-wide test suite (keeping the rationale/details in the PR body)?
- `Deque<T>.Clear()` no longer invalidates active enumerators when the deque is already empty. It was the only count-based collection where a `Clear()` that removed nothing tore down live enumerators, so a defensive clear mid-enumeration threw. Clearing a populated deque still invalidates them, as before. Closes [#333](https://github.com/marius-bughiu/Celerity/issues/333).
- The no-op-`Clear()` contract is now pinned across the whole collection family by a new cross-collection test suite, so it cannot drift again. Closes [#333](https://github.com/marius-bughiu/Celerity/issues/333).

Copilot AI review requested due to automatic review settings July 30, 2026 01:24

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

Comments suppressed due to low confidence (1)

src/Celerity.Tests/Collections/DequeEnumerationTests.cs:170

  • Clear_ShouldReleaseEveryOccupiedSlot_WhenTheLayoutIsWrapped aims to guard that Clear() actually releases references via Array.Clear, but the current assertions (Contains("a") / Assert.Empty(deque)) don't verify that: once Count is 0, Contains and enumeration never inspect the underlying slots, so the test would still pass even if the backing array retained stale references. Consider asserting the backing array slots are cleared (for this setup, all slots should be null after Clear()).
        Assert.Equal(0, deque.Count);
        Assert.Equal(capacityBefore, deque.Capacity);
        Assert.False(deque.Contains("a"));
        Assert.Empty(deque);

The wrapped-layout test asserted only logical state (Count, Contains,
enumeration), all of which still hold if Clear() skips the Array.Clear runs
entirely - with _count at 0 no reader consults the slots, so a leaked
reference is invisible through the public surface. The test's name promised
more than it checked.

It now reads the private _items array and asserts every physical slot is
null. Verified to have teeth: commenting out the Array.Clear calls fails it
with 3 of 4 slots non-null, where the logical assertions all still passed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 30, 2026 01:28
@marius-bughiu

Copy link
Copy Markdown
Owner Author

Round-2 review came back with no new inline comments but two findings suppressed as low confidence. Both read, both answered — noting them here since a suppressed finding has no thread to reply on.

1. DequeEnumerationTests.cs:175 — "the wrapped-layout test does not actually pin reference release." Correct, and fixed in a67e978.

This one was right and worth acting on. The test asserted Count == 0, Contains, and Empty(deque) — every one of which still holds if Clear() skips the Array.Clear runs entirely, because with _count at 0 no reader consults the slots. A leaked reference is invisible through the public surface, so the test's name promised more than it checked.

It now reads the private _items array and asserts every physical slot is null. I verified it has teeth rather than assuming: commenting out the three Array.Clear calls fails it with Assert.All() Failure: 3 out of 4 items, while all the logical assertions still passed — exactly the hole described.

Reflecting on a private field is a new precedent for this suite (the existing reflection in HashProvider64ContractTests and IndexerReturnTypeTests only walks public surface), and the sibling DisjointSetClear_ShouldReleaseElementsAndResetPartition_… / IndexedPriorityQueueClear_ShouldReleaseElementsAndPriorities_… tests in EnumeratorInvalidationAndClearCoverageTests have the same gap. I took the precedent deliberately: there is no public observation of reference release, so the alternative was to rename the test to stop claiming it. The helper asserts the field was found so a future rename of _items fails with a clear message rather than a NullReferenceException. Maintainer call: whether to retrofit the same assertion onto those two sibling tests — I left them alone rather than widen this PR.

2. CHANGELOG.md:30 — "condense to observable behaviour + the new suite." Already done in 8fc277c; this is the same finding as the round-1 inline comment, re-flagged against the text that had just replaced it.

The quoted snippet is the tightened version. As it now stands the first bullet is three sentences of observable behaviour and the second is one line noting the contract is pinned by a cross-collection suite — no private fields, no guard placement, no test-suite internals; those all live in this PR body. I read it as satisfying both the "few sentences at most" bar and the reason that rule exists (release.yml extracts the section verbatim as the release body, and this repo has overrun the size cap before). No further change; happy to cut the second bullet entirely if you'd rather the changelog carry only the behaviour change.

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

@github-actions

Copy link
Copy Markdown

Benchmarks

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

Highlights

Benchmark This PR StdDev main Δ
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 1000) 3.30 ms 276.56 μs 2.61 ms +26.7% ⚠️
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 1000) 80.49 μs 2.26 μs 89.77 μs -10.3% ✅
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 100000) 831.95 μs 219.36 μs 1.29 ms -35.4% ✅
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 100000) 1.85 ms 145.97 μs 1.64 ms +12.2% ⚠️
SmallSetBenchmark.HashSet_Add(ItemCount: 64) 811.5 ns 13.4 ns 737.7 ns +10.0% ⚠️
TrieBenchmark.Trie_PrefixMatch(ItemCount: 100000) 8.98 ms 126.85 μs 7.80 ms +15.2% ⚠️
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 3.21 ms 183.40 μs 2.38 ms +34.7% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 100000) 2.51 ms 101.09 μs 2.01 ms +25.3% ⚠️
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 100000) 6.50 ms 97.54 μs 5.83 ms +11.5% ⚠️
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 64) 22.05 μs 631.8 ns 28.20 μs -21.8% ✅
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 1000) 4.73 μs 8.6 ns 7.08 μs -33.2% ✅
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 100000) 525.24 μs 726.6 ns 714.21 μs -26.5% ✅
DequeBenchmark.LinkedList_PushFront(ItemCount: 1000) 27.56 μs 1.39 μs 31.37 μs -12.2% ✅
SwissSetBenchmark.HashSet_Remove(ItemCount: 1000) 25.40 μs 2.00 μs 20.67 μs +22.8% ⚠️
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 100000) 2.16 ms 1.54 ms 4.95 ms -56.4% ✅
Collections (508)
Benchmark This PR StdDev main Δ
BloomFilterBenchmark.HashSet_Add(ItemCount: 1000) 12.40 μs 291.1 ns 12.85 μs -3.6%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 1000) 14.49 μs 22.3 ns 14.49 μs -0.1%
BloomFilterBenchmark.HashSet_Add(ItemCount: 100000) 4.70 ms 158.26 μs 4.82 ms -2.4%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 100000) 1.10 ms 4.39 μs 1.11 ms -0.6%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 1000) 167.53 μs 464.6 ns 164.44 μs +1.9%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 1000) 3.30 ms 276.56 μs 2.61 ms +26.7% ⚠️
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 100000) 29.94 ms 529.19 μs 29.84 ms +0.3%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 100000) 1.53 s 69.09 ms 1.45 s +5.8%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.75 μs 37.4 ns 4.73 μs +0.4%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 1000) 6.90 μs 18.2 ns 6.88 μs +0.4%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 1000) 12.52 μs 5.4 ns 12.52 μs -0.0%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 1000) 92.44 μs 3.40 μs 88.08 μs +4.9%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.53 ms 65.46 μs 1.60 ms -4.2%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 100000) 2.00 ms 15.56 μs 1.94 ms +2.8%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 100000) 870.52 μs 865.4 ns 869.86 μs +0.1%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 100000) 7.26 ms 166.90 μs 7.35 ms -1.2%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.55 μs 6.0 ns 4.54 μs +0.1%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 1000) 3.53 μs 10.7 ns 3.53 μs -0.0%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.95 ms 7.64 μs 1.91 ms +2.1%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 100000) 1.49 ms 1.42 μs 1.49 ms +0.0%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 1000) 10.42 μs 36.3 ns 10.16 μs +2.6%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 1000) 5.47 μs 146.0 ns 5.41 μs +1.2%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 100000) 1.46 ms 10.44 μs 1.46 ms +0.4%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 100000) 728.79 μs 3.43 μs 756.54 μs -3.7%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.91 μs 492.9 ns 15.58 μs -10.7%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 1000) 29.84 μs 498.6 ns 29.05 μs +2.7%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.68 ms 163.76 μs 4.61 ms +1.5%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 100000) 4.01 ms 33.44 μs 3.93 ms +2.1%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.54 μs 149.7 ns 4.50 μs +0.7%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.73 μs 10.9 ns 4.71 μs +0.2%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 1000) 1.72 μs 2.8 ns 1.73 μs -0.2%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 1000) 3.01 μs 6.9 ns 2.97 μs +1.3%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 100000) 642.29 μs 22.63 μs 613.72 μs +4.7%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.61 ms 5.12 μs 1.59 ms +0.9%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 100000) 190.82 μs 102.8 ns 191.60 μs -0.4%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 100000) 810.96 μs 6.44 μs 794.10 μs +2.1%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 1000) 185.09 μs 1.63 μs 182.52 μs +1.4%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 1000) 11.05 μs 110.4 ns 11.01 μs +0.4%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 100000) 169.74 ms 2.58 ms 167.27 ms +1.5%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 100000) 640.92 μs 18.58 μs 619.84 μs +3.4%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 1000) 221.10 μs 363.8 ns 221.44 μs -0.2%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 1000) 7.46 μs 8.1 ns 7.46 μs +0.0%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 100000) 202.32 ms 20.81 ms 208.81 ms -3.1%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 100000) 325.35 μs 1.32 μs 324.88 μs +0.1%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 1000) 55.50 μs 6.68 μs 53.50 μs +3.7%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 88.84 μs 11.55 μs 80.70 μs +10.1%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 1000) 80.49 μs 2.26 μs 89.77 μs -10.3% ✅
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 1000) 73.75 μs 1.83 μs 73.13 μs +0.9%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 100000) 541.10 μs 9.96 μs 567.84 μs -4.7%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.15 ms 50.21 μs 2.06 ms +4.8%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 100000) 831.95 μs 219.36 μs 1.29 ms -35.4% ✅
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 100000) 1.85 ms 145.97 μs 1.64 ms +12.2% ⚠️
EnumMapBenchmark.Dictionary_Add 625.9 ns 16.6 ns 616.9 ns +1.4%
EnumSetBenchmark.HashSet_Add 577.5 ns 15.5 ns 594.5 ns -2.9%
EnumMapBenchmark.EnumMap_Add 153.8 ns 3.1 ns 154.8 ns -0.7%
EnumSetBenchmark.EnumSet_Add 84.3 ns 0.8 ns 86.0 ns -2.0%
SmallSetBenchmark.HashSet_Add(ItemCount: 8) 185.5 ns 8.9 ns 171.6 ns +8.1%
SmallSetBenchmark.SmallSet_Add(ItemCount: 8) 48.9 ns 0.6 ns 47.2 ns +3.5%
SmallSetBenchmark.HashSet_Add(ItemCount: 64) 811.5 ns 13.4 ns 737.7 ns +10.0% ⚠️
SmallSetBenchmark.SmallSet_Add(ItemCount: 64) 1.95 μs 294.4 ns 1.65 μs +18.2%
TrieBenchmark.Dictionary_Add(ItemCount: 1000) 45.58 μs 1.82 μs 43.36 μs +5.1%
TrieBenchmark.Trie_Add(ItemCount: 1000) 559.71 μs 16.42 μs 539.77 μs +3.7%
TrieBenchmark.Dictionary_Add(ItemCount: 100000) 5.26 ms 1.39 ms 4.93 ms +6.7%
TrieBenchmark.Trie_Add(ItemCount: 100000) 26.64 ms 508.23 μs 26.17 ms +1.8%
RankSelectBitVectorBenchmark.Array_Build(ItemCount: 1024) 91.5 ns 0.4 ns 91.1 ns +0.3%
RankSelectBitVectorBenchmark.RankSelectBitVector_Build(ItemCount: 1024) 61.2 ns 1.5 ns 57.8 ns +6.0%
RankSelectBitVectorBenchmark.Array_Build(ItemCount: 1000000) 67.21 μs 510.4 ns 66.73 μs +0.7%
RankSelectBitVectorBenchmark.RankSelectBitVector_Build(ItemCount: 1000000) 87.05 μs 730.2 ns 86.22 μs +1.0%
EnumSetBenchmark.HashSet_Contains 175.5 ns 0.3 ns 175.2 ns +0.1%
EnumSetBenchmark.EnumSet_Contains 45.9 ns 0.0 ns 46.0 ns -0.1%
SmallSetBenchmark.HashSet_Contains(ItemCount: 8) 37.2 ns 0.0 ns 37.2 ns -0.1%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 8) 18.9 ns 0.1 ns 18.9 ns +0.1%
SmallSetBenchmark.HashSet_Contains(ItemCount: 64) 321.7 ns 21.8 ns 299.9 ns +7.3%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 64) 1.09 μs 12.9 ns 1.09 μs -0.5%
EnumMapBenchmark.Dictionary_Enumerate 50.5 ns 0.0 ns 50.5 ns +0.1%
EnumMapBenchmark.EnumMap_Enumerate 39.7 ns 0.0 ns 39.8 ns -0.2%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 1000) 31.49 μs 371.7 ns 32.21 μs -2.2%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 1000) 40.61 μs 466.2 ns 41.23 μs -1.5%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 100000) 12.85 ms 115.15 μs 12.63 ms +1.7%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 100000) 17.68 ms 246.16 μs 17.27 ms +2.4%
EnumMapBenchmark.Dictionary_Lookup 117.7 ns 0.1 ns 117.6 ns +0.1%
EnumMapBenchmark.EnumMap_Lookup 64.4 ns 0.4 ns 64.3 ns +0.1%
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.01 μs 26.8 ns 5.02 μs -0.2%
TrieBenchmark.Dictionary_Lookup(ItemCount: 1000) 13.03 μs 596.7 ns 13.01 μs +0.2%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 1000) 2.35 μs 1.8 ns 2.36 μs -0.4%
TrieBenchmark.Trie_Lookup(ItemCount: 1000) 41.35 μs 367.8 ns 41.32 μs +0.1%
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.78 ms 13.33 μs 1.78 ms -0.0%
TrieBenchmark.Dictionary_Lookup(ItemCount: 100000) 2.66 ms 77.92 μs 2.67 ms -0.6%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 100000) 753.34 μs 8.39 μs 739.61 μs +1.9%
TrieBenchmark.Trie_Lookup(ItemCount: 100000) 8.70 ms 329.25 μs 8.73 ms -0.3%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 1000) 77.10 μs 4.41 μs 73.80 μs +4.5%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 1000) 58.67 μs 220.5 ns 58.74 μs -0.1%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 100000) 7.41 ms 6.79 μs 7.40 ms +0.1%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 100000) 8.98 ms 126.85 μs 7.80 ms +15.2% ⚠️
RankSelectBitVectorBenchmark.Array_RankEarly(ItemCount: 1024) 1.23 μs 1.8 ns 1.23 μs -0.0%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankEarly(ItemCount: 1024) 1.88 μs 0.5 ns 1.88 μs -0.0%
RankSelectBitVectorBenchmark.Array_RankEarly(ItemCount: 1000000) 32.74 μs 78.6 ns 32.72 μs +0.1%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankEarly(ItemCount: 1000000) 1.88 μs 1.2 ns 1.88 μs -0.0%
RankSelectBitVectorBenchmark.Array_RankLate(ItemCount: 1024) 6.44 μs 5.5 ns 6.45 μs -0.2%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankLate(ItemCount: 1024) 1.88 μs 0.6 ns 1.88 μs -0.1%
RankSelectBitVectorBenchmark.Array_RankLate(ItemCount: 1000000) 4.86 ms 3.71 μs 4.87 ms -0.1%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankLate(ItemCount: 1000000) 1.96 μs 1.0 ns 1.88 μs +4.7%
RankSelectBitVectorBenchmark.Array_RankMid(ItemCount: 1024) 4.86 μs 6.4 ns 4.86 μs -0.1%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankMid(ItemCount: 1024) 1.88 μs 1.2 ns 1.88 μs -0.1%
RankSelectBitVectorBenchmark.Array_RankMid(ItemCount: 1000000) 2.47 ms 3.10 μs 2.47 ms +0.0%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankMid(ItemCount: 1000000) 1.88 μs 1.2 ns 1.88 μs +0.0%
EnumMapBenchmark.Dictionary_Remove 3.63 μs 479.4 ns 3.64 μs -0.2%
EnumSetBenchmark.HashSet_Remove 3.24 μs 372.3 ns 3.36 μs -3.6%
EnumMapBenchmark.EnumMap_Remove 1.46 μs 66.5 ns 1.52 μs -3.7%
EnumSetBenchmark.EnumSet_Remove 1.26 μs 285.7 ns 1.10 μs +14.4%
SmallSetBenchmark.HashSet_Remove(ItemCount: 8) 481.3 ns 65.0 ns 479.4 ns +0.4%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 8) 1.22 μs 74.3 ns 1.16 μs +4.8%
SmallSetBenchmark.HashSet_Remove(ItemCount: 64) 1.39 μs 101.7 ns 1.32 μs +5.2%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 64) 29.87 μs 1.37 μs 25.10 μs +19.0%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 1000) 28.26 μs 1.19 μs 32.69 μs -13.6%
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 1000) 127.92 μs 11.61 μs 124.73 μs +2.6%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 3.21 ms 183.40 μs 2.38 ms +34.7% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 100000) 2.51 ms 101.09 μs 2.01 ms +25.3% ⚠️
RankSelectBitVectorBenchmark.Array_Select(ItemCount: 1024) 13.00 μs 45.0 ns 12.99 μs +0.1%
RankSelectBitVectorBenchmark.RankSelectBitVector_Select(ItemCount: 1024) 11.41 μs 34.9 ns 11.14 μs +2.5%
RankSelectBitVectorBenchmark.Array_Select(ItemCount: 1000000) 4.23 ms 3.92 μs 4.23 ms -0.0%
RankSelectBitVectorBenchmark.RankSelectBitVector_Select(ItemCount: 1000000) 25.40 μs 26.6 ns 25.77 μs -1.4%
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 1000) 41.90 μs 263.7 ns 42.85 μs -2.2%
TrieBenchmark.Trie_SpanLookup(ItemCount: 1000) 43.01 μs 390.9 ns 43.22 μs -0.5%
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 100000) 6.50 ms 97.54 μs 5.83 ms +11.5% ⚠️
TrieBenchmark.Trie_SpanLookup(ItemCount: 100000) 9.08 ms 39.29 μs 8.97 ms +1.3%
EnumSetBenchmark.HashSet_Union 469.4 ns 55.6 ns 425.3 ns +10.4%
EnumSetBenchmark.EnumSet_Union 21.3 ns 0.1 ns 23.1 ns -8.0%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 1000) 67.02 μs 817.1 ns 65.25 μs +2.7%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 1000) 12.32 μs 352.0 ns 11.88 μs +3.7%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 1000) 53.45 μs 536.8 ns 53.55 μs -0.2%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 1000) 27.15 μs 52.2 ns 26.86 μs +1.1%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 100000) 23.50 ms 120.24 μs 23.65 ms -0.7%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 100000) 4.85 ms 74.13 μs 4.83 ms +0.4%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 100000) 16.20 ms 197.68 μs 16.20 ms +0.0%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 100000) 575.44 μs 791.5 ns 575.06 μs +0.1%
XorFilterBenchmark.HashSet_Build(ItemCount: 1000) 7.80 μs 45.2 ns 7.74 μs +0.7%
XorFilterBenchmark.XorFilter_Build(ItemCount: 1000) 38.40 μs 458.0 ns 38.51 μs -0.3%
XorFilterBenchmark.HashSet_Build(ItemCount: 100000) 2.08 ms 24.99 μs 2.07 ms +0.5%
XorFilterBenchmark.XorFilter_Build(ItemCount: 100000) 12.50 ms 349.47 μs 12.47 ms +0.3%
XorFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 30.7 ns 4.79 μs -1.1%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 1000) 6.78 μs 8.5 ns 6.77 μs +0.1%
XorFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.59 ms 6.12 μs 1.58 ms +1.0%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 100000) 703.54 μs 500.6 ns 704.36 μs -0.1%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 3.6 ns 4.44 μs +2.2%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 1000) 6.77 μs 4.9 ns 6.78 μs -0.1%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.97 ms 23.31 μs 1.92 ms +2.5%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 100000) 705.22 μs 581.4 ns 704.91 μs +0.0%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 1000) 0.0 ns 0.0 ns 0.0 ns +135.1%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 1000) 23.45 μs 19.3 ns 23.45 μs +0.0%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 100000) 0.0 ns 0.0 ns 0.0 ns +16.5%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 100000) 22.97 μs 5.1 ns 22.97 μs -0.0%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 8) 167.1 ns 7.1 ns 182.4 ns -8.4%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 8) 89.6 ns 0.6 ns 84.3 ns +6.2%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 64) 826.2 ns 15.7 ns 767.2 ns +7.7%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 64) 1.12 μs 8.2 ns 1.05 μs +6.6%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.58 μs 664.1 ns 13.56 μs +7.5%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 12.95 μs 267.0 ns 13.85 μs -6.5%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 1000) 12.42 μs 153.8 ns 11.31 μs +9.7%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 1000) 11.49 μs 166.5 ns 10.96 μs +4.8%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.23 ms 121.27 μs 4.11 ms +3.0%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.71 ms 128.15 μs 4.70 ms +0.3%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 100000) 4.85 ms 32.14 μs 4.78 ms +1.5%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 100000) 6.68 ms 297.21 μs 6.46 ms +3.4%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 8) 37.0 ns 0.0 ns 37.7 ns -1.9%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 8) 26.9 ns 4.0 ns 23.7 ns +13.6%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 64) 298.5 ns 1.2 ns 297.7 ns +0.3%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 64) 1.11 μs 9.4 ns 1.10 μs +0.8%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 1000) 35.64 μs 490.2 ns 35.04 μs +1.7%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.71 μs 20.5 ns 4.73 μs -0.5%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.73 μs 18.4 ns 4.75 μs -0.5%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 1000) 25.37 μs 97.0 ns 25.04 μs +1.3%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 2.47 μs 4.6 ns 2.47 μs -0.1%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 1000) 2.67 μs 21.0 ns 2.64 μs +1.1%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 100000) 18.51 ms 459.80 μs 17.94 ms +3.2%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.59 ms 6.07 μs 1.60 ms -0.4%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.61 ms 10.08 μs 1.60 ms +0.5%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 100000) 13.01 ms 69.98 μs 13.00 ms +0.0%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 732.85 μs 6.89 μs 738.48 μs -0.8%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 100000) 827.86 μs 5.57 μs 813.64 μs +1.7%
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 1000) 190.44 μs 1.97 μs 186.31 μs +2.2%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 1000) 81.58 μs 861.2 ns 89.63 μs -9.0%
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 100000) 51.30 ms 525.85 μs 49.18 ms +4.3%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 100000) 26.54 ms 99.91 μs 26.41 ms +0.5%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 1000) 4.51 μs 10.5 ns 4.43 μs +1.7%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 1000) 77.4 ns 0.1 ns 77.7 ns -0.5%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 100000) 1.24 ms 12.93 μs 1.24 ms +0.4%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 100000) 5.77 μs 8.8 ns 5.79 μs -0.4%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 8) 1.31 μs 74.4 ns 1.27 μs +3.7%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 8) 1.26 μs 57.4 ns 1.24 μs +1.8%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 64) 4.78 μs 140.2 ns 4.88 μs -1.9%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 64) 22.05 μs 631.8 ns 28.20 μs -21.8% ✅
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 1000) 779.98 μs 10.55 μs 781.88 μs -0.2%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 84.10 μs 4.22 μs 86.22 μs -2.5%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 84.92 μs 9.68 μs 84.07 μs +1.0%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 1000) 306.72 μs 12.48 μs 315.68 μs -2.8%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 1000) 128.62 μs 11.21 μs 125.07 μs +2.8%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 1000) 119.70 μs 11.67 μs 124.06 μs -3.5%
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 100000) 26.74 ms 878.66 μs 26.54 ms +0.7%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.03 ms 18.81 μs 2.05 ms -0.7%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.05 ms 19.23 μs 2.06 ms -0.2%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 100000) 18.31 ms 206.70 μs 18.32 ms -0.0%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 100000) 1.57 ms 26.92 μs 1.59 ms -1.5%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 100000) 1.73 ms 25.49 μs 1.75 ms -0.7%
BTreeSetBenchmark.SortedSet_Add(ItemCount: 1000) 90.70 μs 1.18 μs 88.11 μs +2.9%
CeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 9.43 μs 153.2 ns 9.12 μs +3.4%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 1000) 7.58 μs 126.1 ns 7.64 μs -0.8%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 1000) 51.96 μs 5.38 μs 49.64 μs +4.7%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 1000) 7.35 μs 143.1 ns 7.19 μs +2.2%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 1000) 7.77 μs 148.7 ns 7.60 μs +2.3%
BTreeSetBenchmark.SortedSet_Add(ItemCount: 100000) 20.55 ms 182.58 μs 19.63 ms +4.7%
CeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 4.05 ms 276.52 μs 4.14 ms -2.0%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 100000) 1.02 ms 19.12 μs 989.62 μs +3.2%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 100000) 14.53 ms 254.11 μs 13.67 ms +6.3%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 100000) 3.20 ms 26.54 μs 3.20 ms +0.1%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 100000) 693.24 μs 14.20 μs 660.47 μs +5.0%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 1000) 41.34 μs 683.5 ns 39.42 μs +4.9%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 3.11 μs 41.8 ns 3.08 μs +1.2%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 1000) 55.88 μs 784.9 ns 53.36 μs +4.7%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 1000) 1.63 μs 21.7 ns 1.71 μs -4.6%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 100000) 15.96 ms 211.31 μs 15.54 ms +2.7%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.28 ms 20.30 μs 1.27 ms +1.1%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 100000) 14.23 ms 222.26 μs 13.95 ms +2.0%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 100000) 530.72 μs 7.66 μs 519.10 μs +2.2%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 1000) 3.04 μs 31.3 ns 2.94 μs +3.2%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 1000) 5.30 μs 106.8 ns 5.20 μs +1.8%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 100000) 318.03 μs 3.27 μs 320.06 μs -0.6%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 100000) 2.07 ms 17.35 μs 2.08 ms -0.1%
LruCacheBenchmark.Dictionary_Get(ItemCount: 1000) 23.80 μs 336.5 ns 23.66 μs +0.6%
LruCacheBenchmark.LruCache_Get(ItemCount: 1000) 6.77 μs 1.70 μs 5.04 μs +34.4%
LruCacheBenchmark.Dictionary_Get(ItemCount: 100000) 25.16 μs 514.5 ns 24.63 μs +2.1%
LruCacheBenchmark.LruCache_Get(ItemCount: 100000) 5.41 μs 175.4 ns 5.14 μs +5.1%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 1000) 3.39 μs 50.3 ns 3.29 μs +3.3%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 1000) 4.17 μs 62.4 ns 3.98 μs +4.7%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 100000) 410.12 μs 6.02 μs 394.09 μs +4.1%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 100000) 1.54 ms 19.86 μs 1.52 ms +1.6%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 10.38 μs 117.8 ns 10.03 μs +3.5%
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 10.35 μs 94.3 ns 9.97 μs +3.8%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 1000) 6.87 μs 150.5 ns 6.44 μs +6.8%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 1000) 14.48 μs 558.6 ns 13.62 μs +6.3%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 3.79 ms 251.70 μs 4.12 ms -8.1%
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.03 ms 120.22 μs 3.98 ms +1.2%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 100000) 2.97 ms 31.95 μs 2.93 ms +1.4%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 100000) 7.73 ms 123.14 μs 7.64 ms +1.2%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.26 μs 48.3 ns 3.06 μs +6.4%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.14 μs 70.7 ns 2.99 μs +5.2%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 1000) 2.02 μs 19.2 ns 1.94 μs +4.4%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 1000) 2.37 μs 36.4 ns 2.33 μs +1.9%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.26 ms 54.85 μs 1.26 ms +0.2%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.27 ms 65.87 μs 1.29 ms -1.3%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 100000) 659.09 μs 6.55 μs 632.73 μs +4.2%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 100000) 849.49 μs 8.02 μs 824.93 μs +3.0%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 1000) 140.86 μs 2.48 μs 137.68 μs +2.3%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 1000) 120.26 μs 1.22 μs 116.05 μs +3.6%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 100000) 32.37 ms 642.59 μs 31.41 ms +3.0%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 100000) 26.98 ms 341.09 μs 26.32 ms +2.5%
LruCacheBenchmark.Dictionary_Put(ItemCount: 1000) 74.83 μs 7.00 μs 69.20 μs +8.1%
LruCacheBenchmark.LruCache_Put(ItemCount: 1000) 284.66 μs 18.91 μs 293.42 μs -3.0%
LruCacheBenchmark.Dictionary_Put(ItemCount: 100000) 5.13 ms 494.17 μs 5.11 ms +0.4%
LruCacheBenchmark.LruCache_Put(ItemCount: 100000) 6.09 ms 258.06 μs 6.16 ms -1.2%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 1000) 171.8 ns 5.8 ns 164.8 ns +4.2%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 1000) 63.5 ns 1.1 ns 60.6 ns +4.9%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 100000) 8.37 μs 447.9 ns 8.73 μs -4.2%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 100000) 3.94 μs 45.7 ns 3.77 μs +4.5%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 1000) 510.30 μs 35.75 μs 496.62 μs +2.8%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 26.45 μs 3.02 μs 30.89 μs -14.4%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 62.29 μs 7.05 μs 58.14 μs +7.1%
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 70.05 μs 9.11 μs 67.38 μs +4.0%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 1000) 212.46 μs 17.56 μs 207.31 μs +2.5%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 1000) 96.92 μs 8.90 μs 97.79 μs -0.9%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 1000) 102.18 μs 9.40 μs 92.69 μs +10.2%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 1000) 88.30 μs 6.19 μs 85.86 μs +2.8%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 100000) 25.85 ms 596.99 μs 24.42 ms +5.8%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.51 ms 49.50 μs 1.48 ms +2.1%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.66 ms 95.47 μs 1.61 ms +2.9%
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.67 ms 80.36 μs 1.58 ms +5.5%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 100000) 15.80 ms 467.14 μs 14.81 ms +6.7%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 100000) 1.28 ms 73.08 μs 1.29 ms -0.6%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 100000) 1.57 ms 151.24 μs 2.50 ms -37.1%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 100000) 1.72 ms 46.37 μs 2.48 ms -30.4%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 9.68 μs 54.0 ns 10.00 μs -3.2%
SparseSetBenchmark.HashSet_Add(ItemCount: 1000) 5.15 μs 19.0 ns 5.15 μs -0.0%
SwissSetBenchmark.HashSet_Add(ItemCount: 1000) 9.87 μs 192.0 ns 9.70 μs +1.7%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 1000) 10.30 μs 65.6 ns 10.21 μs +0.9%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 1000) 6.87 μs 41.2 ns 7.06 μs -2.8%
SparseSetBenchmark.SparseSet_Add(ItemCount: 1000) 4.99 μs 41.1 ns 4.97 μs +0.3%
SwissSetBenchmark.SwissSet_Add(ItemCount: 1000) 19.89 μs 32.1 ns 19.97 μs -0.4%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 1000) 62.23 μs 230.8 ns 62.13 μs +0.2%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 4.10 ms 54.65 μs 4.10 ms -0.1%
SparseSetBenchmark.HashSet_Add(ItemCount: 100000) 1.32 ms 37.16 μs 1.34 ms -1.5%
SwissSetBenchmark.HashSet_Add(ItemCount: 100000) 4.04 ms 48.45 μs 4.03 ms +0.4%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 100000) 2.54 ms 49.75 μs 2.59 ms -2.1%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 100000) 2.45 ms 15.34 μs 2.45 ms -0.2%
SparseSetBenchmark.SparseSet_Add(ItemCount: 100000) 1.15 ms 33.59 μs 1.15 ms +0.3%
SwissSetBenchmark.SwissSet_Add(ItemCount: 100000) 3.62 ms 108.83 μs 3.63 ms -0.4%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 100000) 11.68 ms 32.07 μs 11.73 ms -0.4%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 1000) 4.73 μs 8.6 ns 7.08 μs -33.2% ✅
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 1000) 4.36 μs 13.2 ns 4.13 μs +5.5%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 100000) 988.39 μs 3.24 μs 984.75 μs +0.4%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 100000) 525.24 μs 726.6 ns 714.21 μs -26.5% ✅
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 3.65 μs 4.3 ns 3.90 μs -6.4%
SparseSetBenchmark.HashSet_Contains(ItemCount: 1000) 3.59 μs 3.7 ns 3.58 μs +0.2%
SwissSetBenchmark.HashSet_Contains(ItemCount: 1000) 3.92 μs 251.1 ns 3.83 μs +2.2%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 1000) 1.65 μs 19.4 ns 1.64 μs +0.4%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 1000) 1.11 μs 3.0 ns 1.11 μs +0.1%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 1000) 2.12 μs 5.5 ns 2.12 μs +0.0%
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.17 ms 1.70 μs 1.18 ms -0.4%
SparseSetBenchmark.HashSet_Contains(ItemCount: 100000) 976.88 μs 2.31 μs 986.94 μs -1.0%
SwissSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.12 ms 40.20 μs 1.17 ms -3.7%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 100000) 406.74 μs 16.26 μs 419.59 μs -3.1%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 100000) 192.31 μs 8.99 μs 193.97 μs -0.9%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 100000) 369.77 μs 2.92 μs 364.35 μs +1.5%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 3.91 μs 373.5 ns 3.54 μs +10.2%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 1000) 1.95 μs 2.4 ns 1.95 μs +0.0%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.54 ms 10.99 μs 1.54 ms -0.4%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 100000) 246.03 μs 718.8 ns 245.73 μs +0.1%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 1000) 1.28 μs 0.5 ns 1.28 μs -0.1%
DequeBenchmark.Deque_Enumerate(ItemCount: 1000) 825.3 ns 0.9 ns 825.4 ns -0.0%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 100000) 117.95 μs 143.1 ns 117.83 μs +0.1%
DequeBenchmark.Deque_Enumerate(ItemCount: 100000) 81.97 μs 75.7 ns 81.97 μs -0.0%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 10.26 μs 123.1 ns 10.18 μs +0.8%
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 1000) 6.71 μs 179.8 ns 6.72 μs -0.3%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 3.39 ms 54.83 μs 3.38 ms +0.2%
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 100000) 4.19 ms 38.03 μs 4.17 ms +0.4%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.58 μs 12.0 ns 3.62 μs -1.3%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 1000) 1.72 μs 86.1 ns 1.61 μs +6.6%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.19 ms 3.86 μs 1.25 ms -4.9%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 100000) 572.16 μs 33.32 μs 593.72 μs -3.6%
DequeBenchmark.LinkedList_PushFront(ItemCount: 1000) 27.56 μs 1.39 μs 31.37 μs -12.2% ✅
DequeBenchmark.Deque_PushFront(ItemCount: 1000) 17.66 μs 1.82 μs 14.95 μs +18.1%
DequeBenchmark.LinkedList_PushFront(ItemCount: 100000) 1.38 ms 15.31 μs 1.41 ms -1.9%
DequeBenchmark.Deque_PushFront(ItemCount: 100000) 576.04 μs 90.27 μs 542.01 μs +6.3%
DequeBenchmark.LinkedList_Queue(ItemCount: 1000) 41.38 μs 3.06 μs 40.34 μs +2.6%
DequeBenchmark.Deque_Queue(ItemCount: 1000) 24.16 μs 2.49 μs 25.77 μs -6.2%
DequeBenchmark.LinkedList_Queue(ItemCount: 100000) 3.69 ms 28.42 μs 3.63 ms +1.7%
DequeBenchmark.Deque_Queue(ItemCount: 100000) 355.04 μs 14.69 μs 354.07 μs +0.3%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 61.00 μs 5.81 μs 60.50 μs +0.8%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 23.19 μs 2.46 μs 24.10 μs -3.8%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 1000) 70.35 μs 6.43 μs 70.31 μs +0.1%
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 1000) 94.76 μs 5.47 μs 92.06 μs +2.9%
SparseSetBenchmark.HashSet_Remove(ItemCount: 1000) 22.20 μs 2.61 μs 19.99 μs +11.0%
SwissSetBenchmark.HashSet_Remove(ItemCount: 1000) 25.40 μs 2.00 μs 20.67 μs +22.8% ⚠️
SparseSetBenchmark.SparseSet_Remove(ItemCount: 1000) 17.31 μs 2.36 μs 16.53 μs +4.7%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 1000) 52.11 μs 3.50 μs 50.47 μs +3.2%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.55 ms 15.61 μs 1.56 ms -0.4%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.30 ms 8.99 μs 1.30 ms -0.7%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 100000) 2.16 ms 1.54 ms 4.95 ms -56.4% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 100000) 1.11 ms 12.48 μs 1.10 ms +0.9%
SparseSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.15 ms 10.81 μs 1.16 ms -0.8%
SwissSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.32 ms 10.21 μs 1.32 ms -0.3%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 100000) 501.58 μs 7.99 μs 507.60 μs -1.2%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 100000) 666.08 μs 13.89 μs 665.95 μs +0.0%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 1000) 25.4 ns 0.3 ns 25.1 ns +1.4%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 1000) 951.2 ns 10.9 ns 968.8 ns -1.8%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 100000) 25.3 ns 0.3 ns 26.4 ns -4.0%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 100000) 874.9 ns 2.9 ns 925.6 ns -5.5%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 1000) 12.35 μs 22.5 ns 12.45 μs -0.8%
IntSetBenchmark.HashSet_Add(ItemCount: 1000) 12.37 μs 20.3 ns 12.36 μs +0.1%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 1000) 12.46 μs 95.1 ns 12.35 μs +0.9%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 1000) 7.88 μs 6.9 ns 7.94 μs -0.7%
IntSetBenchmark.IntSet_Add(ItemCount: 1000) 9.17 μs 74.9 ns 9.54 μs -3.9%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 1000) 13.56 μs 70.4 ns 13.72 μs -1.2%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 100000) 4.81 ms 88.66 μs 4.82 ms -0.1%
IntSetBenchmark.HashSet_Add(ItemCount: 100000) 5.18 ms 117.55 μs 5.17 ms +0.1%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 100000) 5.04 ms 44.28 μs 5.04 ms +0.1%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 100000) 2.33 ms 16.38 μs 2.35 ms -0.8%
IntSetBenchmark.IntSet_Add(ItemCount: 100000) 3.52 ms 43.34 μs 3.48 ms +1.3%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 100000) 6.62 ms 135.14 μs 6.58 ms +0.7%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 1000) 16.80 μs 30.9 ns 16.98 μs -1.0%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 1000) 15.45 μs 33.5 ns 15.46 μs -0.1%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 100000) 4.40 ms 56.01 μs 4.43 ms -0.7%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 100000) 3.23 ms 53.06 μs 3.22 ms +0.5%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 1000) 9.53 μs 17.2 ns 9.54 μs -0.2%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 1000) 13.08 μs 18.4 ns 13.70 μs -4.5%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 100000) 155.70 μs 766.1 ns 156.91 μs -0.8%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 100000) 282.95 μs 1.08 μs 289.91 μs -2.4%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 4.9 ns 4.74 μs +0.1%
IntSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.73 μs 19.1 ns 4.90 μs -3.5%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.73 μs 10.1 ns 4.74 μs -0.1%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 1000) 5.55 μs 3.0 ns 5.55 μs -0.0%
IntSetBenchmark.IntSet_Contains(ItemCount: 1000) 1.91 μs 18.3 ns 1.91 μs +0.1%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 1000) 2.83 μs 3.3 ns 2.83 μs -0.1%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.52 ms 2.14 μs 1.52 ms -0.3%
IntSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.51 ms 3.34 μs 1.51 ms -0.0%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.46 ms 50.20 μs 1.51 ms -3.5%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 100000) 1.98 ms 1.45 μs 1.98 ms +0.0%
IntSetBenchmark.IntSet_Contains(ItemCount: 100000) 488.70 μs 6.51 μs 492.91 μs -0.9%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 100000) 782.68 μs 9.10 μs 784.58 μs -0.2%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.56 μs 1.7 ns 4.56 μs -0.0%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.57 μs 4.3 ns 4.58 μs -0.4%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 1000) 9.61 μs 5.9 ns 9.62 μs -0.1%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 1000) 3.02 μs 2.3 ns 3.02 μs +0.1%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.97 ms 3.01 μs 1.98 ms -0.1%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.98 ms 6.02 μs 1.98 ms -0.0%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 100000) 985.48 μs 358.1 ns 986.02 μs -0.1%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 100000) 1.29 ms 2.46 μs 1.29 ms +0.0%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 1000) 79.27 μs 3.03 μs 78.67 μs +0.8%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 1000) 188.23 μs 874.1 ns 187.72 μs +0.3%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 100000) 34.52 ms 454.59 μs 35.10 ms -1.6%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 100000) 56.63 ms 394.81 μs 56.59 ms +0.1%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 1000) 4.56 μs 8.4 ns 4.55 μs +0.2%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 1000) 29.43 μs 30.3 ns 29.30 μs +0.5%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 100000) 1.15 ms 18.13 μs 1.16 ms -0.6%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 100000) 6.27 ms 77.33 μs 6.32 ms -0.7%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.74 μs 71.0 ns 14.83 μs -0.6%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 1000) 8.50 μs 44.0 ns 8.59 μs -0.9%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 5.15 ms 47.70 μs 5.17 ms -0.4%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 100000) 7.54 ms 41.46 μs 7.49 ms +0.6%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.02 μs 39.6 ns 5.23 μs -4.0%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 1000) 2.28 μs 8.4 ns 2.29 μs -0.2%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.57 ms 1.90 μs 1.55 ms +1.2%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 100000) 676.31 μs 19.57 μs 842.15 μs -19.7%
IntSetBenchmark.HashSet_Remove(ItemCount: 1000) 29.79 μs 3.85 μs 28.14 μs +5.9%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 79.59 μs 7.39 μs 79.08 μs +0.6%
IntSetBenchmark.IntSet_Remove(ItemCount: 1000) 83.30 μs 9.67 μs 81.71 μs +1.9%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 1000) 84.41 μs 7.05 μs 83.06 μs +1.6%
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 1000) 27.04 μs 2.42 μs 25.95 μs +4.2%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 1000) 114.75 μs 6.46 μs 109.06 μs +5.2%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 1000) 13.39 μs 18.1 ns 13.46 μs -0.5%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 1000) 14.25 μs 80.8 ns 14.31 μs -0.4%
IntSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.69 ms 16.97 μs 1.68 ms +0.2%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.97 ms 59.60 μs 1.96 ms +0.3%
IntSetBenchmark.IntSet_Remove(ItemCount: 100000) 1.44 ms 7.61 μs 1.44 ms +0.2%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 100000) 1.78 ms 66.03 μs 1.79 ms -0.4%
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.71 ms 13.59 μs 1.72 ms -0.4%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 100000) 1.55 ms 51.91 μs 1.54 ms +0.3%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 100000) 3.73 ms 11.86 μs 3.75 ms -0.7%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 100000) 4.50 ms 3.14 μs 4.50 ms -0.1%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 1000) 91.72 μs 304.4 ns 91.53 μs +0.2%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 1000) 27.41 μs 52.9 ns 27.47 μs -0.2%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 100000) 40.55 ms 724.34 μs 41.24 ms -1.7%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 100000) 7.76 ms 38.62 μs 7.70 ms +0.8%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 1000) 13.66 μs 71.5 ns 13.58 μs +0.6%
LongSetBenchmark.HashSet_Add(ItemCount: 1000) 15.18 μs 65.9 ns 15.00 μs +1.2%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 1000) 11.60 μs 33.2 ns 11.61 μs -0.2%
LongSetBenchmark.LongSet_Add(ItemCount: 1000) 10.05 μs 124.2 ns 10.18 μs -1.3%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 100000) 4.30 ms 288.58 μs 4.35 ms -1.0%
LongSetBenchmark.HashSet_Add(ItemCount: 100000) 4.48 ms 292.92 μs 4.49 ms -0.3%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 100000) 5.64 ms 141.96 μs 5.58 ms +1.0%
LongSetBenchmark.LongSet_Add(ItemCount: 100000) 6.48 ms 167.33 μs 6.52 ms -0.6%
BitSetBenchmark.BitArray_And(ItemCount: 1024) 57.2 ns 0.3 ns 56.5 ns +1.2%
BitSetBenchmark.BitSet_And(ItemCount: 1024) 1.10 μs 3.0 ns 1.08 μs +1.8%
BitSetBenchmark.BitArray_And(ItemCount: 1000000) 53.41 μs 671.1 ns 52.94 μs +0.9%
BitSetBenchmark.BitSet_And(ItemCount: 1000000) 5.32 ms 6.05 μs 5.34 ms -0.4%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 1000) 153.17 μs 580.2 ns 152.20 μs +0.6%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 1000) 8.51 ms 227.23 μs 8.16 ms +4.2%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 100000) 28.54 ms 250.59 μs 27.66 ms +3.2%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 100000) 1.77 s 47.80 ms 1.74 s +2.1%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 1000) 3.52 μs 8.6 ns 3.46 μs +1.7%
LongSetBenchmark.HashSet_Contains(ItemCount: 1000) 3.70 μs 16.8 ns 3.69 μs +0.4%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 1000) 2.15 μs 10.9 ns 2.10 μs +2.5%
LongSetBenchmark.LongSet_Contains(ItemCount: 1000) 2.03 μs 16.6 ns 2.01 μs +0.6%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 1000) 16.51 μs 85.5 ns 16.55 μs -0.3%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 1000) 21.83 μs 101.0 ns 21.65 μs +0.9%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.42 ms 3.94 μs 1.39 ms +2.1%
LongSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.49 ms 4.68 μs 1.51 ms -1.6%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 100000) 756.54 μs 20.72 μs 760.19 μs -0.5%
LongSetBenchmark.LongSet_Contains(ItemCount: 100000) 675.73 μs 4.96 μs 683.70 μs -1.2%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 100000) 3.84 ms 44.44 μs 3.89 ms -1.1%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 100000) 6.40 ms 171.40 μs 6.32 ms +1.2%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 3.57 μs 10.5 ns 3.60 μs -1.0%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 1000) 2.79 μs 159.9 ns 2.59 μs +7.6%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.83 ms 14.45 μs 1.83 ms +0.0%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 100000) 1.24 ms 7.50 μs 1.22 ms +1.4%
StringInternTableBenchmark.Dictionary_Dedupe(ItemCount: 1000) 34.37 μs 342.0 ns 34.56 μs -0.5%
StringInternTableBenchmark.StringInternTable_Dedupe(ItemCount: 1000) 31.05 μs 68.5 ns 31.19 μs -0.4%
StringInternTableBenchmark.Dictionary_Dedupe(ItemCount: 100000) 3.33 ms 30.68 μs 3.29 ms +1.2%
StringInternTableBenchmark.StringInternTable_Dedupe(ItemCount: 100000) 2.90 ms 9.59 μs 2.91 ms -0.4%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 1000) 17.04 μs 97.0 ns 17.00 μs +0.2%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 24.05 μs 101.2 ns 23.96 μs +0.4%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 1000) 6.19 μs 12.4 ns 6.11 μs +1.4%
StringInternTableBenchmark.HashSet_Lookup(ItemCount: 1000) 33.65 μs 330.2 ns 33.43 μs +0.7%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 1000) 100.61 μs 273.3 ns 99.50 μs +1.1%
StringInternTableBenchmark.StringInternTable_Lookup(ItemCount: 1000) 29.03 μs 142.4 ns 29.18 μs -0.5%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 100000) 4.19 ms 71.32 μs 4.23 ms -0.9%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 7.32 ms 311.10 μs 7.19 ms +1.8%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 100000) 2.27 ms 9.15 μs 2.32 ms -2.1%
StringInternTableBenchmark.HashSet_Lookup(ItemCount: 100000) 3.26 ms 28.39 μs 3.32 ms -1.8%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 100000) 8.41 ms 62.04 μs 8.27 ms +1.7%
StringInternTableBenchmark.StringInternTable_Lookup(ItemCount: 100000) 2.91 ms 16.67 μs 2.92 ms -0.5%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 1000) 15.04 μs 95.2 ns 15.06 μs -0.1%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 1000) 26.43 μs 573.3 ns 25.97 μs +1.8%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 100000) 4.89 ms 123.94 μs 4.79 ms +2.0%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 100000) 8.23 ms 324.01 μs 8.73 ms -5.7%
BitSetBenchmark.BitArray_Or(ItemCount: 1024) 57.2 ns 0.6 ns 56.4 ns +1.4%
BitSetBenchmark.BitSet_Or(ItemCount: 1024) 1.11 μs 2.9 ns 1.08 μs +2.4%
BitSetBenchmark.BitArray_Or(ItemCount: 1000000) 53.37 μs 892.8 ns 51.88 μs +2.9%
BitSetBenchmark.BitSet_Or(ItemCount: 1000000) 5.31 ms 8.54 μs 5.35 ms -0.7%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1024) 1.19 μs 14.7 ns 1.18 μs +0.7%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1024) 8.4 ns 0.0 ns 8.3 ns +1.6%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1000000) 5.75 ms 7.67 μs 5.68 ms +1.1%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1000000) 7.69 μs 46.6 ns 7.61 μs +1.0%
LongSetBenchmark.HashSet_Remove(ItemCount: 1000) 62.22 μs 7.20 μs 67.59 μs -7.9%
LongSetBenchmark.LongSet_Remove(ItemCount: 1000) 69.14 μs 10.47 μs 70.49 μs -1.9%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 1000) 34.41 μs 7.40 μs 34.13 μs +0.8%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 1000) 99.27 μs 10.91 μs 100.38 μs -1.1%
LongSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.83 ms 49.55 μs 1.85 ms -1.0%
LongSetBenchmark.LongSet_Remove(ItemCount: 100000) 1.71 ms 97.46 μs 1.67 ms +2.6%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.74 ms 45.89 μs 1.63 ms +7.1%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 100000) 1.68 ms 89.83 μs 1.64 ms +2.4%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_SpanLookup(ItemCount: 1000) 28.66 μs 185.7 ns 28.04 μs +2.2%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_SpanLookup(ItemCount: 1000) 93.24 μs 286.6 ns 92.55 μs +0.7%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_SpanLookup(ItemCount: 100000) 13.43 ms 309.78 μs 12.54 ms +7.1%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_SpanLookup(ItemCount: 100000) 10.74 ms 159.80 μs 10.58 ms +1.5%
BitSetBenchmark.BitArray_Xor(ItemCount: 1024) 57.5 ns 0.5 ns 56.7 ns +1.4%
BitSetBenchmark.BitSet_Xor(ItemCount: 1024) 1.10 μs 3.4 ns 1.09 μs +1.3%
BitSetBenchmark.BitArray_Xor(ItemCount: 1000000) 54.41 μs 1.70 μs 52.99 μs +2.7%
BitSetBenchmark.BitSet_Xor(ItemCount: 1000000) 5.36 ms 62.32 μs 5.35 ms +0.2%
Hashers (111)
Benchmark This PR StdDev main Δ
StringHasherBenchmark.Bcl_GetHashCode(Shape: ShortAscii) 16.66 μs 13.7 ns 16.65 μs +0.1%
StringHasherBenchmark.EqualityComparer_Default(Shape: ShortAscii) 16.74 μs 158.9 ns 16.62 μs +0.7%
StringHasherBenchmark.Djb2(Shape: ShortAscii) 24.64 μs 13.5 ns 24.65 μs -0.0%
StringHasherBenchmark.Djb2A(Shape: ShortAscii) 24.64 μs 16.6 ns 24.65 μs -0.0%
StringHasherBenchmark.Sdbm(Shape: ShortAscii) 35.23 μs 19.7 ns 35.22 μs +0.0%
StringHasherBenchmark.Elf(Shape: ShortAscii) 43.63 μs 18.4 ns 43.63 μs +0.0%
StringHasherBenchmark.Crc32(Shape: ShortAscii) 55.20 μs 32.6 ns 55.19 μs +0.0%
StringHasherBenchmark.Adler32(Shape: ShortAscii) 106.83 μs 34.6 ns 106.83 μs +0.0%
StringHasherBenchmark.FnV1(Shape: ShortAscii) 28.48 μs 10.0 ns 28.47 μs +0.0%
StringHasherBenchmark.FnV1_64(Shape: ShortAscii) 29.14 μs 11.2 ns 29.14 μs -0.0%
StringHasherBenchmark.FnV1A(Shape: ShortAscii) 12.40 μs 113.1 ns 12.49 μs -0.7%
StringHasherBenchmark.FnV1A_Full(Shape: ShortAscii) 24.99 μs 18.7 ns 24.99 μs -0.0%
StringHasherBenchmark.FnV1A_64(Shape: ShortAscii) 31.94 μs 14.4 ns 31.96 μs -0.0%
StringHasherBenchmark.JenkinsOaat(Shape: ShortAscii) 40.68 μs 33.7 ns 40.69 μs -0.0%
StringHasherBenchmark.Murmur2(Shape: ShortAscii) 16.64 μs 12.9 ns 16.64 μs +0.0%
StringHasherBenchmark.Murmur3(Shape: ShortAscii) 20.34 μs 12.4 ns 20.34 μs -0.0%
StringHasherBenchmark.XxHash32(Shape: ShortAscii) 17.72 μs 13.3 ns 17.76 μs -0.3%
StringHasherBenchmark.XxHash64(Shape: ShortAscii) 19.67 μs 20.5 ns 19.66 μs +0.0%
StringHasherBenchmark.XxHash3(Shape: ShortAscii) 16.99 μs 33.8 ns 16.94 μs +0.3%
StringHasherBenchmark.CityHash64(Shape: ShortAscii) 17.02 μs 11.1 ns 17.02 μs +0.0%
StringHasherBenchmark.MetroHash64(Shape: ShortAscii) 17.31 μs 12.4 ns 17.30 μs +0.1%
StringHasherBenchmark.SipHash13(Shape: ShortAscii) 31.01 μs 15.1 ns 31.01 μs +0.0%
StringHasherBenchmark.SipHash24(Shape: ShortAscii) 43.71 μs 21.8 ns 43.71 μs +0.0%
StringHasherBenchmark.HalfSipHash24(Shape: ShortAscii) 56.55 μs 27.3 ns 56.54 μs +0.0%
StringHasherBenchmark.HighwayHash64(Shape: ShortAscii) 446.47 μs 6.50 μs 446.32 μs +0.0%
StringHasherBenchmark.XxHash64_Hash64(Shape: ShortAscii) 19.67 μs 7.7 ns 19.65 μs +0.1%
StringHasherBenchmark.SipHash24_Hash64(Shape: ShortAscii) 42.66 μs 15.8 ns 42.65 μs +0.0%
StringHasherBenchmark.Bcl_GetHashCode(Shape: LongAscii) 108.13 μs 29.5 ns 108.15 μs -0.0%
StringHasherBenchmark.EqualityComparer_Default(Shape: LongAscii) 108.45 μs 20.3 ns 108.45 μs +0.0%
StringHasherBenchmark.Djb2(Shape: LongAscii) 254.68 μs 98.6 ns 254.64 μs +0.0%
StringHasherBenchmark.Djb2A(Shape: LongAscii) 254.69 μs 115.2 ns 254.66 μs +0.0%
StringHasherBenchmark.Sdbm(Shape: LongAscii) 343.65 μs 125.0 ns 343.53 μs +0.0%
StringHasherBenchmark.Elf(Shape: LongAscii) 624.52 μs 435.2 ns 624.41 μs +0.0%
StringHasherBenchmark.Crc32(Shape: LongAscii) 663.14 μs 179.7 ns 663.20 μs -0.0%
StringHasherBenchmark.Adler32(Shape: LongAscii) 883.05 μs 293.4 ns 882.99 μs +0.0%
StringHasherBenchmark.FnV1(Shape: LongAscii) 317.79 μs 259.7 ns 317.79 μs +0.0%
StringHasherBenchmark.FnV1_64(Shape: LongAscii) 320.24 μs 127.2 ns 320.25 μs -0.0%
StringHasherBenchmark.FnV1A(Shape: LongAscii) 134.20 μs 111.6 ns 134.15 μs +0.0%
StringHasherBenchmark.FnV1A_Full(Shape: LongAscii) 313.85 μs 107.9 ns 313.84 μs +0.0%
StringHasherBenchmark.FnV1A_64(Shape: LongAscii) 321.52 μs 100.2 ns 321.46 μs +0.0%
StringHasherBenchmark.JenkinsOaat(Shape: LongAscii) 421.78 μs 150.7 ns 421.67 μs +0.0%
StringHasherBenchmark.Murmur2(Shape: LongAscii) 98.81 μs 1.63 μs 98.10 μs +0.7%
StringHasherBenchmark.Murmur3(Shape: LongAscii) 117.06 μs 92.9 ns 117.06 μs +0.0%
StringHasherBenchmark.XxHash32(Shape: LongAscii) 76.99 μs 47.1 ns 77.06 μs -0.1%
StringHasherBenchmark.XxHash64(Shape: LongAscii) 94.64 μs 58.2 ns 94.64 μs +0.0%
StringHasherBenchmark.XxHash3(Shape: LongAscii) 92.80 μs 75.5 ns 92.92 μs -0.1%
StringHasherBenchmark.CityHash64(Shape: LongAscii) 134.63 μs 97.0 ns 134.72 μs -0.1%
StringHasherBenchmark.MetroHash64(Shape: LongAscii) 82.04 μs 213.5 ns 81.87 μs +0.2%
StringHasherBenchmark.SipHash13(Shape: LongAscii) 116.17 μs 62.0 ns 116.21 μs -0.0%
StringHasherBenchmark.SipHash24(Shape: LongAscii) 171.28 μs 74.6 ns 171.24 μs +0.0%
StringHasherBenchmark.HalfSipHash24(Shape: LongAscii) 273.00 μs 115.1 ns 272.98 μs +0.0%
StringHasherBenchmark.HighwayHash64(Shape: LongAscii) 791.42 μs 8.42 μs 798.84 μs -0.9%
StringHasherBenchmark.XxHash64_Hash64(Shape: LongAscii) 92.14 μs 58.1 ns 92.18 μs -0.0%
StringHasherBenchmark.SipHash24_Hash64(Shape: LongAscii) 171.57 μs 466.1 ns 171.51 μs +0.0%
StringHasherBenchmark.Bcl_GetHashCode(Shape: NonAscii) 25.08 μs 14.9 ns 25.07 μs +0.0%
StringHasherBenchmark.EqualityComparer_Default(Shape: NonAscii) 25.04 μs 14.9 ns 25.01 μs +0.1%
StringHasherBenchmark.Djb2(Shape: NonAscii) 45.54 μs 16.8 ns 45.55 μs -0.0%
StringHasherBenchmark.Djb2A(Shape: NonAscii) 45.54 μs 27.0 ns 45.54 μs +0.0%
StringHasherBenchmark.Sdbm(Shape: NonAscii) 66.28 μs 24.1 ns 66.27 μs +0.0%
StringHasherBenchmark.Elf(Shape: NonAscii) 88.09 μs 19.3 ns 88.10 μs -0.0%
StringHasherBenchmark.Crc32(Shape: NonAscii) 112.05 μs 30.3 ns 112.07 μs -0.0%
StringHasherBenchmark.Adler32(Shape: NonAscii) 191.69 μs 64.4 ns 191.67 μs +0.0%
StringHasherBenchmark.FnV1(Shape: NonAscii) 51.14 μs 34.9 ns 51.15 μs -0.0%
StringHasherBenchmark.FnV1_64(Shape: NonAscii) 52.63 μs 26.6 ns 52.65 μs -0.0%
StringHasherBenchmark.FnV1A(Shape: NonAscii) 22.94 μs 28.0 ns 22.97 μs -0.1%
StringHasherBenchmark.FnV1A_Full(Shape: NonAscii) 47.19 μs 21.1 ns 47.17 μs +0.0%
StringHasherBenchmark.FnV1A_64(Shape: NonAscii) 54.14 μs 22.6 ns 54.13 μs +0.0%
StringHasherBenchmark.JenkinsOaat(Shape: NonAscii) 77.02 μs 33.2 ns 77.00 μs +0.0%
StringHasherBenchmark.Murmur2(Shape: NonAscii) 24.69 μs 12.6 ns 24.67 μs +0.0%
StringHasherBenchmark.Murmur3(Shape: NonAscii) 30.15 μs 17.4 ns 30.15 μs +0.0%
StringHasherBenchmark.XxHash32(Shape: NonAscii) 24.90 μs 22.1 ns 24.88 μs +0.1%
StringHasherBenchmark.XxHash64(Shape: NonAscii) 32.78 μs 66.5 ns 32.79 μs -0.0%
StringHasherBenchmark.XxHash3(Shape: NonAscii) 26.37 μs 8.9 ns 26.37 μs +0.0%
StringHasherBenchmark.CityHash64(Shape: NonAscii) 23.75 μs 23.6 ns 23.75 μs -0.0%
StringHasherBenchmark.MetroHash64(Shape: NonAscii) 27.50 μs 19.2 ns 27.51 μs -0.0%
StringHasherBenchmark.SipHash13(Shape: NonAscii) 39.97 μs 9.6 ns 39.98 μs -0.0%
StringHasherBenchmark.SipHash24(Shape: NonAscii) 58.37 μs 18.4 ns 58.36 μs +0.0%
StringHasherBenchmark.HalfSipHash24(Shape: NonAscii) 79.48 μs 38.5 ns 79.49 μs -0.0%
StringHasherBenchmark.HighwayHash64(Shape: NonAscii) 488.51 μs 1.07 μs 490.45 μs -0.4%
StringHasherBenchmark.XxHash64_Hash64(Shape: NonAscii) 31.23 μs 123.4 ns 31.11 μs +0.4%
StringHasherBenchmark.SipHash24_Hash64(Shape: NonAscii) 57.06 μs 32.8 ns 57.06 μs +0.0%
IntegerHasherBenchmark.Guid_Bcl 1.28 μs 14.4 ns 1.29 μs -0.6%
IntegerHasherBenchmark.Guid_EqualityComparer 3.49 μs 14.9 ns 3.50 μs -0.4%
IntegerHasherBenchmark.Guid_Celerity 8.53 μs 21.2 ns 8.51 μs +0.2%
IntegerHasherBenchmark.Guid_Celerity_Hash64 8.05 μs 18.9 ns 8.03 μs +0.3%
IntegerHasherBenchmark.Int32_Bcl 690.1 ns 3.9 ns 700.3 ns -1.4%
IntegerHasherBenchmark.Int32_EqualityComparer 708.6 ns 5.1 ns 710.9 ns -0.3%
IntegerHasherBenchmark.Int32_Identity 689.5 ns 3.9 ns 698.0 ns -1.2%
IntegerHasherBenchmark.Int32_WangNaive 1.25 μs 0.9 ns 1.25 μs +0.0%
IntegerHasherBenchmark.Int32_Wang 3.03 μs 3.0 ns 3.03 μs +0.0%
IntegerHasherBenchmark.Int32_Murmur3 2.65 μs 1.6 ns 2.65 μs +0.0%
IntegerHasherBenchmark.Int64_Bcl 1.27 μs 1.6 ns 1.36 μs -6.7%
IntegerHasherBenchmark.Int64_EqualityComparer 1.25 μs 3.4 ns 1.25 μs +0.2%
IntegerHasherBenchmark.Int64_Identity 689.0 ns 4.4 ns 694.2 ns -0.8%
IntegerHasherBenchmark.Int64_WangNaive 1.87 μs 0.8 ns 1.87 μs -0.1%
IntegerHasherBenchmark.Int64_Wang 4.16 μs 3.8 ns 4.16 μs +0.0%
IntegerHasherBenchmark.Int64_Murmur3 2.37 μs 1.8 ns 2.37 μs +0.0%
IntegerHasherBenchmark.Int64_Wang_Hash64 4.16 μs 2.6 ns 4.16 μs +0.1%
IntegerHasherBenchmark.Int64_Murmur3_Hash64 2.37 μs 3.3 ns 2.37 μs +0.1%
IntegerHasherBenchmark.UInt32_Bcl 691.9 ns 4.5 ns 687.9 ns +0.6%
IntegerHasherBenchmark.UInt32_EqualityComparer 703.0 ns 1.9 ns 709.4 ns -0.9%
IntegerHasherBenchmark.UInt32_Default 1.25 μs 0.8 ns 1.25 μs +0.0%
IntegerHasherBenchmark.UInt32_Wang 3.03 μs 4.1 ns 3.03 μs -0.1%
IntegerHasherBenchmark.UInt32_Murmur3 2.65 μs 1.1 ns 2.65 μs -0.0%
IntegerHasherBenchmark.UInt64_Bcl 1.27 μs 1.2 ns 1.27 μs +0.0%
IntegerHasherBenchmark.UInt64_EqualityComparer 1.25 μs 0.4 ns 1.25 μs +0.0%
IntegerHasherBenchmark.UInt64_Default 2.37 μs 2.6 ns 2.37 μs +0.0%
IntegerHasherBenchmark.UInt64_Wang 4.16 μs 2.2 ns 4.16 μs -0.0%
IntegerHasherBenchmark.UInt64_WangNaive 1.87 μs 1.5 ns 1.87 μs +0.0%
IntegerHasherBenchmark.UInt64_Default_Hash64 2.37 μs 3.2 ns 2.37 μs +0.0%
IntegerHasherBenchmark.UInt64_Wang_Hash64 4.16 μs 2.3 ns 4.16 μs -0.0%

Same-runner A/B (sharded 8-way): main (06dc36b) 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 591e943 into main Jul 30, 2026
19 checks passed
@marius-bughiu
marius-bughiu deleted the fix/issue-333-deque-clear-noop-version branch July 30, 2026 05:34
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.

Deque.Clear() invalidates enumerators when the deque is already empty, unlike the other 28 count-based collections

2 participants