Skip to content

feat(collections): add RankSelectBitVector — O(1) Rank and O(log n) Select over a dense bit vector - #329

Merged
marius-bughiu merged 3 commits into
mainfrom
feat/issue-312-rank-select-bit-vector
Jul 29, 2026
Merged

feat(collections): add RankSelectBitVector — O(1) Rank and O(log n) Select over a dense bit vector#329
marius-bughiu merged 3 commits into
mainfrom
feat/issue-312-rank-select-bit-vector

Conversation

@marius-bughiu

Copy link
Copy Markdown
Owner

Closes #312.

Adds RankSelectBitVector — the succinct rank/select layer over a dense bit vector, and the primitive the compressed-integer lane (CompressedIntSet, #310) composes on.

  • Rank(i) — set bits below i, in O(1).
  • Select(k) — position of the k-th set bit, in O(log n).

There is no BCL counterpart at any level: BitArray exposes neither, BitOperations.PopCount is per-word, and .NET 8/9/10 ship no succinct data-structure support. The honest baseline is the O(index / 64) popcount loop a caller writes by hand, and that loop is what the benchmark measures against.

Design

The index is two arrays: an int per 256-bit superblock holding the set bits before it, plus a byte per 64-bit word holding the set bits before that word within its superblock. Rank is two index loads and one masked POPCNT; Select binary-searches the superblock array, walks the at most four words inside the chosen superblock, and resolves within that word by a six-step popcount narrowing.

The type is immutable by construction — no mutating member — and the build-once contract opens the XML docs, the API reference section, and the README entry, per the issue's instruction to lead with it. A vector that keeps changing should stay a BitSet and be snapshotted only once the bits have settled; ToBitSet() is the documented way back.

One deliberate deviation from the issue

The issue specifies "a uint per 512-bit superblock plus a byte per 64-bit block … at roughly 3% space overhead". That layout is not self-consistent: within a 512-bit superblock the per-word prefix reaches 448, which does not fit in a byte. Keeping the byte-wide per-word counter caps the superblock at 256 bits, and the resulting index is 25% of the vector — the same price as the classic rank9 layout, and the standard cost of an exact rank that touches a single word. I kept the access pattern the issue asked for (two loads, one masked popcount) and corrected the number everywhere it appears: IndexSizeInBytes reports it per instance, and the XML docs, API reference, README, dashboard card, and ROADMAP entry all state 25% rather than 3%.

Bounds behaviour, per the issue's "pick one and document it": Rank(Length) == Count; Select throws ArgumentOutOfRangeException outside [0, Count), with TrySelect(rank, out position) as the non-throwing form returning -1.

Parity rollout

Everything below is in this PR — nothing deferred.

Facet Change
Collection src/Celerity/Collections/RankSelectBitVector.cs; two internal members added to BitSet (a word-array snapshot and a take-ownership ctor) so the two types convert without a per-bit round trip
Dedicated tests RankSelectBitVectorTests.cs — all three constructors and their validation, Rank / Rank0 / Select / TrySelect / Get / ToBitSet / IndexSizeInBytes, the 63/64/65 and 255/256/257 and 511/512/513 boundaries, single bit at position 0 and at Length - 1, and the empty / all-zero / all-ones vectors
Differential tests RankSelectBitVectorDifferentialTests.cs — CsCheck over random length × density, reconciling every rank position and every select ordinal against a naive bool[] oracle, plus the Select(Rank(i)) round-trip identity and constructor agreement
Fuzz RankSelectBitVector target registered in Differential.All, same bool[] oracle
AOT Exercise block in Celerity.AotSmokeTest/Program.cs covering all three ctors, both rank forms, both select forms, and ToBitSet
Benchmark RankSelectBitVectorBenchmark.cs, registered in Program.cs's CoreBenchmarks. Baseline is the hand-rolled ulong[] popcount loop (Array_*, Baseline = true), swept over query position (RankEarly / RankMid / RankLate) plus Select and Build; [Params] is named ItemCount so the dashboard parser picks it up
Dashboard COLLECTIONS entry in web/dev/bench/index.html and web/dev/bench/detail.html (keys and items agree, as scripts/check_dashboard_coverage.js on #327 will require), plus a ship card in web/index.html
Docs docs/api/collections.md — full section after BitSet with a "when not to use this" block first; README.md — collections list, the bit-level details section with a runnable example, and a new "Choosing a collection" row adjacent to and cross-referencing BitSet
CHANGELOG Three [Unreleased] → Added bullets: the collection, the test surface, the benchmark + dashboard
ROADMAP 2.4.0 entry flipped to done, recording the 25%-not-3% correction

Shared cross-collection suites do not apply. AddAndTryAddTests, SetConstructorValidationTests, LoadFactorBoundaryTests, IndexerReturnTypeTests, IEnumerableConstructorTests and the rest pin the hash-table family contract — Add/TryAdd semantics, load factor, probe counts, indexer return type. grep confirms none of them cover BitSet, FenwickTree, or SparseSet either. An immutable, read-only positional index has no rows to add there.

Test plan

  • dotnet build clean across net8.0;net9.0;net10.0, 0 errors, no new warnings
  • dotnet test4971 passed, 0 failed on net8.0 locally
  • New type at 100% line and 100% branch coverage (verified from the cobertura report, so the six-package gate holds)
  • Celerity.Fuzz --target RankSelectBitVector --iterations 400 — all cases pass
  • Celerity.AotSmokeTest runs green (managed run locally; CI does the real Native AOT publish on linux-x64 × net8/9/10)
  • Benchmark dry-run is green and shows the expected shape: at 1M bits Rank is ~16× faster at the midpoint and ~25× at the tail while staying flat with position, and Build costs ~3.3× a raw word-array clone — the tradeoff the Build row exists to expose
  • CI matrix: build-and-test on ubuntu / windows / macos, the 8-shard benchmark A/B, aot-publish on net8/9/10, and coverage
  • gh-pages dashboard refresh on merge to main — the new RankSelectBitVector card should populate from the first post-merge benchmark run rather than render blank

🤖 Generated with Claude Code

…elect

Adds the succinct rank/select layer over a dense bit vector, the primitive the
compressed-integer lane composes on. The BCL has no counterpart at any level:
BitArray exposes neither rank nor select, BitOperations.PopCount is per-word,
and .NET 8/9/10 ship no succinct data-structure support — so the baseline is
the O(index / 64) popcount loop a caller writes by hand.

The index is two arrays: an int per 256-bit superblock plus a byte per 64-bit
word holding the within-superblock prefix. Rank is two index loads and one
masked POPCNT; Select binary-searches the superblocks, walks the at most four
words inside one, and resolves within the word by popcount narrowing.

The issue estimated 3% space overhead, which the layout it specified cannot
deliver: a byte-wide per-word counter caps the superblock at 256 bits (the
within-superblock prefix must stay under 256), which puts the index at 25% of
the vector — the same price as the classic rank9 layout. IndexSizeInBytes
reports it per instance and every doc surface leads with the real number.

The type is immutable by construction and the build-once contract opens the
XML docs, the API reference, and the README entry: a mutating vector should
stay a BitSet and be snapshotted only once the bits have settled.

Full parity rollout in this commit: dedicated + CsCheck differential tests
(100% line and branch on the new file), a Celerity.Fuzz target against the
bool[] oracle, an AOT smoke-test block, a benchmark registered in the
CI-tracked suite with the hand-rolled loop as its baseline and the query
position swept early/mid/late, dashboard cards in all three HTML surfaces,
API reference and README sections, CHANGELOG entries, and the ROADMAP status.

The cross-collection shared suites do not apply: they pin the hash-table
family contract (Add/TryAdd, load factor, indexer return type, IEnumerable
constructors), and none of them cover BitSet, FenwickTree, or SparseSet either.

Closes #312

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

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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown

Coverage

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

Also names the superblock-count expression, mirroring the existing WordCount
helper, so the two index-array sizings read the same way.

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

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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown

Benchmarks

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

Highlights

Benchmark This PR StdDev main Δ
BloomFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.57 ms 34.31 μs 1.76 ms -10.8% ✅
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 1000) 85.05 μs 4.33 μs 73.97 μs +15.0% ⚠️
TrieBenchmark.Trie_PrefixMatch(ItemCount: 100000) 8.73 ms 645.61 μs 6.42 ms +36.0% ⚠️
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 100000) 6.46 ms 62.48 μs 2.90 ms +122.7% ⚠️
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 100000) 2.88 ms 1.98 ms 5.97 ms -51.7% ✅
SparseSetBenchmark.HashSet_Add(ItemCount: 1000) 6.93 μs 298.3 ns 7.63 μs -9.3% ✅
DequeBenchmark.Deque_PushFront(ItemCount: 1000) 21.86 μs 4.37 μs 28.54 μs -23.4% ✅
DequeBenchmark.Deque_Queue(ItemCount: 1000) 32.03 μs 1.22 μs 37.75 μs -15.2% ✅
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.04 μs 295.2 ns 11.72 μs +11.2% ⚠️
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.54 ms 43.91 μs 1.83 ms -15.7% ✅
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 100000) 1.41 ms 78.19 μs 1.93 ms -27.0% ✅
Collections (508)
Benchmark This PR StdDev main Δ
BloomFilterBenchmark.HashSet_Add(ItemCount: 1000) 13.05 μs 575.5 ns 12.74 μs +2.4%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 1000) 14.52 μs 18.7 ns 14.50 μs +0.1%
BloomFilterBenchmark.HashSet_Add(ItemCount: 100000) 4.74 ms 193.17 μs 4.71 ms +0.7%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 100000) 1.10 ms 7.04 μs 1.10 ms +0.4%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 1000) 167.91 μs 1.21 μs 167.16 μs +0.5%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 1000) 2.72 ms 257.21 μs 2.82 ms -3.2%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 100000) 30.74 ms 295.78 μs 30.10 ms +2.1%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 100000) 1.64 s 68.83 ms 1.56 s +4.6%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.73 μs 26.1 ns 4.75 μs -0.3%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 1000) 6.89 μs 32.7 ns 7.03 μs -2.0%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 1000) 12.52 μs 11.2 ns 12.52 μs +0.0%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 1000) 89.05 μs 926.6 ns 90.26 μs -1.3%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.57 ms 34.31 μs 1.76 ms -10.8% ✅
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 100000) 1.99 ms 15.62 μs 1.98 ms +0.3%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 100000) 869.78 μs 918.7 ns 868.76 μs +0.1%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 100000) 7.50 ms 78.00 μs 7.43 ms +0.9%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 3.7 ns 4.54 μs -0.0%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 1000) 3.53 μs 8.9 ns 3.52 μs +0.4%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.93 ms 19.23 μs 1.94 ms -0.5%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 100000) 1.49 ms 901.4 ns 1.49 ms +0.0%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 1000) 10.35 μs 228.1 ns 10.47 μs -1.2%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 1000) 5.56 μs 203.8 ns 5.31 μs +4.6%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 100000) 1.49 ms 21.62 μs 1.46 ms +2.1%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 100000) 766.08 μs 17.40 μs 734.58 μs +4.3%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.33 μs 437.5 ns 13.98 μs +2.5%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 1000) 30.16 μs 366.8 ns 30.03 μs +0.4%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.55 ms 139.42 μs 4.60 ms -1.2%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 100000) 3.96 ms 14.05 μs 3.99 ms -0.8%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.53 μs 158.3 ns 4.53 μs +0.2%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.73 μs 8.3 ns 4.74 μs -0.2%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 1000) 1.72 μs 2.1 ns 1.72 μs -0.0%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 1000) 3.01 μs 7.2 ns 2.98 μs +0.8%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 100000) 664.85 μs 16.37 μs 655.41 μs +1.4%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.60 ms 8.82 μs 1.60 ms +0.3%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 100000) 192.52 μs 1.06 μs 189.76 μs +1.5%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 100000) 818.86 μs 2.80 μs 786.29 μs +4.1%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 1000) 183.12 μs 150.0 ns 182.57 μs +0.3%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 1000) 11.30 μs 48.6 ns 11.26 μs +0.3%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 100000) 165.91 ms 959.20 μs 166.77 ms -0.5%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 100000) 636.74 μs 9.05 μs 640.60 μs -0.6%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 1000) 221.01 μs 266.0 ns 220.88 μs +0.1%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 1000) 7.46 μs 6.9 ns 7.45 μs +0.1%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 100000) 208.18 ms 13.29 ms 203.02 ms +2.5%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 100000) 326.02 μs 1.42 μs 325.56 μs +0.1%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 1000) 56.52 μs 5.50 μs 50.29 μs +12.4%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 88.12 μs 7.61 μs 83.39 μs +5.7%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 1000) 83.37 μs 3.91 μs 81.69 μs +2.1%
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 1000) 85.05 μs 4.33 μs 73.97 μs +15.0% ⚠️
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 100000) 540.44 μs 16.57 μs 547.02 μs -1.2%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.09 ms 53.13 μs 2.06 ms +1.6%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 100000) 1.27 ms 20.55 μs 1.28 ms -0.6%
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 100000) 1.73 ms 156.40 μs 1.81 ms -4.0%
EnumMapBenchmark.Dictionary_Add 667.1 ns 8.5 ns 782.9 ns -14.8%
EnumSetBenchmark.HashSet_Add 608.1 ns 17.2 ns 699.3 ns -13.1%
EnumMapBenchmark.EnumMap_Add 161.4 ns 3.3 ns 151.2 ns +6.8%
EnumSetBenchmark.EnumSet_Add 89.5 ns 0.2 ns 88.8 ns +0.7%
SmallSetBenchmark.HashSet_Add(ItemCount: 8) 169.3 ns 5.9 ns 163.3 ns +3.6%
SmallSetBenchmark.SmallSet_Add(ItemCount: 8) 48.5 ns 1.4 ns 47.1 ns +2.9%
SmallSetBenchmark.HashSet_Add(ItemCount: 64) 768.4 ns 13.1 ns 757.2 ns +1.5%
SmallSetBenchmark.SmallSet_Add(ItemCount: 64) 1.94 μs 290.0 ns 1.67 μs +16.1%
TrieBenchmark.Dictionary_Add(ItemCount: 1000) 40.65 μs 10.71 μs 32.38 μs +25.5%
TrieBenchmark.Trie_Add(ItemCount: 1000) 553.54 μs 32.38 μs 453.95 μs +21.9%
TrieBenchmark.Dictionary_Add(ItemCount: 100000) 5.21 ms 1.43 ms 5.10 ms +2.3%
TrieBenchmark.Trie_Add(ItemCount: 100000) 26.81 ms 567.40 μs 27.50 ms -2.5%
RankSelectBitVectorBenchmark.Array_Build(ItemCount: 1024) 91.4 ns 0.4 ns 91.8 ns -0.4%
RankSelectBitVectorBenchmark.RankSelectBitVector_Build(ItemCount: 1024) 63.1 ns 2.2 ns 62.3 ns +1.4%
RankSelectBitVectorBenchmark.Array_Build(ItemCount: 1000000) 67.73 μs 459.3 ns 67.63 μs +0.2%
RankSelectBitVectorBenchmark.RankSelectBitVector_Build(ItemCount: 1000000) 88.40 μs 1.04 μs 86.87 μs +1.8%
EnumSetBenchmark.HashSet_Contains 175.2 ns 0.2 ns 175.3 ns -0.1%
EnumSetBenchmark.EnumSet_Contains 46.0 ns 0.1 ns 46.0 ns -0.1%
SmallSetBenchmark.HashSet_Contains(ItemCount: 8) 37.1 ns 0.1 ns 37.4 ns -0.7%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 8) 19.3 ns 0.2 ns 19.2 ns +0.5%
SmallSetBenchmark.HashSet_Contains(ItemCount: 64) 299.5 ns 0.3 ns 300.2 ns -0.2%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 64) 1.13 μs 15.7 ns 1.10 μs +2.4%
EnumMapBenchmark.Dictionary_Enumerate 50.6 ns 0.1 ns 50.6 ns +0.1%
EnumMapBenchmark.EnumMap_Enumerate 39.6 ns 0.1 ns 39.7 ns -0.2%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 1000) 31.16 μs 287.9 ns 29.93 μs +4.1%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 1000) 39.03 μs 453.5 ns 38.28 μs +2.0%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 100000) 12.70 ms 635.52 μs 12.79 ms -0.7%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 100000) 17.88 ms 406.26 μs 17.53 ms +2.0%
EnumMapBenchmark.Dictionary_Lookup 117.7 ns 0.1 ns 117.7 ns +0.0%
EnumMapBenchmark.EnumMap_Lookup 63.5 ns 0.2 ns 63.2 ns +0.5%
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.02 μs 45.5 ns 5.17 μs -2.9%
TrieBenchmark.Dictionary_Lookup(ItemCount: 1000) 13.50 μs 493.2 ns 13.22 μs +2.2%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 1000) 2.36 μs 10.3 ns 2.36 μs -0.1%
TrieBenchmark.Trie_Lookup(ItemCount: 1000) 40.95 μs 262.2 ns 40.77 μs +0.4%
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.76 ms 8.75 μs 1.74 ms +1.0%
TrieBenchmark.Dictionary_Lookup(ItemCount: 100000) 2.70 ms 4.40 μs 2.68 ms +0.5%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 100000) 740.70 μs 7.46 μs 734.26 μs +0.9%
TrieBenchmark.Trie_Lookup(ItemCount: 100000) 8.57 ms 134.42 μs 8.44 ms +1.6%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 1000) 73.37 μs 186.0 ns 73.17 μs +0.3%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 1000) 57.78 μs 437.8 ns 56.72 μs +1.9%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 100000) 7.40 ms 7.35 μs 7.40 ms +0.1%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 100000) 8.73 ms 645.61 μs 6.42 ms +36.0% ⚠️
RankSelectBitVectorBenchmark.Array_RankEarly(ItemCount: 1024) 1.23 μs 1.7 ns 1.23 μs -0.1%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankEarly(ItemCount: 1024) 1.88 μs 2.1 ns 1.88 μs +0.0%
RankSelectBitVectorBenchmark.Array_RankEarly(ItemCount: 1000000) 33.01 μs 301.4 ns 32.93 μs +0.3%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankEarly(ItemCount: 1000000) 1.88 μs 2.3 ns 1.88 μs +0.0%
RankSelectBitVectorBenchmark.Array_RankLate(ItemCount: 1024) 6.44 μs 17.3 ns 6.55 μs -1.7%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankLate(ItemCount: 1024) 1.88 μs 1.9 ns 1.88 μs -0.0%
RankSelectBitVectorBenchmark.Array_RankLate(ItemCount: 1000000) 4.92 ms 64.77 μs 5.09 ms -3.2%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankLate(ItemCount: 1000000) 1.96 μs 1.4 ns 1.88 μs +4.6%
RankSelectBitVectorBenchmark.Array_RankMid(ItemCount: 1024) 4.87 μs 6.2 ns 4.87 μs -0.0%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankMid(ItemCount: 1024) 1.88 μs 8.3 ns 1.88 μs +0.1%
RankSelectBitVectorBenchmark.Array_RankMid(ItemCount: 1000000) 2.52 ms 56.28 μs 2.48 ms +1.9%
RankSelectBitVectorBenchmark.RankSelectBitVector_RankMid(ItemCount: 1000000) 1.87 μs 0.9 ns 1.88 μs -0.0%
EnumMapBenchmark.Dictionary_Remove 3.64 μs 458.1 ns 3.62 μs +0.4%
EnumSetBenchmark.HashSet_Remove 3.45 μs 469.7 ns 3.38 μs +1.9%
EnumMapBenchmark.EnumMap_Remove 1.79 μs 459.5 ns 1.79 μs +0.1%
EnumSetBenchmark.EnumSet_Remove 1.07 μs 54.3 ns 1.07 μs -0.8%
SmallSetBenchmark.HashSet_Remove(ItemCount: 8) 435.0 ns 50.2 ns 522.6 ns -16.8%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 8) 1.19 μs 117.2 ns 1.29 μs -7.3%
SmallSetBenchmark.HashSet_Remove(ItemCount: 64) 1.28 μs 68.9 ns 1.36 μs -5.7%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 64) 24.58 μs 4.17 μs 26.60 μs -7.6%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 1000) 34.07 μs 3.74 μs 32.35 μs +5.3%
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 1000) 127.03 μs 9.70 μs 129.50 μs -1.9%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 2.98 ms 434.67 μs 2.28 ms +30.8%
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 100000) 2.52 ms 258.47 μs 2.10 ms +19.6%
RankSelectBitVectorBenchmark.Array_Select(ItemCount: 1024) 13.02 μs 59.2 ns 13.02 μs +0.0%
RankSelectBitVectorBenchmark.RankSelectBitVector_Select(ItemCount: 1024) 11.42 μs 16.4 ns 11.41 μs +0.1%
RankSelectBitVectorBenchmark.Array_Select(ItemCount: 1000000) 4.23 ms 3.70 μs 4.23 ms -0.1%
RankSelectBitVectorBenchmark.RankSelectBitVector_Select(ItemCount: 1000000) 25.38 μs 46.4 ns 25.45 μs -0.3%
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 1000) 41.66 μs 234.7 ns 40.24 μs +3.5%
TrieBenchmark.Trie_SpanLookup(ItemCount: 1000) 43.19 μs 317.3 ns 43.16 μs +0.1%
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 100000) 5.84 ms 39.05 μs 5.69 ms +2.6%
TrieBenchmark.Trie_SpanLookup(ItemCount: 100000) 8.65 ms 122.20 μs 8.49 ms +1.8%
EnumSetBenchmark.HashSet_Union 437.3 ns 11.6 ns 429.2 ns +1.9%
EnumSetBenchmark.EnumSet_Union 23.4 ns 0.9 ns 22.3 ns +4.8%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 1000) 87.69 μs 2.45 μs 86.65 μs +1.2%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 1000) 8.86 μs 57.7 ns 8.83 μs +0.3%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 1000) 62.91 μs 4.63 μs 65.26 μs -3.6%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 1000) 81.72 μs 29.1 ns 81.69 μs +0.0%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 100000) 22.09 ms 150.81 μs 22.28 ms -0.8%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 100000) 3.29 ms 119.54 μs 3.43 ms -4.2%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 100000) 15.32 ms 170.55 μs 14.97 ms +2.3%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 100000) 568.57 μs 1.15 μs 569.00 μs -0.1%
XorFilterBenchmark.HashSet_Build(ItemCount: 1000) 5.34 μs 22.6 ns 5.31 μs +0.5%
XorFilterBenchmark.XorFilter_Build(ItemCount: 1000) 29.47 μs 183.1 ns 29.19 μs +1.0%
XorFilterBenchmark.HashSet_Build(ItemCount: 100000) 1.54 ms 28.64 μs 1.52 ms +1.3%
XorFilterBenchmark.XorFilter_Build(ItemCount: 100000) 9.03 ms 405.38 μs 8.78 ms +2.8%
XorFilterBenchmark.HashSet_Contains(ItemCount: 1000) 2.94 μs 7.1 ns 2.94 μs +0.0%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 1000) 5.13 μs 12.6 ns 5.14 μs -0.0%
XorFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.17 ms 54.78 μs 1.21 ms -3.7%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 100000) 548.90 μs 498.0 ns 549.43 μs -0.1%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 2.99 μs 6.6 ns 2.99 μs +0.2%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 1000) 5.12 μs 3.1 ns 5.14 μs -0.2%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.53 ms 8.85 μs 1.55 ms -0.8%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 100000) 549.96 μs 1.07 μs 548.94 μs +0.2%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 1000) 0.0 ns 0.0 ns 0.0 ns +58.5%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 1000) 78.34 μs 98.2 ns 78.32 μs +0.0%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 100000) 0.0 ns 0.0 ns 0.0 ns +53.6%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 100000) 78.79 μs 44.5 ns 78.80 μs -0.0%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 8) 119.6 ns 1.1 ns 122.4 ns -2.3%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 8) 67.0 ns 0.4 ns 70.1 ns -4.4%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 64) 573.5 ns 3.3 ns 577.5 ns -0.7%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 64) 890.9 ns 2.5 ns 898.9 ns -0.9%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 9.80 μs 72.4 ns 9.64 μs +1.7%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 9.80 μs 112.6 ns 9.78 μs +0.2%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 1000) 6.86 μs 82.3 ns 6.88 μs -0.3%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 1000) 8.08 μs 39.5 ns 7.97 μs +1.4%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 3.45 ms 66.51 μs 3.49 ms -1.3%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 3.75 ms 159.62 μs 3.73 ms +0.4%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 100000) 4.36 ms 165.90 μs 4.19 ms +4.2%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 100000) 5.73 ms 80.07 μs 5.71 ms +0.3%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 8) 22.3 ns 0.1 ns 22.3 ns -0.1%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 8) 25.3 ns 0.1 ns 25.3 ns +0.2%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 64) 189.0 ns 0.5 ns 189.5 ns -0.2%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 64) 856.7 ns 7.1 ns 851.8 ns +0.6%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 1000) 51.59 μs 538.5 ns 51.44 μs +0.3%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 2.96 μs 53.0 ns 2.96 μs -0.2%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 2.94 μs 49.0 ns 2.93 μs +0.3%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 1000) 43.36 μs 301.9 ns 43.71 μs -0.8%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 1.82 μs 4.0 ns 1.82 μs -0.3%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 1000) 4.55 μs 2.83 μs 2.07 μs +120.0%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 100000) 18.25 ms 414.12 μs 17.65 ms +3.4%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.25 ms 3.06 μs 1.25 ms -0.6%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.25 ms 5.23 μs 1.24 ms +1.1%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 100000) 13.35 ms 94.61 μs 13.43 ms -0.6%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 642.35 μs 11.03 μs 630.90 μs +1.8%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 100000) 826.74 μs 11.82 μs 831.29 μs -0.5%
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 1000) 200.03 μs 1.09 μs 199.87 μs +0.1%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 1000) 122.85 μs 2.53 μs 132.73 μs -7.4%
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 100000) 46.36 ms 863.27 μs 46.57 ms -0.4%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 100000) 25.90 ms 139.93 μs 26.57 ms -2.5%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 1000) 3.58 μs 220.2 ns 3.60 μs -0.6%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 1000) 58.2 ns 0.1 ns 60.0 ns -3.1%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 100000) 1.15 ms 6.96 μs 1.14 ms +0.9%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 100000) 4.21 μs 14.3 ns 4.21 μs +0.0%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 8) 872.2 ns 195.8 ns 1.01 μs -13.3%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 8) 1.53 μs 759.9 ns 1.75 μs -12.6%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 64) 5.14 μs 1.08 μs 5.86 μs -12.3%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 64) 22.16 μs 6.56 μs 28.46 μs -22.1%
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 1000) 555.73 μs 15.45 μs 534.40 μs +4.0%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 56.78 μs 6.58 μs 63.43 μs -10.5%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 60.43 μs 6.88 μs 58.25 μs +3.7%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 1000) 216.79 μs 12.87 μs 221.77 μs -2.2%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 1000) 93.88 μs 9.13 μs 100.62 μs -6.7%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 1000) 92.04 μs 8.71 μs 94.39 μs -2.5%
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 100000) 26.63 ms 816.70 μs 26.65 ms -0.1%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.60 ms 26.25 μs 1.57 ms +1.8%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.57 ms 24.53 μs 1.60 ms -1.7%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 100000) 17.13 ms 59.81 μs 16.71 ms +2.5%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 100000) 6.46 ms 62.48 μs 2.90 ms +122.7% ⚠️
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 100000) 2.88 ms 1.98 ms 5.97 ms -51.7% ✅
BTreeSetBenchmark.SortedSet_Add(ItemCount: 1000) 42.57 μs 1.55 μs 44.90 μs -5.2%
CeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 13.34 μs 353.1 ns 14.20 μs -6.1%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 1000) 10.48 μs 89.0 ns 10.88 μs -3.7%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 1000) 42.24 μs 292.1 ns 42.47 μs -0.5%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 1000) 9.45 μs 88.9 ns 9.47 μs -0.2%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 1000) 10.70 μs 188.9 ns 11.37 μs -5.9%
BTreeSetBenchmark.SortedSet_Add(ItemCount: 100000) 21.35 ms 324.67 μs 22.01 ms -3.0%
CeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 5.26 ms 105.80 μs 5.27 ms -0.2%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 100000) 1.45 ms 24.02 μs 1.50 ms -2.8%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 100000) 13.98 ms 55.65 μs 14.11 ms -0.9%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 100000) 3.20 ms 17.00 μs 3.21 ms -0.0%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 100000) 964.36 μs 1.45 μs 964.53 μs -0.0%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 1000) 16.72 μs 26.0 ns 16.79 μs -0.4%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 4.77 μs 26.3 ns 4.76 μs +0.2%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 1000) 17.32 μs 163.0 ns 17.48 μs -0.9%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 1000) 1.97 μs 114.7 ns 1.96 μs +0.7%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 100000) 15.96 ms 145.63 μs 16.21 ms -1.5%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.60 ms 15.97 μs 1.59 ms +0.3%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 100000) 12.85 ms 207.34 μs 12.81 ms +0.3%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 100000) 593.85 μs 1.08 μs 595.55 μs -0.3%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 1000) 4.38 μs 12.8 ns 4.37 μs +0.2%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 1000) 10.13 μs 24.9 ns 10.07 μs +0.7%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 100000) 493.58 μs 3.22 μs 524.53 μs -5.9%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 100000) 1.98 ms 4.16 μs 2.01 ms -1.4%
LruCacheBenchmark.Dictionary_Get(ItemCount: 1000) 24.95 μs 150.4 ns 24.43 μs +2.1%
LruCacheBenchmark.LruCache_Get(ItemCount: 1000) 6.82 μs 79.0 ns 6.83 μs -0.1%
LruCacheBenchmark.Dictionary_Get(ItemCount: 100000) 25.14 μs 392.4 ns 25.55 μs -1.6%
LruCacheBenchmark.LruCache_Get(ItemCount: 100000) 7.02 μs 111.3 ns 7.01 μs +0.2%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 1000) 4.83 μs 95.5 ns 4.82 μs +0.2%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 1000) 3.61 μs 15.4 ns 3.59 μs +0.4%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 100000) 531.06 μs 5.21 μs 519.56 μs +2.2%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 100000) 1.35 ms 3.14 μs 1.34 ms +0.7%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.97 μs 1.04 μs 15.17 μs -1.3%
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.16 μs 588.5 ns 15.67 μs -9.7%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 1000) 8.13 μs 16.4 ns 8.11 μs +0.2%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 1000) 18.15 μs 406.8 ns 18.37 μs -1.2%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 5.00 ms 116.56 μs 5.10 ms -1.9%
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.84 ms 60.58 μs 4.90 ms -1.2%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 100000) 2.96 ms 5.24 μs 2.97 ms -0.3%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 100000) 8.57 ms 356.65 μs 8.38 ms +2.3%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.73 μs 7.3 ns 4.72 μs +0.3%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.75 μs 23.7 ns 4.74 μs +0.2%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 1000) 2.62 μs 140.3 ns 2.50 μs +4.6%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 1000) 3.13 μs 320.2 ns 2.83 μs +10.6%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.57 ms 49.05 μs 1.67 ms -6.0%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.61 ms 1.18 μs 1.61 ms -0.3%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 100000) 721.33 μs 6.33 μs 725.04 μs -0.5%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 100000) 846.28 μs 19.99 μs 863.12 μs -2.0%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 1000) 100.52 μs 651.7 ns 103.38 μs -2.8%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 1000) 64.20 μs 4.53 μs 61.22 μs +4.9%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 100000) 31.07 ms 1.36 ms 32.19 ms -3.5%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 100000) 23.61 ms 36.32 μs 24.18 ms -2.3%
LruCacheBenchmark.Dictionary_Put(ItemCount: 1000) 112.45 μs 5.88 μs 113.52 μs -0.9%
LruCacheBenchmark.LruCache_Put(ItemCount: 1000) 466.60 μs 19.25 μs 466.92 μs -0.1%
LruCacheBenchmark.Dictionary_Put(ItemCount: 100000) 6.52 ms 994.40 μs 6.73 ms -3.1%
LruCacheBenchmark.LruCache_Put(ItemCount: 100000) 5.79 ms 23.11 μs 5.78 ms +0.2%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 1000) 179.4 ns 3.5 ns 179.1 ns +0.2%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 1000) 77.0 ns 2.8 ns 74.1 ns +3.8%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 100000) 9.73 μs 407.2 ns 9.69 μs +0.4%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 100000) 5.18 μs 19.0 ns 5.22 μs -0.7%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 1000) 748.23 μs 10.90 μs 736.92 μs +1.5%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 32.01 μs 4.52 μs 27.56 μs +16.1%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 84.99 μs 11.31 μs 85.52 μs -0.6%
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 84.17 μs 8.05 μs 88.11 μs -4.5%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 1000) 266.53 μs 14.31 μs 268.38 μs -0.7%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 1000) 119.75 μs 9.17 μs 115.61 μs +3.6%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 1000) 122.71 μs 7.00 μs 134.39 μs -8.7%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 1000) 120.71 μs 10.91 μs 111.13 μs +8.6%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 100000) 25.36 ms 62.31 μs 25.64 ms -1.1%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.72 ms 21.35 μs 1.76 ms -2.4%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.08 ms 21.52 μs 2.15 ms -3.4%
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.07 ms 18.90 μs 2.09 ms -0.6%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 100000) 15.40 ms 324.02 μs 15.45 ms -0.3%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 100000) 1.32 ms 60.52 μs 1.55 ms -15.4%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 100000) 1.62 ms 46.59 μs 1.81 ms -10.4%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 100000) 2.20 ms 337.06 μs 2.14 ms +2.9%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 12.28 μs 138.0 ns 13.20 μs -7.0%
SparseSetBenchmark.HashSet_Add(ItemCount: 1000) 6.93 μs 298.3 ns 7.63 μs -9.3% ✅
SwissSetBenchmark.HashSet_Add(ItemCount: 1000) 12.41 μs 166.4 ns 12.59 μs -1.4%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 1000) 13.69 μs 266.3 ns 13.40 μs +2.1%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 1000) 8.82 μs 247.2 ns 8.08 μs +9.2%
SparseSetBenchmark.SparseSet_Add(ItemCount: 1000) 6.33 μs 67.0 ns 6.52 μs -2.9%
SwissSetBenchmark.SwissSet_Add(ItemCount: 1000) 27.42 μs 989.9 ns 26.94 μs +1.8%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 1000) 87.63 μs 542.0 ns 87.62 μs +0.0%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 4.81 ms 142.58 μs 4.91 ms -2.0%
SparseSetBenchmark.HashSet_Add(ItemCount: 100000) 1.71 ms 28.74 μs 1.73 ms -1.5%
SwissSetBenchmark.HashSet_Add(ItemCount: 100000) 4.72 ms 64.51 μs 4.73 ms -0.3%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 100000) 3.25 ms 50.64 μs 3.21 ms +1.0%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 100000) 2.88 ms 10.28 μs 2.89 ms -0.4%
SparseSetBenchmark.SparseSet_Add(ItemCount: 100000) 1.51 ms 91.02 μs 1.46 ms +3.0%
SwissSetBenchmark.SwissSet_Add(ItemCount: 100000) 4.60 ms 72.53 μs 4.62 ms -0.4%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 100000) 14.20 ms 17.89 μs 14.62 ms -2.9%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 1000) 5.93 μs 6.0 ns 6.01 μs -1.3%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 1000) 4.56 μs 94.1 ns 4.66 μs -2.1%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 100000) 1.36 ms 3.35 μs 1.36 ms -0.2%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 100000) 641.62 μs 1.29 μs 642.33 μs -0.1%
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 5.05 μs 35.4 ns 4.74 μs +6.5%
SparseSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.65 μs 10.1 ns 4.69 μs -0.8%
SwissSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.75 μs 36.2 ns 4.76 μs -0.2%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 1000) 1.93 μs 15.8 ns 1.98 μs -2.5%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 1000) 1.28 μs 0.5 ns 1.29 μs -0.3%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 1000) 2.86 μs 16.1 ns 2.87 μs -0.3%
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.57 ms 16.61 μs 1.58 ms -0.7%
SparseSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.30 ms 39.82 μs 1.36 ms -4.4%
SwissSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.55 ms 6.30 μs 1.57 ms -1.0%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 100000) 578.72 μs 945.8 ns 576.96 μs +0.3%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 100000) 256.24 μs 458.2 ns 255.70 μs +0.2%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 100000) 628.49 μs 5.91 μs 631.52 μs -0.5%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 4.3 ns 4.54 μs -0.1%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 1000) 2.37 μs 7.1 ns 2.37 μs -0.2%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.93 ms 6.02 μs 1.91 ms +0.9%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 100000) 349.97 μs 9.44 μs 335.75 μs +4.2%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 1000) 1.37 μs 0.7 ns 1.37 μs +0.1%
DequeBenchmark.Deque_Enumerate(ItemCount: 1000) 941.6 ns 0.4 ns 942.3 ns -0.1%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 100000) 134.96 μs 119.3 ns 134.97 μs -0.0%
DequeBenchmark.Deque_Enumerate(ItemCount: 100000) 93.78 μs 72.7 ns 93.83 μs -0.1%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.58 μs 222.2 ns 13.94 μs -2.5%
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 1000) 11.62 μs 157.2 ns 12.29 μs -5.5%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.12 ms 66.21 μs 4.32 ms -4.7%
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 100000) 4.90 ms 43.76 μs 4.99 ms -1.8%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.75 μs 14.4 ns 4.73 μs +0.5%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 1000) 2.14 μs 2.7 ns 2.14 μs +0.1%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.55 ms 48.25 μs 1.61 ms -3.3%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 100000) 673.27 μs 1.49 μs 680.06 μs -1.0%
DequeBenchmark.LinkedList_PushFront(ItemCount: 1000) 42.11 μs 9.39 μs 43.97 μs -4.2%
DequeBenchmark.Deque_PushFront(ItemCount: 1000) 21.86 μs 4.37 μs 28.54 μs -23.4% ✅
DequeBenchmark.LinkedList_PushFront(ItemCount: 100000) 1.86 ms 56.42 μs 1.83 ms +1.3%
DequeBenchmark.Deque_PushFront(ItemCount: 100000) 662.28 μs 34.66 μs 763.86 μs -13.3%
DequeBenchmark.LinkedList_Queue(ItemCount: 1000) 61.02 μs 4.56 μs 59.30 μs +2.9%
DequeBenchmark.Deque_Queue(ItemCount: 1000) 32.03 μs 1.22 μs 37.75 μs -15.2% ✅
DequeBenchmark.LinkedList_Queue(ItemCount: 100000) 4.34 ms 154.29 μs 4.30 ms +1.0%
DequeBenchmark.Deque_Queue(ItemCount: 100000) 509.87 μs 115.04 μs 431.26 μs +18.2%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 80.58 μs 6.11 μs 87.88 μs -8.3%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 27.15 μs 1.74 μs 30.60 μs -11.3%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 1000) 96.97 μs 7.54 μs 96.78 μs +0.2%
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 1000) 116.55 μs 5.10 μs 123.74 μs -5.8%
SparseSetBenchmark.HashSet_Remove(ItemCount: 1000) 25.30 μs 1.14 μs 27.76 μs -8.9%
SwissSetBenchmark.HashSet_Remove(ItemCount: 1000) 29.87 μs 3.43 μs 30.89 μs -3.3%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 1000) 25.93 μs 4.11 μs 23.58 μs +9.9%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 1000) 80.18 μs 4.09 μs 79.93 μs +0.3%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.07 ms 32.50 μs 2.05 ms +1.2%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.71 ms 16.65 μs 1.71 ms +0.3%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 100000) 2.71 ms 2.13 ms 1.65 ms +64.3%
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 100000) 1.31 ms 51.32 μs 1.30 ms +0.3%
SparseSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.48 ms 12.85 μs 1.50 ms -1.6%
SwissSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.70 ms 11.51 μs 1.72 ms -0.9%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 100000) 789.78 μs 11.39 μs 797.26 μs -0.9%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 100000) 1.06 ms 6.41 μs 1.08 ms -1.6%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 1000) 29.4 ns 0.2 ns 29.1 ns +1.0%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 1000) 1.25 μs 17.5 ns 1.20 μs +4.1%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 100000) 29.1 ns 0.9 ns 30.1 ns -3.6%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 100000) 1.16 μs 6.9 ns 1.16 μs -0.6%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 1000) 10.23 μs 243.6 ns 10.09 μs +1.4%
IntSetBenchmark.HashSet_Add(ItemCount: 1000) 9.88 μs 181.4 ns 10.82 μs -8.7%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 1000) 9.78 μs 100.7 ns 10.38 μs -5.7%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 1000) 6.20 μs 15.5 ns 6.17 μs +0.6%
IntSetBenchmark.IntSet_Add(ItemCount: 1000) 7.04 μs 100.6 ns 7.46 μs -5.6%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 1000) 10.99 μs 72.5 ns 11.30 μs -2.8%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 100000) 3.91 ms 131.21 μs 3.86 ms +1.4%
IntSetBenchmark.HashSet_Add(ItemCount: 100000) 4.24 ms 139.28 μs 4.29 ms -1.1%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 100000) 4.11 ms 56.19 μs 4.17 ms -1.4%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 100000) 1.78 ms 3.29 μs 1.78 ms +0.1%
IntSetBenchmark.IntSet_Add(ItemCount: 100000) 2.70 ms 15.94 μs 2.70 ms -0.2%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 100000) 5.40 ms 100.90 μs 5.36 ms +0.8%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 1000) 13.99 μs 191.9 ns 13.55 μs +3.3%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 1000) 12.68 μs 153.3 ns 12.50 μs +1.4%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 100000) 3.65 ms 105.12 μs 3.60 ms +1.2%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 100000) 2.83 ms 220.66 μs 2.65 ms +6.8%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 1000) 7.39 μs 17.2 ns 7.39 μs +0.0%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 1000) 10.10 μs 14.1 ns 10.17 μs -0.7%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 100000) 121.74 μs 553.7 ns 119.76 μs +1.7%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 100000) 221.70 μs 537.1 ns 218.64 μs +1.4%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 1000) 3.67 μs 3.2 ns 3.67 μs +0.1%
IntSetBenchmark.HashSet_Contains(ItemCount: 1000) 3.65 μs 3.0 ns 3.65 μs +0.1%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 1000) 3.70 μs 37.6 ns 3.68 μs +0.6%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 1000) 4.31 μs 2.1 ns 4.31 μs +0.0%
IntSetBenchmark.IntSet_Contains(ItemCount: 1000) 1.49 μs 15.7 ns 1.49 μs +0.2%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 1000) 2.19 μs 2.4 ns 2.19 μs -0.1%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.18 ms 1.23 μs 1.18 ms +0.1%
IntSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.17 ms 3.95 μs 1.19 ms -2.2%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.21 ms 24.20 μs 1.18 ms +2.3%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 100000) 1.53 ms 361.2 ns 1.53 ms -0.0%
IntSetBenchmark.IntSet_Contains(ItemCount: 100000) 379.79 μs 8.76 μs 382.50 μs -0.7%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 100000) 622.88 μs 10.81 μs 608.81 μs +2.3%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 3.54 μs 3.3 ns 3.54 μs -0.1%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 3.55 μs 7.9 ns 3.54 μs +0.2%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 1000) 7.46 μs 2.9 ns 7.47 μs -0.1%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 1000) 2.08 μs 5.2 ns 2.08 μs +0.1%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.55 ms 6.73 μs 1.55 ms +0.2%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.53 ms 2.94 μs 1.54 ms -0.5%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 100000) 764.32 μs 301.6 ns 764.38 μs -0.0%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 100000) 1.00 ms 2.80 μs 1.00 ms -0.3%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 1000) 62.87 μs 2.77 μs 61.97 μs +1.5%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 1000) 146.06 μs 220.1 ns 145.96 μs +0.1%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 100000) 28.13 ms 464.37 μs 28.73 ms -2.1%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 100000) 44.37 ms 328.86 μs 44.18 ms +0.4%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 1000) 3.87 μs 98.4 ns 3.73 μs +3.8%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 1000) 22.98 μs 179.6 ns 22.98 μs +0.0%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 100000) 910.78 μs 5.71 μs 885.70 μs +2.8%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 100000) 5.06 ms 173.79 μs 5.05 ms +0.3%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.04 μs 295.2 ns 11.72 μs +11.2% ⚠️
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 1000) 7.24 μs 278.2 ns 6.61 μs +9.5%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.31 ms 111.32 μs 4.18 ms +3.0%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 100000) 6.32 ms 56.73 μs 6.16 ms +2.6%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.87 μs 3.2 ns 3.87 μs -0.1%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 1000) 1.76 μs 6.9 ns 1.76 μs +0.3%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.23 ms 3.74 μs 1.24 ms -1.1%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 100000) 545.99 μs 13.55 μs 552.26 μs -1.1%
IntSetBenchmark.HashSet_Remove(ItemCount: 1000) 24.34 μs 2.80 μs 23.76 μs +2.4%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 67.75 μs 7.27 μs 65.42 μs +3.6%
IntSetBenchmark.IntSet_Remove(ItemCount: 1000) 62.72 μs 5.96 μs 64.00 μs -2.0%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 1000) 65.84 μs 5.04 μs 66.33 μs -0.7%
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 1000) 22.18 μs 3.56 μs 23.11 μs -4.0%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 1000) 89.81 μs 4.34 μs 85.38 μs +5.2%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 1000) 10.81 μs 50.1 ns 10.60 μs +2.0%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 1000) 11.19 μs 14.0 ns 11.10 μs +0.8%
IntSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.31 ms 19.34 μs 1.30 ms +0.7%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.54 ms 43.91 μs 1.83 ms -15.7% ✅
IntSetBenchmark.IntSet_Remove(ItemCount: 100000) 1.17 ms 89.04 μs 1.12 ms +3.9%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 100000) 1.41 ms 78.19 μs 1.93 ms -27.0% ✅
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.32 ms 12.84 μs 1.32 ms +0.1%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 100000) 1.25 ms 19.28 μs 1.26 ms -1.3%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 100000) 2.98 ms 55.38 μs 2.90 ms +2.8%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 100000) 3.47 ms 5.78 μs 3.46 ms +0.1%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 1000) 74.98 μs 1.38 μs 74.91 μs +0.1%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 1000) 21.74 μs 145.4 ns 21.59 μs +0.7%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 100000) 39.47 ms 2.54 ms 38.93 ms +1.4%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 100000) 6.15 ms 60.69 μs 6.06 ms +1.5%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 1000) 12.93 μs 370.0 ns 13.10 μs -1.3%
LongSetBenchmark.HashSet_Add(ItemCount: 1000) 13.16 μs 128.4 ns 13.76 μs -4.3%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 1000) 11.16 μs 236.2 ns 11.47 μs -2.7%
LongSetBenchmark.LongSet_Add(ItemCount: 1000) 9.17 μs 61.4 ns 9.28 μs -1.2%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 100000) 4.31 ms 559.33 μs 4.05 ms +6.6%
LongSetBenchmark.HashSet_Add(ItemCount: 100000) 4.51 ms 230.90 μs 4.64 ms -3.0%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 100000) 5.28 ms 71.50 μs 5.27 ms +0.1%
LongSetBenchmark.LongSet_Add(ItemCount: 100000) 6.15 ms 53.89 μs 6.16 ms -0.1%
BitSetBenchmark.BitArray_And(ItemCount: 1024) 55.7 ns 0.9 ns 56.2 ns -1.0%
BitSetBenchmark.BitSet_And(ItemCount: 1024) 1.25 μs 5.4 ns 1.24 μs +0.3%
BitSetBenchmark.BitArray_And(ItemCount: 1000000) 44.55 μs 511.1 ns 44.51 μs +0.1%
BitSetBenchmark.BitSet_And(ItemCount: 1000000) 4.48 ms 5.82 μs 4.56 ms -1.7%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 1000) 171.54 μs 9.36 μs 160.23 μs +7.1%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 1000) 4.05 ms 112.34 μs 3.95 ms +2.5%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 100000) 28.54 ms 389.08 μs 28.63 ms -0.3%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 100000) 1.52 s 34.75 ms 1.51 s +0.7%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.72 μs 6.9 ns 4.72 μs +0.0%
LongSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.79 μs 50.2 ns 4.80 μs -0.1%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 1000) 2.54 μs 4.2 ns 2.53 μs +0.2%
LongSetBenchmark.LongSet_Contains(ItemCount: 1000) 2.00 μs 11.9 ns 2.00 μs -0.2%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 1000) 18.24 μs 238.2 ns 18.16 μs +0.5%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 1000) 24.43 μs 111.3 ns 24.49 μs -0.3%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.53 ms 55.88 μs 1.52 ms +1.0%
LongSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.65 ms 6.01 μs 1.65 ms +0.0%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 100000) 724.70 μs 1.77 μs 728.03 μs -0.5%
LongSetBenchmark.LongSet_Contains(ItemCount: 100000) 643.15 μs 776.0 ns 643.04 μs +0.0%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 100000) 3.46 ms 23.85 μs 3.47 ms -0.2%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 100000) 5.00 ms 79.27 μs 4.96 ms +0.9%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 3.7 ns 4.54 μs -0.1%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 1000) 2.95 μs 2.4 ns 2.95 μs -0.1%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.95 ms 6.57 μs 1.95 ms +0.1%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 100000) 1.13 ms 1.29 μs 1.13 ms -0.2%
StringInternTableBenchmark.Dictionary_Dedupe(ItemCount: 1000) 34.04 μs 450.3 ns 33.73 μs +0.9%
StringInternTableBenchmark.StringInternTable_Dedupe(ItemCount: 1000) 35.98 μs 241.6 ns 35.79 μs +0.5%
StringInternTableBenchmark.Dictionary_Dedupe(ItemCount: 100000) 3.32 ms 35.66 μs 3.31 ms +0.2%
StringInternTableBenchmark.StringInternTable_Dedupe(ItemCount: 100000) 3.19 ms 1.95 μs 3.19 ms -0.0%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 1000) 18.25 μs 255.2 ns 18.67 μs -2.3%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 26.48 μs 96.5 ns 27.03 μs -2.0%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 1000) 7.33 μs 21.2 ns 7.32 μs +0.0%
StringInternTableBenchmark.HashSet_Lookup(ItemCount: 1000) 32.28 μs 337.3 ns 32.34 μs -0.2%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 1000) 87.23 μs 2.85 μs 88.39 μs -1.3%
StringInternTableBenchmark.StringInternTable_Lookup(ItemCount: 1000) 31.44 μs 21.4 ns 31.39 μs +0.1%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 100000) 3.61 ms 50.28 μs 3.58 ms +0.8%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 5.39 ms 195.73 μs 5.23 ms +3.1%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 100000) 2.02 ms 12.65 μs 2.00 ms +1.0%
StringInternTableBenchmark.HashSet_Lookup(ItemCount: 100000) 3.34 ms 40.50 μs 3.50 ms -4.5%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 100000) 7.65 ms 109.57 μs 7.76 ms -1.4%
StringInternTableBenchmark.StringInternTable_Lookup(ItemCount: 100000) 3.17 ms 911.8 ns 3.17 ms -0.3%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 1000) 14.95 μs 60.2 ns 14.99 μs -0.3%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 1000) 28.19 μs 93.1 ns 28.18 μs +0.0%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 100000) 3.93 ms 50.42 μs 3.95 ms -0.7%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 100000) 5.98 ms 84.65 μs 5.96 ms +0.4%
BitSetBenchmark.BitArray_Or(ItemCount: 1024) 56.8 ns 1.5 ns 54.3 ns +4.6%
BitSetBenchmark.BitSet_Or(ItemCount: 1024) 1.25 μs 5.8 ns 1.25 μs +0.1%
BitSetBenchmark.BitArray_Or(ItemCount: 1000000) 44.42 μs 534.5 ns 44.45 μs -0.1%
BitSetBenchmark.BitSet_Or(ItemCount: 1000000) 4.48 ms 3.51 μs 4.47 ms +0.1%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1024) 1.24 μs 3.2 ns 1.25 μs -0.1%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1024) 7.0 ns 0.0 ns 7.0 ns +0.1%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1000000) 4.83 ms 2.61 μs 4.82 ms +0.0%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1000000) 4.94 μs 19.4 ns 4.94 μs +0.1%
LongSetBenchmark.HashSet_Remove(ItemCount: 1000) 74.41 μs 4.22 μs 77.90 μs -4.5%
LongSetBenchmark.LongSet_Remove(ItemCount: 1000) 87.00 μs 6.29 μs 87.41 μs -0.5%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 1000) 29.23 μs 5.42 μs 26.69 μs +9.5%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 1000) 119.44 μs 2.49 μs 114.94 μs +3.9%
LongSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.98 ms 18.48 μs 1.98 ms -0.1%
LongSetBenchmark.LongSet_Remove(ItemCount: 100000) 1.42 ms 68.80 μs 1.43 ms -1.1%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.72 ms 14.91 μs 1.73 ms -0.9%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 100000) 1.56 ms 22.71 μs 1.58 ms -1.2%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_SpanLookup(ItemCount: 1000) 30.68 μs 617.0 ns 30.99 μs -1.0%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_SpanLookup(ItemCount: 1000) 91.39 μs 196.0 ns 91.18 μs +0.2%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_SpanLookup(ItemCount: 100000) 5.84 ms 76.28 μs 6.05 ms -3.6%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_SpanLookup(ItemCount: 100000) 8.66 ms 63.03 μs 8.72 ms -0.7%
BitSetBenchmark.BitArray_Xor(ItemCount: 1024) 55.4 ns 1.1 ns 55.0 ns +0.8%
BitSetBenchmark.BitSet_Xor(ItemCount: 1024) 1.25 μs 4.0 ns 1.20 μs +3.7%
BitSetBenchmark.BitArray_Xor(ItemCount: 1000000) 44.43 μs 293.7 ns 44.71 μs -0.6%
BitSetBenchmark.BitSet_Xor(ItemCount: 1000000) 4.47 ms 3.05 μs 4.47 ms +0.0%
Hashers (111)
Benchmark This PR StdDev main Δ
StringHasherBenchmark.Bcl_GetHashCode(Shape: ShortAscii) 15.39 μs 17.2 ns 15.43 μs -0.3%
StringHasherBenchmark.EqualityComparer_Default(Shape: ShortAscii) 15.37 μs 17.3 ns 15.39 μs -0.1%
StringHasherBenchmark.Djb2(Shape: ShortAscii) 22.73 μs 45.1 ns 22.75 μs -0.1%
StringHasherBenchmark.Djb2A(Shape: ShortAscii) 22.73 μs 32.4 ns 22.72 μs +0.0%
StringHasherBenchmark.Sdbm(Shape: ShortAscii) 33.15 μs 46.9 ns 33.12 μs +0.1%
StringHasherBenchmark.Elf(Shape: ShortAscii) 44.72 μs 138.8 ns 44.92 μs -0.4%
StringHasherBenchmark.Crc32(Shape: ShortAscii) 50.55 μs 71.8 ns 50.54 μs +0.0%
StringHasherBenchmark.Adler32(Shape: ShortAscii) 96.50 μs 106.5 ns 96.48 μs +0.0%
StringHasherBenchmark.FnV1(Shape: ShortAscii) 27.16 μs 45.7 ns 27.14 μs +0.1%
StringHasherBenchmark.FnV1_64(Shape: ShortAscii) 25.81 μs 43.2 ns 25.82 μs -0.0%
StringHasherBenchmark.FnV1A(Shape: ShortAscii) 11.06 μs 36.7 ns 11.06 μs +0.0%
StringHasherBenchmark.FnV1A_Full(Shape: ShortAscii) 25.82 μs 13.3 ns 25.85 μs -0.1%
StringHasherBenchmark.FnV1A_64(Shape: ShortAscii) 27.88 μs 58.4 ns 27.89 μs -0.0%
StringHasherBenchmark.JenkinsOaat(Shape: ShortAscii) 39.49 μs 29.7 ns 39.51 μs -0.0%
StringHasherBenchmark.Murmur2(Shape: ShortAscii) 15.40 μs 43.9 ns 15.41 μs -0.1%
StringHasherBenchmark.Murmur3(Shape: ShortAscii) 17.34 μs 161.6 ns 17.13 μs +1.3%
StringHasherBenchmark.XxHash32(Shape: ShortAscii) 16.91 μs 41.9 ns 16.90 μs +0.1%
StringHasherBenchmark.XxHash64(Shape: ShortAscii) 18.39 μs 19.6 ns 18.37 μs +0.1%
StringHasherBenchmark.XxHash3(Shape: ShortAscii) 15.42 μs 20.7 ns 15.59 μs -1.1%
StringHasherBenchmark.CityHash64(Shape: ShortAscii) 15.56 μs 13.9 ns 15.57 μs -0.1%
StringHasherBenchmark.MetroHash64(Shape: ShortAscii) 15.43 μs 21.4 ns 15.44 μs -0.1%
StringHasherBenchmark.SipHash13(Shape: ShortAscii) 27.78 μs 232.4 ns 27.73 μs +0.2%
StringHasherBenchmark.SipHash24(Shape: ShortAscii) 37.93 μs 42.1 ns 37.91 μs +0.0%
StringHasherBenchmark.HalfSipHash24(Shape: ShortAscii) 49.78 μs 117.7 ns 49.73 μs +0.1%
StringHasherBenchmark.HighwayHash64(Shape: ShortAscii) 412.99 μs 1.20 μs 426.91 μs -3.3%
StringHasherBenchmark.XxHash64_Hash64(Shape: ShortAscii) 17.48 μs 121.9 ns 17.35 μs +0.8%
StringHasherBenchmark.SipHash24_Hash64(Shape: ShortAscii) 37.85 μs 22.9 ns 37.87 μs -0.0%
StringHasherBenchmark.Bcl_GetHashCode(Shape: LongAscii) 97.03 μs 113.6 ns 96.92 μs +0.1%
StringHasherBenchmark.EqualityComparer_Default(Shape: LongAscii) 96.63 μs 160.7 ns 96.52 μs +0.1%
StringHasherBenchmark.Djb2(Shape: LongAscii) 223.80 μs 81.8 ns 223.77 μs +0.0%
StringHasherBenchmark.Djb2A(Shape: LongAscii) 223.77 μs 88.1 ns 223.73 μs +0.0%
StringHasherBenchmark.Sdbm(Shape: LongAscii) 308.14 μs 192.4 ns 308.20 μs -0.0%
StringHasherBenchmark.Elf(Shape: LongAscii) 578.67 μs 147.2 ns 578.64 μs +0.0%
StringHasherBenchmark.Crc32(Shape: LongAscii) 591.05 μs 130.3 ns 590.99 μs +0.0%
StringHasherBenchmark.Adler32(Shape: LongAscii) 787.33 μs 686.5 ns 786.93 μs +0.1%
StringHasherBenchmark.FnV1(Shape: LongAscii) 289.15 μs 114.0 ns 289.02 μs +0.0%
StringHasherBenchmark.FnV1_64(Shape: LongAscii) 283.08 μs 360.9 ns 284.25 μs -0.4%
StringHasherBenchmark.FnV1A(Shape: LongAscii) 123.21 μs 302.5 ns 122.97 μs +0.2%
StringHasherBenchmark.FnV1A_Full(Shape: LongAscii) 283.01 μs 729.6 ns 282.35 μs +0.2%
StringHasherBenchmark.FnV1A_64(Shape: LongAscii) 286.82 μs 84.8 ns 286.91 μs -0.0%
StringHasherBenchmark.JenkinsOaat(Shape: LongAscii) 378.62 μs 276.4 ns 378.68 μs -0.0%
StringHasherBenchmark.Murmur2(Shape: LongAscii) 101.74 μs 78.4 ns 101.74 μs -0.0%
StringHasherBenchmark.Murmur3(Shape: LongAscii) 115.91 μs 218.1 ns 115.73 μs +0.2%
StringHasherBenchmark.XxHash32(Shape: LongAscii) 73.57 μs 126.6 ns 73.48 μs +0.1%
StringHasherBenchmark.XxHash64(Shape: LongAscii) 94.64 μs 864.3 ns 94.79 μs -0.2%
StringHasherBenchmark.XxHash3(Shape: LongAscii) 83.56 μs 1.77 μs 82.17 μs +1.7%
StringHasherBenchmark.CityHash64(Shape: LongAscii) 123.70 μs 1.32 μs 124.42 μs -0.6%
StringHasherBenchmark.MetroHash64(Shape: LongAscii) 74.76 μs 266.9 ns 74.71 μs +0.1%
StringHasherBenchmark.SipHash13(Shape: LongAscii) 117.18 μs 133.5 ns 117.03 μs +0.1%
StringHasherBenchmark.SipHash24(Shape: LongAscii) 161.73 μs 934.6 ns 161.84 μs -0.1%
StringHasherBenchmark.HalfSipHash24(Shape: LongAscii) 250.82 μs 221.4 ns 251.21 μs -0.2%
StringHasherBenchmark.HighwayHash64(Shape: LongAscii) 849.93 μs 7.13 μs 845.64 μs +0.5%
StringHasherBenchmark.XxHash64_Hash64(Shape: LongAscii) 87.61 μs 812.0 ns 87.25 μs +0.4%
StringHasherBenchmark.SipHash24_Hash64(Shape: LongAscii) 162.50 μs 225.5 ns 162.26 μs +0.1%
StringHasherBenchmark.Bcl_GetHashCode(Shape: NonAscii) 22.87 μs 6.1 ns 22.87 μs +0.0%
StringHasherBenchmark.EqualityComparer_Default(Shape: NonAscii) 22.83 μs 6.0 ns 22.84 μs -0.0%
StringHasherBenchmark.Djb2(Shape: NonAscii) 43.08 μs 46.1 ns 43.11 μs -0.1%
StringHasherBenchmark.Djb2A(Shape: NonAscii) 43.06 μs 37.3 ns 43.07 μs -0.0%
StringHasherBenchmark.Sdbm(Shape: NonAscii) 61.65 μs 54.6 ns 61.65 μs -0.0%
StringHasherBenchmark.Elf(Shape: NonAscii) 100.17 μs 188.9 ns 100.18 μs -0.0%
StringHasherBenchmark.Crc32(Shape: NonAscii) 103.57 μs 160.7 ns 103.53 μs +0.0%
StringHasherBenchmark.Adler32(Shape: NonAscii) 174.45 μs 83.1 ns 174.45 μs +0.0%
StringHasherBenchmark.FnV1(Shape: NonAscii) 48.42 μs 41.3 ns 48.40 μs +0.0%
StringHasherBenchmark.FnV1_64(Shape: NonAscii) 50.27 μs 181.3 ns 50.23 μs +0.1%
StringHasherBenchmark.FnV1A(Shape: NonAscii) 22.01 μs 37.2 ns 22.00 μs +0.0%
StringHasherBenchmark.FnV1A_Full(Shape: NonAscii) 46.09 μs 45.9 ns 46.09 μs +0.0%
StringHasherBenchmark.FnV1A_64(Shape: NonAscii) 50.07 μs 83.3 ns 50.04 μs +0.1%
StringHasherBenchmark.JenkinsOaat(Shape: NonAscii) 73.41 μs 227.2 ns 73.30 μs +0.1%
StringHasherBenchmark.Murmur2(Shape: NonAscii) 27.02 μs 126.1 ns 27.03 μs -0.0%
StringHasherBenchmark.Murmur3(Shape: NonAscii) 31.59 μs 51.5 ns 31.72 μs -0.4%
StringHasherBenchmark.XxHash32(Shape: NonAscii) 23.86 μs 18.2 ns 23.87 μs -0.0%
StringHasherBenchmark.XxHash64(Shape: NonAscii) 30.06 μs 27.2 ns 30.07 μs -0.0%
StringHasherBenchmark.XxHash3(Shape: NonAscii) 23.34 μs 56.0 ns 23.61 μs -1.2%
StringHasherBenchmark.CityHash64(Shape: NonAscii) 22.27 μs 44.5 ns 22.28 μs -0.0%
StringHasherBenchmark.MetroHash64(Shape: NonAscii) 25.91 μs 37.8 ns 25.88 μs +0.1%
StringHasherBenchmark.SipHash13(Shape: NonAscii) 37.87 μs 117.8 ns 37.86 μs +0.0%
StringHasherBenchmark.SipHash24(Shape: NonAscii) 50.09 μs 51.0 ns 50.10 μs -0.0%
StringHasherBenchmark.HalfSipHash24(Shape: NonAscii) 73.64 μs 1.54 μs 73.57 μs +0.1%
StringHasherBenchmark.HighwayHash64(Shape: NonAscii) 495.36 μs 3.47 μs 475.98 μs +4.1%
StringHasherBenchmark.XxHash64_Hash64(Shape: NonAscii) 28.99 μs 88.5 ns 28.99 μs +0.0%
StringHasherBenchmark.SipHash24_Hash64(Shape: NonAscii) 51.76 μs 746.9 ns 51.55 μs +0.4%
IntegerHasherBenchmark.Guid_Bcl 1.27 μs 3.5 ns 1.27 μs +0.3%
IntegerHasherBenchmark.Guid_EqualityComparer 3.47 μs 1.3 ns 3.49 μs -0.5%
IntegerHasherBenchmark.Guid_Celerity 8.50 μs 12.6 ns 8.50 μs +0.1%
IntegerHasherBenchmark.Guid_Celerity_Hash64 8.07 μs 24.5 ns 8.03 μs +0.5%
IntegerHasherBenchmark.Int32_Bcl 686.4 ns 1.3 ns 687.7 ns -0.2%
IntegerHasherBenchmark.Int32_EqualityComparer 702.1 ns 3.0 ns 700.7 ns +0.2%
IntegerHasherBenchmark.Int32_Identity 685.5 ns 1.9 ns 684.6 ns +0.1%
IntegerHasherBenchmark.Int32_WangNaive 1.25 μs 0.6 ns 1.25 μs -0.1%
IntegerHasherBenchmark.Int32_Wang 3.03 μs 2.8 ns 3.03 μs -0.0%
IntegerHasherBenchmark.Int32_Murmur3 2.65 μs 1.4 ns 2.65 μs +0.0%
IntegerHasherBenchmark.Int64_Bcl 1.27 μs 1.5 ns 1.27 μs +0.0%
IntegerHasherBenchmark.Int64_EqualityComparer 1.25 μs 1.0 ns 1.25 μs -0.0%
IntegerHasherBenchmark.Int64_Identity 687.3 ns 5.6 ns 676.0 ns +1.7%
IntegerHasherBenchmark.Int64_WangNaive 1.87 μs 3.1 ns 1.87 μs +0.0%
IntegerHasherBenchmark.Int64_Wang 4.16 μs 4.6 ns 4.16 μs +0.0%
IntegerHasherBenchmark.Int64_Murmur3 2.37 μs 3.5 ns 2.37 μs +0.0%
IntegerHasherBenchmark.Int64_Wang_Hash64 4.16 μs 2.6 ns 4.16 μs -0.0%
IntegerHasherBenchmark.Int64_Murmur3_Hash64 2.37 μs 3.2 ns 2.37 μs +0.1%
IntegerHasherBenchmark.UInt32_Bcl 685.4 ns 1.1 ns 685.9 ns -0.1%
IntegerHasherBenchmark.UInt32_EqualityComparer 699.4 ns 1.2 ns 699.0 ns +0.1%
IntegerHasherBenchmark.UInt32_Default 1.25 μs 0.5 ns 1.25 μs -0.0%
IntegerHasherBenchmark.UInt32_Wang 3.02 μs 1.8 ns 3.03 μs -0.1%
IntegerHasherBenchmark.UInt32_Murmur3 2.65 μs 1.5 ns 2.65 μs +0.1%
IntegerHasherBenchmark.UInt64_Bcl 1.27 μs 1.8 ns 1.27 μs +0.1%
IntegerHasherBenchmark.UInt64_EqualityComparer 1.25 μs 0.6 ns 1.25 μs +0.0%
IntegerHasherBenchmark.UInt64_Default 2.37 μs 2.0 ns 2.37 μs +0.0%
IntegerHasherBenchmark.UInt64_Wang 4.16 μs 2.6 ns 4.16 μs -0.0%
IntegerHasherBenchmark.UInt64_WangNaive 1.87 μs 1.3 ns 1.87 μs +0.0%
IntegerHasherBenchmark.UInt64_Default_Hash64 2.37 μs 1.4 ns 2.37 μs +0.0%
IntegerHasherBenchmark.UInt64_Wang_Hash64 4.16 μs 5.8 ns 4.16 μs +0.1%

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

Copy link
Copy Markdown
Owner Author

Note on the benchmark comment above: the 71 flagged regressions are runner noise, not this PR.

The tell is that a large share of them are the BCL baseline arms — types this PR does not touch and cannot affect:

  • CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) +27.7%
  • PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) +15.5%
  • DequeBenchmark.LinkedList_Queue(ItemCount: 1000) +31.0%

A Dictionary<int,int> insert and a LinkedList<int> enqueue cannot have regressed from adding a new class and two internal members on BitSet. The whole comparison shifted, in both directions (40 improvements alongside the 71 regressions).

This is the mechanism #300 describes: a PR that adds a benchmark class makes head and base pack into different shards, so the two sides of every A/B row are measured on differently-loaded runners. This PR adds RankSelectBitVectorBenchmark, so it is precisely the case that issue predicts — a useful confirming data point for it. Nothing here exceeded the 200% fail threshold and every shard is green.

The new rows themselves are worth reading, because they land the claim cleanly at 1M bits:

Query position ulong[] popcount loop RankSelectBitVector
Early (first 1%) 32.78 μs 1.88 μs 17×
Midpoint 2.49 ms 1.88 μs ~1,300×
Late (last 1%) 4.88 ms 1.92 μs ~2,500×

Rank is flat with position — 1.88 / 1.88 / 1.92 μs — which is the O(1) claim measured rather than asserted, while the baseline's O(index / 64) cost grows 150× across the same sweep.

Build at 1M bits is 85.55 μs against 67.48 μs to merely clone the words — the index costs about 1.27× a raw copy, materially cheaper than the local dry-run suggested. And the honest loss is visible too: at 1024 bits with early positions the naive loop wins (1.23 μs vs 1.88 μs), which is exactly why the sweep ships with three position arms instead of one.

…elect-bit-vector

Only CHANGELOG.md conflicted, and both sides were pure additions to
[Unreleased] > Added — this branch's three RankSelectBitVector entries and
main's six #311 span-lookup entries. Kept both.

Everything else auto-merged: the dashboard COLLECTIONS arrays, the benchmark
registry, the fuzz target list and the AOT smoke test each took one new entry
from either side. main's new scripts/check_dashboard_coverage.js confirms the
result — 131 cards across 41 collections, RankSelectBitVector's card included.
Copilot AI review requested due to automatic review settings July 29, 2026 06:38

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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@marius-bughiu
marius-bughiu merged commit 06dc36b into main Jul 29, 2026
16 of 17 checks passed
@marius-bughiu
marius-bughiu deleted the feat/issue-312-rank-select-bit-vector branch July 29, 2026 06:51
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.

Add RankSelectBitVector — O(1) Rank and O(log) Select over a dense bit vector

2 participants