Skip to content

fix(dashboard): render the EnumMap and EnumSet cards, and gate blank cards in CI - #327

Merged
marius-bughiu merged 3 commits into
mainfrom
fix/issue-301-dashboard-unparameterized
Jul 29, 2026
Merged

fix(dashboard): render the EnumMap and EnumSet cards, and gate blank cards in CI#327
marius-bughiu merged 3 commits into
mainfrom
fix/issue-301-dashboard-unparameterized

Conversation

@marius-bughiu

Copy link
Copy Markdown
Owner

Fixes the two benchmark dashboard cards that have rendered empty since they shipped, and turns that class of silent failure into a red CI check.

The bug

The dashboard parses BenchmarkDotNet result names with a regex that hard-required an (ItemCount: N) suffix:

var m = name.match(/^(\w+)Benchmark\.(\w+?)_(\w+)\(ItemCount:\s*(\d+)\)$/);
if (!m) return null;   // data point silently dropped

EnumMapBenchmark and EnumSetBenchmark deliberately declare no [Params] — their workload is the bounded enum universe, and a synthetic item-count sweep would chart a dimension that does not exist. So BenchmarkDotNet emits EnumMapBenchmark.EnumMap_Lookup with no suffix, parseName returned null, and the measurements were published to gh-pages correctly and then discarded at render time.

The fix

The parameter group is now optional in both web/dev/bench/index.html and web/dev/bench/detail.html. An unparameterized class parses with itemCount === NO_SWEEP and charts as a single bucket that can never collide with a real item count:

  • the grid card omits the @ N items detail line;
  • the detail page drops its item-count toggle and reads no item-count sweep, and the grid links to it without an n query param;
  • unparameterized benchmarks are excluded from the headline speedup stats rather than bucketed at ItemCount: 0 and compared against the 100k sweep.

The suffix is still matched strictly as ItemCount. A [Params] property named anything else is rejected rather than charted under an "items" label it does not mean — the guard below is what surfaces it.

The guard

The audit in #301 said EnumMap / EnumSet were the only two offenders. They were the only two current ones: the published history shows DisjointSetBenchmark emitting (ElementCount: …) for five runs, so that card was blank then too, and nothing anywhere went red. scripts/check_dashboard_coverage.js closes that.

It lifts the COLLECTIONS tables and both name parsers out of the dashboard HTML and evaluates them, rather than reimplementing the regexes — so it validates the parser that actually ships and cannot drift from it. Extraction failing is itself a hard error with a pointer to the script.

Check Needs measurements? Runs in
index.html and detail.html agree on collection keys and their items no ci.yml, every PR
every charted collection has a {Key}Benchmark in Program.cs's CoreBenchmarks no ci.yml, every PR
every published result name is understood by one of the dashboard parsers yes benchmarks.yml aggregate
every (collection, op) card resolves to both a BCL and a Celerity measurement yes benchmarks.yml aggregate

Two placements because benchmarks.yml only fires on src/** — a dashboard-only change (like this PR) would never reach the report-backed run. The full check is deliberately the last step of the aggregate job, after the PR comment and the gh-pages publish, so a wiring mistake reddens the job without costing us the measurement; it is skipped unless every shard reported, since a partial merge is legitimately missing whole classes.

Parity

  • web/dev/bench/index.html — optional ItemCount group, idxKey helper, NO_SWEEP marker on EnumMap / EnumSet, headline exclusion, card detail line and click-through query string.
  • web/dev/bench/detail.html — same parser change, NO_SWEEP entries, no toggle for a single bucket (.toggle:empty hidden), null-safe labels and notice.
  • web/index.html — no change needed; both types already have ship cards.
  • scripts/check_dashboard_coverage.js — new.
  • .github/workflows/ci.yml / benchmarks.yml — wiring, plus a head_shards output on the merge step.
  • CONTRIBUTING.md — new The dashboard subsection documenting the naming contract, the three lists a new collection must be added to, and how to run the script. Also corrects the neighbouring CI paragraph, which still described the pre-sharding single-job setup (wrong workflow file, wrong duration, a 200% fail-the-job threshold that no longer exists).
  • CHANGELOG.md — two ### Fixed entries under [Unreleased] (the render fix, the guard).
  • ROADMAP.md — recorded under Build- and release-pipeline integrity on milestone 2.4.0, status done.
  • No C# source, no public API, and no collection behaviour changed — so there are no dedicated tests, shared cross-collection test rows, or new benchmark class to add. The .cs files this PR touches: none.

Test plan

  • dotnet build clean (0 errors; pre-existing analyzer warnings only). No C# changed, so the xUnit suite is untouched — CI runs it across the ubuntu/windows/macos × net8.0/net9.0/net10.0 matrix regardless.
  • Served the patched dashboard locally against the real gh-pages data.js (583 benchmarks, latest run): EnumMap charts Add 5.71× / Lookup 1.92× / Remove 2.39× / Enumerate 1.13×, EnumSet charts Add 4.71× / Contains 3.11× / Remove 1.18× / Union 15.23×. Zero .chart-cell.no-data on the whole page, no console errors.
  • No regression on the 37 parameterized collections — spot-checked IntDictionary (100k), SmallSet (8/64), BitSet (1024/1M), DisjointSet; headline stats still resolve at 100k items (SparseSet · Contains, HyperLogLog · Add, SwissSet · Remove), i.e. the 15.23× EnumSet figure correctly did not leak into them.
  • Detail pages: ?c=EnumSet&op=Union renders headline + chart + 10 measurement rows with no toggle; ?c=SmallSet&op=Contains&n=8 unchanged with both toggle buttons; ?c=EnumSet&op=Union&n=100000 still errors with Unknown item count; click-through from an EnumSet grid card lands on detail.html?c=EnumSet&op=Add and renders.
  • Guard verified both ways: passes on the current dashboard + latest published run; fails on the historic ElementCount run with "12 benchmark name(s) match no dashboard parser … The usual cause is a [Params] property not named ItemCount"; and mutation-tested — dropping typeof(EnumSetBenchmark) from CoreBenchmarks and deleting SparseSet from detail.html both produce named failures.
  • gh-pages dashboard refresh on the next main push confirms the cards render live.

Closes #301

🤖 Generated with Claude Code

…cards in CI

The dashboard required an `(ItemCount: N)` suffix on every BenchmarkDotNet result
name. `EnumMapBenchmark` and `EnumSetBenchmark` deliberately declare no `[Params]`
sweep — their workload is the bounded enum universe — so their measurements were
published to gh-pages and then dropped by `parseName`, and both cards had rendered
empty since they shipped.

The `ItemCount` group is now optional in both `index.html` and `detail.html`. An
unparameterized class parses with `itemCount === NO_SWEEP` and charts as a single
bucket: the grid card omits the "@ N items" detail, the detail page drops its
item-count toggle, and such benchmarks are excluded from the headline speedup
stats rather than bucketed at zero items. The suffix is still matched strictly as
`ItemCount`, so a params property named anything else is rejected rather than
charted under an "items" label it does not mean.

That failure mode was silent, and it had bitten twice: `DisjointSet` also blanked
for five runs when its params property was briefly named `ElementCount`. So
`scripts/check_dashboard_coverage.js` now fails CI on it. It lifts the
`COLLECTIONS` tables and both name parsers straight out of the dashboard HTML
rather than reimplementing them, so it validates the parser that actually ships.
Structural checks (the two `COLLECTIONS` arrays agree; every charted collection
has a `{Key}Benchmark` in `CoreBenchmarks`) run on every PR in `ci.yml`, since
`benchmarks.yml` only fires on `src/**` and would never see a dashboard-only
change. The full check runs against the merged report in the aggregate job, last,
so a wiring mistake reddens the job without costing us the measurement.

Closes #301

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

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 the benchmark dashboard’s collection-name parser so unparameterized benchmarks (notably EnumMap/EnumSet) render correctly, and adds CI guards to prevent future “blank card” regressions by validating the dashboard wiring and report coverage.

Changes:

  • Make the (ItemCount: N) suffix optional in both dashboard pages and treat missing sweeps as a dedicated “NO_SWEEP” bucket.
  • Add scripts/check_dashboard_coverage.js and wire it into CI (ci.yml) and the benchmark aggregate workflow (benchmarks.yml).
  • Document the dashboard naming contract and guard script usage; record the work in roadmap/changelog.

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
web/dev/bench/index.html Makes ItemCount optional, introduces NO_SWEEP, and adjusts indexing/headline logic to support unparameterized benchmarks.
web/dev/bench/detail.html Mirrors parser change, removes item-count toggle UI for single-bucket benchmarks, and makes labels/notice text null-safe.
scripts/check_dashboard_coverage.js New dashboard coverage guard script (structural + report-backed checks) extracted from the shipped dashboard logic.
.github/workflows/ci.yml Adds a fast structural dashboard-wiring check on every PR.
.github/workflows/benchmarks.yml Adds a final, report-backed dashboard coverage check gated on complete shard reporting.
CONTRIBUTING.md Documents dashboard naming rules and how/when to run the guard script; updates CI description.
CHANGELOG.md Adds [Unreleased] fixed entries for the dashboard render bug and the new CI guard.
ROADMAP.md Marks the dashboard guard work as done under pipeline integrity.

Comment thread CHANGELOG.md Outdated
Comment thread scripts/check_dashboard_coverage.js
The report-backed check accepted a BCL+Celerity pair at any of a collection's
item counts, but a grid card's chart is always `seriesFor(..., primaryN)` — the
ratio text falls back to the smaller count, the sparkline does not. So a
collection with data only at 1k rendered "awaiting data" while the guard passed.
Check the primary count alone, which is what decides the card.

Also condense the two new CHANGELOG entries to the documented "a few sentences"
budget, since release.yml lifts the whole section into the GitHub Release body.

Both raised in review on #327.

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

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 1 comment.

Comment thread web/dev/bench/detail.html Outdated
detail.html built its "no measurements recorded" notice by concatenating
`params.op` — read straight from the query string — into innerHTML, so
`?op=<img src=x onerror=...>` executed on the published site. The file already
carries an escapeHtml helper for commit messages; route `op` through it too.

`params.n` needs no change: it is parseInt'd on the way in, so it is a number or
NaN by the time it is interpolated.

Raised in review on #327.

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.

@github-actions

Copy link
Copy Markdown

Benchmarks

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

Highlights

Benchmark This PR StdDev main Δ
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 1000) 11.15 μs 131.8 ns 12.98 μs -14.1% ✅
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 1000) 39.06 μs 2.32 μs 35.31 μs +10.6% ⚠️
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 2.23 ms 220.63 μs 3.00 ms -25.5% ✅
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 100000) 7.99 ms 933.45 μs 6.60 ms +21.0% ⚠️
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 100000) 6.91 ms 61.81 μs 1.50 ms +362.0% ⚠️
EnumSetBenchmark.HashSet_Union 366.3 ns 2.7 ns 322.5 ns +13.6% ⚠️
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 1000) 111.79 μs 3.67 μs 125.30 μs -10.8% ✅
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 100000) 1.68 ms 52.03 μs 7.46 ms -77.5% ✅
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.27 ms 165.08 μs 2.05 ms +10.5% ⚠️
Collections (472)
Benchmark This PR StdDev main Δ
TrieBenchmark.Dictionary_Add(ItemCount: 1000) 44.46 μs 3.65 μs 38.25 μs +16.2%
TrieBenchmark.Trie_Add(ItemCount: 1000) 550.63 μs 16.84 μs 466.46 μs +18.0%
LongSetBenchmark.HashSet_Add(ItemCount: 1000) 12.88 μs 204.4 ns 12.97 μs -0.7%
LongSetBenchmark.LongSet_Add(ItemCount: 1000) 8.97 μs 236.3 ns 9.12 μs -1.6%
TrieBenchmark.Dictionary_Add(ItemCount: 100000) 4.84 ms 1.72 ms 5.19 ms -6.6%
TrieBenchmark.Trie_Add(ItemCount: 100000) 24.96 ms 341.24 μs 24.74 ms +0.9%
LongSetBenchmark.HashSet_Add(ItemCount: 100000) 4.53 ms 247.75 μs 4.45 ms +1.8%
LongSetBenchmark.LongSet_Add(ItemCount: 100000) 6.09 ms 39.84 μs 6.06 ms +0.5%
LongSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.80 μs 47.4 ns 4.79 μs +0.0%
LongSetBenchmark.LongSet_Contains(ItemCount: 1000) 2.01 μs 16.8 ns 2.01 μs +0.3%
LongSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.63 ms 17.83 μs 1.64 ms -0.4%
LongSetBenchmark.LongSet_Contains(ItemCount: 100000) 641.40 μs 1.78 μs 639.24 μs +0.3%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.68 μs 208.5 ns 14.48 μs +1.4%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 1000) 11.15 μs 131.8 ns 12.98 μs -14.1% ✅
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.97 ms 54.57 μs 4.94 ms +0.6%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 100000) 6.69 ms 62.57 μs 6.70 ms -0.1%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.91 μs 36.7 ns 4.89 μs +0.4%
TrieBenchmark.Dictionary_Lookup(ItemCount: 1000) 13.37 μs 560.5 ns 13.49 μs -0.9%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 1000) 2.27 μs 7.7 ns 2.27 μs +0.0%
TrieBenchmark.Trie_Lookup(ItemCount: 1000) 40.31 μs 346.6 ns 39.95 μs +0.9%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.58 ms 5.04 μs 1.58 ms +0.1%
TrieBenchmark.Dictionary_Lookup(ItemCount: 100000) 2.68 ms 7.16 μs 2.68 ms +0.0%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 100000) 699.20 μs 2.72 μs 704.11 μs -0.7%
TrieBenchmark.Trie_Lookup(ItemCount: 100000) 8.50 ms 57.27 μs 8.47 ms +0.4%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 1000) 182.03 μs 353.1 ns 182.40 μs -0.2%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 1000) 11.03 μs 35.0 ns 11.03 μs +0.0%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 100000) 167.23 ms 641.13 μs 166.54 ms +0.4%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 100000) 627.26 μs 12.27 μs 620.67 μs +1.1%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 1000) 74.06 μs 446.5 ns 73.54 μs +0.7%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 1000) 53.45 μs 704.1 ns 52.83 μs +1.2%
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 100000) 7.37 ms 3.45 μs 7.38 ms -0.1%
TrieBenchmark.Trie_PrefixMatch(ItemCount: 100000) 6.89 ms 155.63 μs 6.95 ms -0.9%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 1000) 220.77 μs 88.2 ns 220.97 μs -0.1%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 1000) 7.46 μs 8.0 ns 7.45 μs +0.1%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 100000) 209.03 ms 11.81 ms 208.32 ms +0.3%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 100000) 324.23 μs 1.16 μs 324.86 μs -0.2%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 84.29 μs 8.26 μs 87.86 μs -4.1%
LongSetBenchmark.HashSet_Remove(ItemCount: 1000) 77.17 μs 6.96 μs 76.63 μs +0.7%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 1000) 91.35 μs 8.85 μs 96.08 μs -4.9%
LongSetBenchmark.LongSet_Remove(ItemCount: 1000) 83.18 μs 7.38 μs 81.27 μs +2.3%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.01 ms 19.55 μs 2.01 ms +0.3%
LongSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.98 ms 20.51 μs 1.96 ms +0.7%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 100000) 2.77 ms 2.22 ms 2.76 ms +0.4%
LongSetBenchmark.LongSet_Remove(ItemCount: 100000) 1.43 ms 13.19 μs 1.43 ms -0.2%
SmallSetBenchmark.HashSet_Add(ItemCount: 8) 167.8 ns 4.4 ns 181.2 ns -7.4%
SmallSetBenchmark.SmallSet_Add(ItemCount: 8) 46.5 ns 0.7 ns 47.7 ns -2.5%
SmallSetBenchmark.HashSet_Add(ItemCount: 64) 796.6 ns 21.1 ns 771.1 ns +3.3%
SmallSetBenchmark.SmallSet_Add(ItemCount: 64) 1.67 μs 9.3 ns 1.94 μs -14.2%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 1000) 68.04 μs 638.5 ns 65.53 μs +3.8%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 1000) 53.88 μs 152.0 ns 54.28 μs -0.7%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 100000) 23.72 ms 132.42 μs 24.27 ms -2.3%
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 100000) 15.93 ms 44.10 μs 16.06 ms -0.8%
SmallSetBenchmark.HashSet_Contains(ItemCount: 8) 37.2 ns 0.0 ns 37.1 ns +0.2%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 8) 19.2 ns 0.2 ns 19.3 ns -0.4%
SmallSetBenchmark.HashSet_Contains(ItemCount: 64) 300.2 ns 0.8 ns 299.5 ns +0.2%
SmallSetBenchmark.SmallSet_Contains(ItemCount: 64) 1.12 μs 17.9 ns 1.09 μs +3.0%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 1000) 18.09 μs 120.1 ns 17.75 μs +1.9%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 1000) 24.40 μs 133.4 ns 24.14 μs +1.1%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 100000) 3.60 ms 40.08 μs 3.53 ms +2.0%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 100000) 5.22 ms 363.21 μs 5.27 ms -0.9%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 1000) 30.57 μs 959.3 ns 30.59 μs -0.1%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.58 μs 177.0 ns 14.86 μs -8.6%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 1000) 39.83 μs 867.4 ns 39.42 μs +1.1%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 1000) 30.02 μs 458.1 ns 30.66 μs -2.1%
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 100000) 12.79 ms 609.20 μs 12.50 ms +2.3%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.57 ms 186.75 μs 4.63 ms -1.4%
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 100000) 17.41 ms 151.51 μs 17.38 ms +0.2%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 100000) 3.97 ms 36.99 μs 3.98 ms -0.2%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 1000) 18.58 μs 273.5 ns 18.62 μs -0.2%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 26.69 μs 125.1 ns 27.28 μs -2.2%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 1000) 39.06 μs 2.32 μs 35.31 μs +10.6% ⚠️
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.03 μs 52.6 ns 5.08 μs -0.9%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.71 μs 13.7 ns 4.70 μs +0.2%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 1000) 25.44 μs 249.6 ns 25.47 μs -0.1%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 1000) 2.35 μs 2.1 ns 2.36 μs -0.4%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 1000) 3.00 μs 18.8 ns 2.99 μs +0.1%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 100000) 3.66 ms 45.90 μs 3.83 ms -4.4%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 6.10 ms 628.58 μs 6.09 ms +0.1%
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 100000) 18.57 ms 351.20 μs 19.09 ms -2.7%
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.77 ms 9.50 μs 1.78 ms -0.5%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.55 ms 50.22 μs 1.61 ms -3.5%
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 100000) 13.07 ms 259.79 μs 13.24 ms -1.3%
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 100000) 741.01 μs 10.29 μs 741.61 μs -0.1%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 100000) 818.56 μs 2.90 μs 821.37 μs -0.3%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 1000) 14.96 μs 72.7 ns 14.96 μs -0.0%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 1000) 28.73 μs 91.5 ns 28.64 μs +0.3%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 100000) 4.35 ms 163.87 μs 4.06 ms +7.1%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 100000) 6.76 ms 1.12 ms 6.20 ms +9.0%
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 1000) 188.97 μs 1.33 μs 185.51 μs +1.9%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 1000) 87.26 μs 923.4 ns 86.28 μs +1.1%
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 100000) 47.37 ms 646.98 μs 50.50 ms -6.2%
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 100000) 26.34 ms 196.24 μs 26.63 ms -1.1%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 1000) 4.52 μs 28.9 ns 4.50 μs +0.5%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 1000) 77.8 ns 0.2 ns 78.8 ns -1.3%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 100000) 1.26 ms 3.24 μs 1.28 ms -0.9%
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 100000) 5.77 μs 9.5 ns 5.81 μs -0.6%
SmallSetBenchmark.HashSet_Remove(ItemCount: 8) 596.2 ns 192.0 ns 470.1 ns +26.8%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 8) 1.44 μs 225.2 ns 1.44 μs -0.4%
SmallSetBenchmark.HashSet_Remove(ItemCount: 64) 1.84 μs 194.2 ns 1.76 μs +4.7%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 64) 23.35 μs 4.21 μs 24.69 μs -5.4%
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 1000) 810.59 μs 42.08 μs 780.92 μs +3.8%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 1000) 34.18 μs 4.34 μs 28.93 μs +18.2%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 82.76 μs 9.16 μs 83.72 μs -1.1%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 1000) 309.81 μs 12.03 μs 308.36 μs +0.5%
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 1000) 135.33 μs 14.46 μs 134.62 μs +0.5%
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 1000) 82.45 μs 4.78 μs 82.40 μs +0.1%
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 100000) 26.53 ms 662.76 μs 26.88 ms -1.3%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 2.23 ms 220.63 μs 3.00 ms -25.5% ✅
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.06 ms 15.97 μs 2.09 ms -1.0%
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 100000) 18.49 ms 70.27 μs 18.12 ms +2.0%
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 100000) 2.19 ms 211.63 μs 2.43 ms -9.7%
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 100000) 1.74 ms 85.36 μs 1.68 ms +3.8%
EnumSetBenchmark.HashSet_Add 475.6 ns 4.6 ns 450.3 ns +5.6%
EnumSetBenchmark.EnumSet_Add 68.4 ns 3.5 ns 64.9 ns +5.5%
BTreeSetBenchmark.SortedSet_Add(ItemCount: 1000) 34.48 μs 548.8 ns 33.63 μs +2.5%
BloomFilterBenchmark.HashSet_Add(ItemCount: 1000) 9.87 μs 130.4 ns 10.09 μs -2.2%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 1000) 31.54 μs 164.6 ns 32.54 μs -3.1%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 1000) 12.71 μs 9.3 ns 12.73 μs -0.1%
BTreeSetBenchmark.SortedSet_Add(ItemCount: 100000) 17.80 ms 144.78 μs 17.70 ms +0.6%
BloomFilterBenchmark.HashSet_Add(ItemCount: 100000) 3.84 ms 87.38 μs 3.85 ms -0.2%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 100000) 12.09 ms 41.17 μs 12.28 ms -1.6%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 100000) 979.34 μs 1.27 μs 982.66 μs -0.3%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 1000) 131.16 μs 575.7 ns 128.85 μs +1.8%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 1000) 2.85 ms 45.90 μs 2.65 ms +7.4%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 100000) 23.31 ms 329.58 μs 23.34 ms -0.1%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 100000) 1.54 s 200.94 ms 1.64 s -6.1%
EnumSetBenchmark.HashSet_Contains 140.8 ns 8.3 ns 142.8 ns -1.4%
EnumSetBenchmark.EnumSet_Contains 39.7 ns 0.0 ns 39.9 ns -0.4%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 1000) 12.59 μs 27.3 ns 12.58 μs +0.1%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 1000) 3.67 μs 4.9 ns 3.70 μs -0.9%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 1000) 14.18 μs 75.2 ns 14.16 μs +0.1%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 1000) 11.00 μs 3.5 ns 11.00 μs +0.0%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 100000) 13.62 ms 37.96 μs 13.59 ms +0.2%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.19 ms 13.48 μs 1.18 ms +0.9%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 100000) 10.88 ms 17.04 μs 10.93 ms -0.4%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 100000) 762.11 μs 1.14 μs 762.23 μs -0.0%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 3.54 μs 2.7 ns 3.61 μs -2.0%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 1000) 3.08 μs 1.8 ns 3.08 μs -0.0%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.53 ms 3.15 μs 1.54 ms -0.7%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 100000) 1.30 ms 1.20 μs 1.30 ms +0.0%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 1000) 7.62 μs 34.6 ns 7.62 μs -0.0%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 1000) 4.17 μs 21.6 ns 4.18 μs -0.3%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 100000) 1.05 ms 10.17 μs 1.05 ms -0.3%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 100000) 546.97 μs 11.94 μs 547.12 μs -0.0%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 11.27 μs 121.0 ns 11.71 μs -3.7%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 1000) 8.65 μs 117.4 ns 8.76 μs -1.3%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 3.94 ms 49.75 μs 4.13 ms -4.5%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 100000) 5.42 ms 215.08 μs 5.83 ms -7.0%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.62 μs 17.5 ns 3.60 μs +0.5%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 1000) 5.92 μs 17.4 ns 5.92 μs -0.1%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.83 μs 179.6 ns 3.90 μs -2.0%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 1000) 1.52 μs 3.7 ns 1.53 μs -0.5%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 1000) 65.50 μs 38.0 ns 66.20 μs -1.1%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 1000) 2.24 μs 24.9 ns 2.44 μs -8.2%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 100000) 434.01 μs 863.7 ns 431.89 μs +0.5%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 100000) 1.52 ms 19.97 μs 1.44 ms +5.6%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.30 ms 57.93 μs 1.24 ms +4.7%
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 100000) 167.52 μs 294.7 ns 167.33 μs +0.1%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 100000) 7.99 ms 933.45 μs 6.60 ms +21.0% ⚠️
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 100000) 644.63 μs 2.60 μs 668.22 μs -3.5%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 1000) 47.56 μs 896.3 ns 47.00 μs +1.2%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 1000) 43.73 μs 1.83 μs 43.79 μs -0.1%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 100000) 26.70 ms 100.24 μs 26.93 ms -0.8%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 100000) 20.24 ms 137.07 μs 20.33 ms -0.5%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 1000) 131.2 ns 1.0 ns 126.7 ns +3.5%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 1000) 62.4 ns 1.1 ns 62.0 ns +0.7%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 100000) 7.59 μs 300.8 ns 8.05 μs -5.7%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 100000) 3.82 μs 3.6 ns 3.83 μs -0.2%
EnumSetBenchmark.HashSet_Remove 1.94 μs 275.9 ns 2.10 μs -8.0%
EnumSetBenchmark.EnumSet_Remove 781.9 ns 59.1 ns 833.5 ns -6.2%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 1000) 468.90 μs 10.82 μs 460.73 μs +1.8%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 1000) 39.64 μs 2.89 μs 41.20 μs -3.8%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 58.28 μs 3.67 μs 60.05 μs -2.9%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 1000) 202.39 μs 6.92 μs 196.66 μs +2.9%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 1000) 66.95 μs 2.68 μs 73.11 μs -8.4%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 1000) 85.49 μs 5.47 μs 85.79 μs -0.3%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 100000) 20.78 ms 130.53 μs 21.28 ms -2.4%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 100000) 441.16 μs 14.23 μs 448.86 μs -1.7%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.56 ms 17.35 μs 1.56 ms -0.3%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 100000) 12.76 ms 55.53 μs 12.81 ms -0.4%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 100000) 1.11 ms 11.72 μs 1.11 ms -0.3%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 100000) 6.91 ms 61.81 μs 1.50 ms +362.0% ⚠️
EnumSetBenchmark.HashSet_Union 366.3 ns 2.7 ns 322.5 ns +13.6% ⚠️
EnumSetBenchmark.EnumSet_Union 18.9 ns 0.4 ns 18.3 ns +3.1%
EnumMapBenchmark.Dictionary_Add 658.3 ns 37.3 ns 610.5 ns +7.8%
EnumMapBenchmark.EnumMap_Add 160.6 ns 3.4 ns 149.6 ns +7.4%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 1000) 13.81 μs 321.4 ns 12.60 μs +9.6%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 1000) 13.46 μs 556.7 ns 12.83 μs +5.0%
SwissSetBenchmark.HashSet_Add(ItemCount: 1000) 12.86 μs 185.0 ns 14.09 μs -8.7%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 1000) 7.25 μs 21.8 ns 7.23 μs +0.4%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 1000) 27.58 μs 122.4 ns 27.62 μs -0.1%
SwissSetBenchmark.SwissSet_Add(ItemCount: 1000) 27.04 μs 127.2 ns 27.31 μs -1.0%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 100000) 4.81 ms 93.76 μs 4.67 ms +2.9%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 100000) 4.92 ms 82.88 μs 4.97 ms -1.1%
SwissSetBenchmark.HashSet_Add(ItemCount: 100000) 4.84 ms 72.90 μs 4.96 ms -2.5%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 100000) 2.08 ms 12.47 μs 2.09 ms -0.1%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 100000) 573.47 μs 5.95 μs 580.89 μs -1.3%
SwissSetBenchmark.SwissSet_Add(ItemCount: 100000) 4.66 ms 65.24 μs 4.66 ms -0.1%
XorFilterBenchmark.HashSet_Build(ItemCount: 1000) 8.43 μs 179.0 ns 8.50 μs -0.8%
XorFilterBenchmark.XorFilter_Build(ItemCount: 1000) 43.00 μs 1.04 μs 40.89 μs +5.2%
XorFilterBenchmark.HashSet_Build(ItemCount: 100000) 2.17 ms 75.44 μs 2.09 ms +3.6%
XorFilterBenchmark.XorFilter_Build(ItemCount: 100000) 12.91 ms 231.46 μs 12.81 ms +0.8%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.89 μs 38.7 ns 4.93 μs -0.7%
SwissSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.89 μs 50.3 ns 5.20 μs -6.0%
XorFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.81 μs 50.3 ns 4.94 μs -2.6%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 1000) 4.92 μs 5.4 ns 4.92 μs -0.1%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 1000) 2.87 μs 11.7 ns 2.87 μs -0.2%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 1000) 6.77 μs 12.7 ns 6.84 μs -1.0%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.60 ms 5.88 μs 1.60 ms -0.5%
SwissSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.57 ms 8.61 μs 1.57 ms -0.1%
XorFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.60 ms 5.59 μs 1.62 ms -0.9%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 100000) 1.75 ms 3.91 μs 1.75 ms +0.5%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 100000) 639.18 μs 2.38 μs 638.56 μs +0.1%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 100000) 704.95 μs 1.05 μs 704.12 μs +0.1%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.66 μs 34.3 ns 4.74 μs -1.7%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.71 μs 60.5 ns 4.78 μs -1.3%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.67 μs 21.1 ns 4.78 μs -2.3%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 1000) 8.43 μs 5.8 ns 8.43 μs -0.0%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 1000) 2.37 μs 5.6 ns 2.37 μs +0.1%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 1000) 6.78 μs 6.6 ns 6.77 μs +0.1%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.94 ms 4.92 μs 1.92 ms +1.1%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.96 ms 9.48 μs 1.93 ms +1.6%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.95 ms 6.08 μs 1.95 ms +0.1%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 100000) 885.15 μs 8.73 μs 889.45 μs -0.5%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 100000) 348.15 μs 574.1 ns 339.65 μs +2.5%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 100000) 705.61 μs 545.3 ns 705.17 μs +0.1%
EnumMapBenchmark.Dictionary_Enumerate 50.8 ns 0.1 ns 51.2 ns -0.6%
EnumMapBenchmark.EnumMap_Enumerate 40.8 ns 0.3 ns 41.4 ns -1.5%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 1000) 0.0 ns 0.0 ns 0.0 ns -77.1%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 1000) 23.46 μs 19.3 ns 23.56 μs -0.4%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 100000) 0.0 ns 0.0 ns 0.0 ns -61.8%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 100000) 22.98 μs 21.0 ns 23.00 μs -0.0%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 8) 178.2 ns 5.1 ns 168.4 ns +5.8%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 8) 91.0 ns 1.7 ns 89.4 ns +1.8%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 64) 841.3 ns 34.0 ns 827.3 ns +1.7%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 64) 1.13 μs 8.5 ns 1.11 μs +1.2%
EnumMapBenchmark.Dictionary_Lookup 118.0 ns 0.3 ns 118.5 ns -0.4%
EnumMapBenchmark.EnumMap_Lookup 64.7 ns 0.4 ns 65.4 ns -1.1%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 8) 37.6 ns 0.4 ns 37.6 ns +0.2%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 8) 23.1 ns 0.9 ns 26.2 ns -11.6%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 64) 300.4 ns 2.2 ns 301.1 ns -0.2%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 64) 1.15 μs 10.3 ns 1.14 μs +0.5%
EnumMapBenchmark.Dictionary_Remove 3.76 μs 560.0 ns 3.33 μs +12.9%
EnumMapBenchmark.EnumMap_Remove 1.73 μs 410.9 ns 1.51 μs +14.5%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 8) 1.43 μs 253.5 ns 1.35 μs +5.8%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 8) 1.34 μs 327.1 ns 1.59 μs -15.8%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 64) 5.77 μs 774.2 ns 5.62 μs +2.5%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 64) 25.84 μs 4.76 μs 22.15 μs +16.7%
SwissSetBenchmark.HashSet_Remove(ItemCount: 1000) 32.02 μs 4.06 μs 30.41 μs +5.3%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 1000) 76.59 μs 12.01 μs 75.27 μs +1.8%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 1000) 13.68 μs 143.6 ns 13.35 μs +2.4%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 1000) 13.03 μs 147.6 ns 13.04 μs -0.0%
SwissSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.73 ms 34.70 μs 1.73 ms +0.0%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 100000) 1.09 ms 18.54 μs 1.07 ms +1.9%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 100000) 3.98 ms 114.54 μs 3.94 ms +1.1%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 100000) 4.01 ms 16.63 μs 4.00 ms +0.2%
CeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 11.97 μs 208.1 ns 11.93 μs +0.3%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 1000) 10.30 μs 22.7 ns 10.29 μs +0.1%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 1000) 12.98 μs 840.3 ns 11.83 μs +9.8%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 1000) 8.80 μs 22.0 ns 8.83 μs -0.3%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 1000) 10.48 μs 258.3 ns 10.29 μs +1.8%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 1000) 18.67 μs 120.4 ns 17.17 μs +8.8%
CeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 4.96 ms 105.77 μs 4.90 ms +1.1%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 100000) 1.42 ms 8.88 μs 1.45 ms -1.8%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 100000) 4.51 ms 435.00 μs 4.55 ms -1.0%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 100000) 3.16 ms 20.44 μs 3.18 ms -0.7%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 100000) 963.78 μs 2.13 μs 964.57 μs -0.1%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 100000) 6.30 ms 98.40 μs 6.20 ms +1.6%
BitSetBenchmark.BitArray_And(ItemCount: 1024) 61.2 ns 2.3 ns 58.9 ns +3.9%
BitSetBenchmark.BitSet_And(ItemCount: 1024) 1.25 μs 2.4 ns 1.25 μs +0.0%
BitSetBenchmark.BitArray_And(ItemCount: 1000000) 44.91 μs 618.8 ns 43.97 μs +2.1%
BitSetBenchmark.BitSet_And(ItemCount: 1000000) 4.49 ms 4.38 μs 4.47 ms +0.4%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 1000) 163.57 μs 406.0 ns 164.04 μs -0.3%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 1000) 2.48 ms 94.43 μs 2.67 ms -7.2%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 100000) 28.86 ms 242.56 μs 29.23 ms -1.2%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 100000) 1.35 s 45.06 ms 1.37 s -1.5%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 4.75 μs 27.2 ns 4.74 μs +0.3%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 1000) 6.84 μs 13.9 ns 6.83 μs +0.2%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.73 μs 13.8 ns 4.73 μs +0.1%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 1000) 1.96 μs 116.5 ns 1.84 μs +6.0%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 1000) 95.97 μs 1.60 μs 94.54 μs +1.5%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 1000) 2.50 μs 7.7 ns 2.53 μs -1.0%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.56 ms 5.41 μs 1.61 ms -2.9%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 100000) 1.95 ms 9.44 μs 2.00 ms -2.5%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.58 ms 21.13 μs 1.58 ms +0.3%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 100000) 590.87 μs 2.27 μs 591.39 μs -0.1%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 100000) 7.29 ms 46.23 μs 7.13 ms +2.2%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 100000) 749.76 μs 2.63 μs 740.43 μs +1.3%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.45 μs 103.1 ns 4.54 μs -1.9%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 1000) 2.74 μs 6.0 ns 2.74 μs +0.0%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.95 ms 7.51 μs 1.93 ms +1.0%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 100000) 1.19 ms 5.37 μs 1.17 ms +1.4%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 1000) 4.38 μs 5.9 ns 4.57 μs -4.2%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 1000) 10.06 μs 15.2 ns 10.05 μs +0.1%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 100000) 512.21 μs 16.60 μs 512.92 μs -0.1%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 100000) 2.04 ms 6.12 μs 2.00 ms +2.0%
LruCacheBenchmark.Dictionary_Get(ItemCount: 1000) 25.20 μs 446.8 ns 26.87 μs -6.2%
LruCacheBenchmark.LruCache_Get(ItemCount: 1000) 6.76 μs 53.7 ns 6.81 μs -0.7%
LruCacheBenchmark.Dictionary_Get(ItemCount: 100000) 27.40 μs 1.41 μs 27.74 μs -1.2%
LruCacheBenchmark.LruCache_Get(ItemCount: 100000) 7.09 μs 83.2 ns 6.97 μs +1.6%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 1000) 4.81 μs 89.3 ns 4.80 μs +0.1%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 1000) 3.59 μs 7.7 ns 3.59 μs -0.0%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 100000) 521.87 μs 1.84 μs 519.47 μs +0.5%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 100000) 1.34 ms 718.6 ns 1.34 ms +0.0%
BitSetBenchmark.BitArray_Or(ItemCount: 1024) 60.6 ns 1.2 ns 59.5 ns +1.8%
BitSetBenchmark.BitSet_Or(ItemCount: 1024) 1.25 μs 3.0 ns 1.17 μs +6.9%
BitSetBenchmark.BitArray_Or(ItemCount: 1000000) 44.07 μs 617.2 ns 44.15 μs -0.2%
BitSetBenchmark.BitSet_Or(ItemCount: 1000000) 4.48 ms 11.87 μs 4.46 ms +0.3%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1024) 1.24 μs 4.2 ns 1.24 μs -0.2%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1024) 7.0 ns 0.0 ns 7.1 ns -0.8%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1000000) 4.83 ms 4.77 μs 4.82 ms +0.1%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1000000) 4.94 μs 5.8 ns 4.94 μs +0.0%
LruCacheBenchmark.Dictionary_Put(ItemCount: 1000) 105.26 μs 10.68 μs 108.69 μs -3.2%
LruCacheBenchmark.LruCache_Put(ItemCount: 1000) 476.55 μs 22.22 μs 478.24 μs -0.4%
LruCacheBenchmark.Dictionary_Put(ItemCount: 100000) 8.23 ms 91.12 μs 8.52 ms -3.4%
LruCacheBenchmark.LruCache_Put(ItemCount: 100000) 5.82 ms 19.20 μs 5.84 ms -0.4%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 26.19 μs 1.42 μs 26.69 μs -1.8%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 1000) 116.55 μs 9.51 μs 122.56 μs -4.9%
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 1000) 27.48 μs 3.71 μs 28.25 μs -2.7%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 1000) 111.79 μs 3.67 μs 125.30 μs -10.8% ✅
CeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.70 ms 13.59 μs 1.71 ms -0.6%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 100000) 1.37 ms 12.13 μs 1.39 ms -1.0%
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.74 ms 33.08 μs 1.71 ms +2.1%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 100000) 1.40 ms 41.39 μs 1.35 ms +3.8%
BitSetBenchmark.BitArray_Xor(ItemCount: 1024) 54.5 ns 0.9 ns 52.3 ns +4.3%
BitSetBenchmark.BitSet_Xor(ItemCount: 1024) 1.17 μs 31.0 ns 1.18 μs -0.3%
BitSetBenchmark.BitArray_Xor(ItemCount: 1000000) 43.95 μs 447.3 ns 43.79 μs +0.3%
BitSetBenchmark.BitSet_Xor(ItemCount: 1000000) 4.47 ms 3.43 μs 4.47 ms -0.0%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 1000) 11.59 μs 172.9 ns 11.84 μs -2.1%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 11.85 μs 168.8 ns 12.96 μs -8.6%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 1000) 11.90 μs 181.2 ns 12.14 μs -2.0%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 1000) 10.10 μs 163.8 ns 10.61 μs -4.8%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 1000) 7.62 μs 118.9 ns 6.95 μs +9.6%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 1000) 80.74 μs 8.01 μs 70.13 μs +15.1%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 100000) 4.07 ms 311.85 μs 4.00 ms +1.6%
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 4.53 ms 287.58 μs 4.53 ms -0.0%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 100000) 2.89 ms 51.89 μs 2.93 ms -1.3%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 100000) 5.37 ms 144.28 μs 5.39 ms -0.4%
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 100000) 3.17 ms 4.28 μs 3.14 ms +1.0%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 100000) 14.34 ms 36.65 μs 14.34 ms +0.0%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 1000) 3.43 μs 12.3 ns 3.41 μs +0.4%
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 3.41 μs 9.1 ns 3.40 μs +0.5%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 1000) 2.10 μs 7.9 ns 2.09 μs +0.6%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 1000) 1.92 μs 7.2 ns 1.91 μs +0.3%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.37 ms 2.07 μs 1.39 ms -0.9%
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.32 ms 54.59 μs 1.40 ms -5.5%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 100000) 752.28 μs 2.28 μs 762.20 μs -1.3%
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 100000) 576.24 μs 3.64 μs 565.25 μs +1.9%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 3.46 μs 7.2 ns 3.56 μs -2.8%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 1000) 2.54 μs 9.2 ns 2.54 μs +0.0%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.84 ms 9.65 μs 1.82 ms +1.0%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 100000) 1.21 ms 8.59 μs 1.21 ms +0.4%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 1000) 1.66 μs 6.2 ns 1.65 μs +0.3%
DequeBenchmark.Deque_Enumerate(ItemCount: 1000) 775.4 ns 2.5 ns 773.3 ns +0.3%
DequeBenchmark.LinkedList_Enumerate(ItemCount: 100000) 225.33 μs 518.2 ns 216.50 μs +4.1%
DequeBenchmark.Deque_Enumerate(ItemCount: 100000) 76.32 μs 70.7 ns 76.36 μs -0.1%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.40 μs 360.1 ns 13.61 μs -1.5%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 12.58 μs 161.0 ns 13.55 μs -7.1%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 1000) 9.18 μs 214.2 ns 9.32 μs -1.5%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 1000) 7.41 μs 61.4 ns 7.43 μs -0.2%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.01 ms 115.66 μs 3.99 ms +0.5%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.56 ms 83.07 μs 4.62 ms -1.2%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 100000) 5.13 ms 137.77 μs 5.09 ms +0.8%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 100000) 3.24 ms 13.89 μs 3.22 ms +0.5%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.44 μs 69.0 ns 3.39 μs +1.6%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.46 μs 86.1 ns 3.38 μs +2.3%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 2.11 μs 5.4 ns 2.11 μs +0.2%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 1000) 2.18 μs 5.3 ns 2.18 μs -0.0%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.44 ms 2.24 μs 1.43 ms +0.6%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.44 ms 5.18 μs 1.43 ms +0.3%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 711.08 μs 16.40 μs 727.10 μs -2.2%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 100000) 714.99 μs 20.95 μs 714.74 μs +0.0%
DequeBenchmark.LinkedList_PushFront(ItemCount: 1000) 43.15 μs 6.04 μs 41.55 μs +3.9%
DequeBenchmark.Deque_PushFront(ItemCount: 1000) 16.09 μs 1.25 μs 20.49 μs -21.5%
DequeBenchmark.LinkedList_PushFront(ItemCount: 100000) 2.00 ms 30.73 μs 2.14 ms -6.7%
DequeBenchmark.Deque_PushFront(ItemCount: 100000) 557.35 μs 69.17 μs 532.34 μs +4.7%
DequeBenchmark.LinkedList_Queue(ItemCount: 1000) 52.95 μs 4.39 μs 50.94 μs +3.9%
DequeBenchmark.Deque_Queue(ItemCount: 1000) 25.67 μs 7.98 μs 20.57 μs +24.8%
DequeBenchmark.LinkedList_Queue(ItemCount: 100000) 4.34 ms 185.78 μs 4.32 ms +0.5%
DequeBenchmark.Deque_Queue(ItemCount: 100000) 356.78 μs 16.52 μs 354.15 μs +0.7%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 75.05 μs 10.41 μs 69.73 μs +7.6%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 67.68 μs 8.71 μs 71.53 μs -5.4%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 30.71 μs 7.16 μs 28.25 μs +8.7%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 1000) 104.57 μs 8.25 μs 108.29 μs -3.4%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 1000) 116.00 μs 13.59 μs 103.65 μs +11.9%
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 1000) 102.17 μs 9.48 μs 102.19 μs -0.0%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 1000) 36.27 μs 8.08 μs 27.64 μs +31.2%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 1000) 96.89 μs 12.67 μs 105.81 μs -8.4%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.83 ms 36.52 μs 1.82 ms +0.6%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.81 ms 26.00 μs 1.80 ms +1.0%
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.63 ms 13.80 μs 1.63 ms -0.1%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 100000) 1.68 ms 52.03 μs 7.46 ms -77.5% ✅
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 100000) 3.11 ms 2.56 ms 1.61 ms +93.1%
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 100000) 1.40 ms 15.81 μs 1.41 ms -0.5%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.60 ms 17.41 μs 1.61 ms -0.9%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 100000) 1.62 ms 20.28 μs 1.64 ms -1.0%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 1000) 38.5 ns 0.3 ns 37.1 ns +3.7%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 1000) 1.22 μs 5.5 ns 1.19 μs +2.4%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 100000) 37.5 ns 0.5 ns 36.2 ns +3.6%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 100000) 1.10 μs 15.7 ns 1.09 μs +0.9%
IntSetBenchmark.HashSet_Add(ItemCount: 1000) 13.29 μs 278.6 ns 12.93 μs +2.8%
SparseSetBenchmark.HashSet_Add(ItemCount: 1000) 7.33 μs 150.7 ns 7.15 μs +2.6%
IntSetBenchmark.IntSet_Add(ItemCount: 1000) 8.81 μs 103.0 ns 8.90 μs -1.1%
SparseSetBenchmark.SparseSet_Add(ItemCount: 1000) 6.33 μs 42.7 ns 6.28 μs +0.9%
IntSetBenchmark.HashSet_Add(ItemCount: 100000) 5.12 ms 117.06 μs 5.08 ms +0.8%
SparseSetBenchmark.HashSet_Add(ItemCount: 100000) 1.75 ms 52.62 μs 1.74 ms +0.9%
IntSetBenchmark.IntSet_Add(ItemCount: 100000) 3.19 ms 22.79 μs 3.20 ms -0.6%
SparseSetBenchmark.SparseSet_Add(ItemCount: 100000) 1.50 ms 81.41 μs 1.47 ms +2.1%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 1000) 5.98 μs 76.3 ns 6.02 μs -0.6%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 1000) 4.72 μs 113.8 ns 4.72 μs -0.1%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 100000) 1.32 ms 47.01 μs 1.36 ms -3.4%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 100000) 642.79 μs 2.19 μs 645.56 μs -0.4%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 1000) 19.09 μs 193.1 ns 18.96 μs +0.7%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 1000) 16.75 μs 84.0 ns 16.83 μs -0.5%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 100000) 4.32 ms 86.59 μs 4.32 ms +0.0%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 100000) 3.14 ms 31.70 μs 3.16 ms -0.6%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 1000) 9.16 μs 15.1 ns 9.41 μs -2.6%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 1000) 12.49 μs 215.4 ns 12.20 μs +2.4%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 100000) 255.74 μs 502.5 ns 255.95 μs -0.1%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 100000) 339.43 μs 3.06 μs 322.60 μs +5.2%
IntSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.75 μs 12.0 ns 4.76 μs -0.1%
SparseSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.66 μs 23.5 ns 4.65 μs +0.1%
IntSetBenchmark.IntSet_Contains(ItemCount: 1000) 1.81 μs 6.6 ns 1.80 μs +0.5%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 1000) 1.29 μs 1.1 ns 1.28 μs +0.1%
IntSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.55 ms 1.70 μs 1.55 ms -0.1%
SparseSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.36 ms 1.70 μs 1.35 ms +0.7%
IntSetBenchmark.IntSet_Contains(ItemCount: 100000) 572.61 μs 538.3 ns 575.40 μs -0.5%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 100000) 256.06 μs 938.1 ns 256.52 μs -0.2%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 1000) 145.70 μs 862.1 ns 146.38 μs -0.5%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 1000) 262.57 μs 1.59 μs 262.41 μs +0.1%
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 100000) 32.73 ms 342.89 μs 32.91 ms -0.5%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 100000) 56.73 ms 449.43 μs 57.42 ms -1.2%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 1000) 4.89 μs 95.2 ns 4.88 μs +0.0%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 1000) 30.13 μs 124.5 ns 30.11 μs +0.1%
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 100000) 1.09 ms 16.99 μs 1.07 ms +1.6%
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 100000) 6.53 ms 200.38 μs 6.37 ms +2.5%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 15.13 μs 764.4 ns 16.34 μs -7.4%
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.27 μs 412.3 ns 14.10 μs +1.2%
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 1000) 11.34 μs 375.4 ns 11.50 μs -1.4%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 1000) 18.43 μs 267.6 ns 18.36 μs +0.4%
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.14 ms 47.70 μs 4.18 ms -0.8%
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.73 ms 66.88 μs 4.75 ms -0.4%
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 100000) 4.95 ms 91.28 μs 4.97 ms -0.4%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 100000) 8.15 ms 530.55 μs 8.18 ms -0.4%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.73 μs 26.0 ns 4.73 μs +0.1%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.73 μs 25.0 ns 4.76 μs -0.6%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 1000) 2.14 μs 3.2 ns 2.14 μs +0.0%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 1000) 2.88 μs 13.3 ns 2.83 μs +1.8%
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.60 ms 2.54 μs 1.60 ms +0.5%
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.60 ms 1.76 μs 1.65 ms -3.0%
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 100000) 680.14 μs 4.57 μs 683.80 μs -0.5%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 100000) 855.02 μs 4.07 μs 857.68 μs -0.3%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 82.59 μs 7.67 μs 84.34 μs -2.1%
IntSetBenchmark.HashSet_Remove(ItemCount: 1000) 30.44 μs 4.74 μs 29.15 μs +4.4%
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 85.92 μs 10.78 μs 84.40 μs +1.8%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 1000) 92.50 μs 9.45 μs 92.27 μs +0.3%
IntSetBenchmark.IntSet_Remove(ItemCount: 1000) 81.80 μs 5.14 μs 84.11 μs -2.7%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 1000) 112.60 μs 9.29 μs 120.75 μs -6.7%
SparseSetBenchmark.HashSet_Remove(ItemCount: 1000) 26.12 μs 2.63 μs 28.67 μs -8.9%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 1000) 27.12 μs 3.83 μs 27.18 μs -0.2%
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.27 ms 165.08 μs 2.05 ms +10.5% ⚠️
IntSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.71 ms 20.03 μs 1.71 ms -0.1%
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.05 ms 21.09 μs 2.07 ms -1.0%
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 100000) 6.69 ms 77.80 μs 6.69 ms -0.0%
IntSetBenchmark.IntSet_Remove(ItemCount: 100000) 1.32 ms 50.44 μs 1.35 ms -2.2%
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 100000) 1.87 ms 187.45 μs 2.03 ms -8.0%
SparseSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.48 ms 17.50 μs 1.49 ms -0.4%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 100000) 786.78 μs 11.29 μs 785.51 μs +0.2%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 1000) 99.16 μs 847.9 ns 100.36 μs -1.2%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 1000) 27.26 μs 176.6 ns 27.35 μs -0.3%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 100000) 46.13 ms 1.11 ms 45.88 ms +0.5%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 100000) 8.18 ms 124.76 μs 8.27 ms -1.2%
Hashers (111)
Benchmark This PR StdDev main Δ
StringHasherBenchmark.Bcl_GetHashCode(Shape: ShortAscii) 14.21 μs 84.6 ns 14.12 μs +0.7%
StringHasherBenchmark.EqualityComparer_Default(Shape: ShortAscii) 14.28 μs 84.2 ns 14.17 μs +0.8%
StringHasherBenchmark.Djb2(Shape: ShortAscii) 21.46 μs 267.2 ns 21.41 μs +0.2%
StringHasherBenchmark.Djb2A(Shape: ShortAscii) 21.55 μs 186.2 ns 21.55 μs -0.0%
StringHasherBenchmark.Sdbm(Shape: ShortAscii) 29.84 μs 198.7 ns 29.58 μs +0.9%
StringHasherBenchmark.Elf(Shape: ShortAscii) 62.12 μs 245.4 ns 61.05 μs +1.7%
StringHasherBenchmark.Crc32(Shape: ShortAscii) 44.87 μs 222.2 ns 44.92 μs -0.1%
StringHasherBenchmark.Adler32(Shape: ShortAscii) 82.18 μs 801.1 ns 81.58 μs +0.7%
StringHasherBenchmark.FnV1(Shape: ShortAscii) 19.86 μs 116.3 ns 19.33 μs +2.7%
StringHasherBenchmark.FnV1_64(Shape: ShortAscii) 25.85 μs 188.0 ns 25.25 μs +2.4%
StringHasherBenchmark.FnV1A(Shape: ShortAscii) 12.25 μs 127.7 ns 12.21 μs +0.4%
StringHasherBenchmark.FnV1A_Full(Shape: ShortAscii) 19.83 μs 278.1 ns 19.80 μs +0.2%
StringHasherBenchmark.FnV1A_64(Shape: ShortAscii) 21.55 μs 299.3 ns 21.61 μs -0.3%
StringHasherBenchmark.JenkinsOaat(Shape: ShortAscii) 34.40 μs 260.5 ns 34.35 μs +0.1%
StringHasherBenchmark.Murmur2(Shape: ShortAscii) 12.56 μs 114.6 ns 12.54 μs +0.2%
StringHasherBenchmark.Murmur3(Shape: ShortAscii) 15.85 μs 102.4 ns 15.59 μs +1.7%
StringHasherBenchmark.XxHash32(Shape: ShortAscii) 14.53 μs 137.7 ns 14.25 μs +1.9%
StringHasherBenchmark.XxHash64(Shape: ShortAscii) 16.11 μs 141.7 ns 16.07 μs +0.2%
StringHasherBenchmark.XxHash3(Shape: ShortAscii) 17.11 μs 336.9 ns 17.17 μs -0.4%
StringHasherBenchmark.CityHash64(Shape: ShortAscii) 13.04 μs 87.3 ns 12.97 μs +0.6%
StringHasherBenchmark.MetroHash64(Shape: ShortAscii) 13.80 μs 86.2 ns 13.98 μs -1.3%
StringHasherBenchmark.SipHash13(Shape: ShortAscii) 24.89 μs 154.3 ns 25.43 μs -2.1%
StringHasherBenchmark.SipHash24(Shape: ShortAscii) 36.17 μs 269.8 ns 37.07 μs -2.4%
StringHasherBenchmark.HalfSipHash24(Shape: ShortAscii) 51.55 μs 423.4 ns 51.27 μs +0.5%
StringHasherBenchmark.HighwayHash64(Shape: ShortAscii) 279.38 μs 3.63 μs 278.91 μs +0.2%
StringHasherBenchmark.XxHash64_Hash64(Shape: ShortAscii) 15.92 μs 141.9 ns 15.74 μs +1.1%
StringHasherBenchmark.SipHash24_Hash64(Shape: ShortAscii) 36.43 μs 305.7 ns 36.54 μs -0.3%
StringHasherBenchmark.Bcl_GetHashCode(Shape: LongAscii) 102.65 μs 857.4 ns 104.22 μs -1.5%
StringHasherBenchmark.EqualityComparer_Default(Shape: LongAscii) 102.25 μs 735.2 ns 103.86 μs -1.5%
StringHasherBenchmark.Djb2(Shape: LongAscii) 223.43 μs 1.86 μs 223.75 μs -0.1%
StringHasherBenchmark.Djb2A(Shape: LongAscii) 223.60 μs 1.83 μs 223.34 μs +0.1%
StringHasherBenchmark.Sdbm(Shape: LongAscii) 323.70 μs 2.27 μs 322.25 μs +0.5%
StringHasherBenchmark.Elf(Shape: LongAscii) 628.13 μs 5.96 μs 631.40 μs -0.5%
StringHasherBenchmark.Crc32(Shape: LongAscii) 599.36 μs 2.97 μs 595.83 μs +0.6%
StringHasherBenchmark.Adler32(Shape: LongAscii) 805.06 μs 6.41 μs 798.78 μs +0.8%
StringHasherBenchmark.FnV1(Shape: LongAscii) 241.33 μs 1.74 μs 237.41 μs +1.7%
StringHasherBenchmark.FnV1_64(Shape: LongAscii) 262.06 μs 2.62 μs 262.16 μs -0.0%
StringHasherBenchmark.FnV1A(Shape: LongAscii) 110.92 μs 847.9 ns 110.73 μs +0.2%
StringHasherBenchmark.FnV1A_Full(Shape: LongAscii) 240.59 μs 2.28 μs 240.52 μs +0.0%
StringHasherBenchmark.FnV1A_64(Shape: LongAscii) 267.78 μs 2.37 μs 263.07 μs +1.8%
StringHasherBenchmark.JenkinsOaat(Shape: LongAscii) 389.17 μs 2.37 μs 387.91 μs +0.3%
StringHasherBenchmark.Murmur2(Shape: LongAscii) 99.31 μs 668.5 ns 98.14 μs +1.2%
StringHasherBenchmark.Murmur3(Shape: LongAscii) 118.17 μs 799.6 ns 117.88 μs +0.2%
StringHasherBenchmark.XxHash32(Shape: LongAscii) 75.61 μs 1.87 μs 76.92 μs -1.7%
StringHasherBenchmark.XxHash64(Shape: LongAscii) 77.28 μs 572.1 ns 77.47 μs -0.2%
StringHasherBenchmark.XxHash3(Shape: LongAscii) 64.89 μs 536.5 ns 64.35 μs +0.8%
StringHasherBenchmark.CityHash64(Shape: LongAscii) 109.38 μs 684.4 ns 106.15 μs +3.0%
StringHasherBenchmark.MetroHash64(Shape: LongAscii) 73.27 μs 770.6 ns 70.52 μs +3.9%
StringHasherBenchmark.SipHash13(Shape: LongAscii) 99.94 μs 506.8 ns 96.69 μs +3.4%
StringHasherBenchmark.SipHash24(Shape: LongAscii) 149.40 μs 912.5 ns 146.35 μs +2.1%
StringHasherBenchmark.HalfSipHash24(Shape: LongAscii) 263.14 μs 2.23 μs 256.70 μs +2.5%
StringHasherBenchmark.HighwayHash64(Shape: LongAscii) 445.60 μs 3.40 μs 440.67 μs +1.1%
StringHasherBenchmark.XxHash64_Hash64(Shape: LongAscii) 75.97 μs 570.4 ns 75.19 μs +1.0%
StringHasherBenchmark.SipHash24_Hash64(Shape: LongAscii) 149.22 μs 594.9 ns 149.14 μs +0.1%
StringHasherBenchmark.Bcl_GetHashCode(Shape: NonAscii) 22.03 μs 111.7 ns 21.97 μs +0.3%
StringHasherBenchmark.EqualityComparer_Default(Shape: NonAscii) 22.00 μs 86.2 ns 21.89 μs +0.5%
StringHasherBenchmark.Djb2(Shape: NonAscii) 42.70 μs 306.5 ns 42.34 μs +0.8%
StringHasherBenchmark.Djb2A(Shape: NonAscii) 42.59 μs 268.1 ns 42.37 μs +0.5%
StringHasherBenchmark.Sdbm(Shape: NonAscii) 59.43 μs 440.7 ns 59.16 μs +0.4%
StringHasherBenchmark.Elf(Shape: NonAscii) 109.89 μs 896.7 ns 110.48 μs -0.5%
StringHasherBenchmark.Crc32(Shape: NonAscii) 90.92 μs 681.6 ns 91.61 μs -0.8%
StringHasherBenchmark.Adler32(Shape: NonAscii) 164.84 μs 1.04 μs 165.83 μs -0.6%
StringHasherBenchmark.FnV1(Shape: NonAscii) 40.25 μs 474.2 ns 41.26 μs -2.4%
StringHasherBenchmark.FnV1_64(Shape: NonAscii) 45.78 μs 472.3 ns 46.70 μs -2.0%
StringHasherBenchmark.FnV1A(Shape: NonAscii) 28.11 μs 316.8 ns 28.67 μs -1.9%
StringHasherBenchmark.FnV1A_Full(Shape: NonAscii) 41.01 μs 389.3 ns 40.72 μs +0.7%
StringHasherBenchmark.FnV1A_64(Shape: NonAscii) 43.44 μs 345.2 ns 43.21 μs +0.5%
StringHasherBenchmark.JenkinsOaat(Shape: NonAscii) 67.96 μs 555.1 ns 67.73 μs +0.3%
StringHasherBenchmark.Murmur2(Shape: NonAscii) 28.50 μs 626.5 ns 28.49 μs +0.0%
StringHasherBenchmark.Murmur3(Shape: NonAscii) 33.40 μs 242.0 ns 32.69 μs +2.2%
StringHasherBenchmark.XxHash32(Shape: NonAscii) 21.14 μs 218.0 ns 20.63 μs +2.4%
StringHasherBenchmark.XxHash64(Shape: NonAscii) 26.66 μs 373.0 ns 26.33 μs +1.3%
StringHasherBenchmark.XxHash3(Shape: NonAscii) 19.99 μs 171.5 ns 20.07 μs -0.4%
StringHasherBenchmark.CityHash64(Shape: NonAscii) 20.39 μs 179.7 ns 20.54 μs -0.7%
StringHasherBenchmark.MetroHash64(Shape: NonAscii) 23.65 μs 180.1 ns 23.67 μs -0.1%
StringHasherBenchmark.SipHash13(Shape: NonAscii) 32.11 μs 254.6 ns 31.59 μs +1.7%
StringHasherBenchmark.SipHash24(Shape: NonAscii) 48.60 μs 567.8 ns 47.60 μs +2.1%
StringHasherBenchmark.HalfSipHash24(Shape: NonAscii) 73.78 μs 1.05 μs 72.83 μs +1.3%
StringHasherBenchmark.HighwayHash64(Shape: NonAscii) 288.99 μs 2.97 μs 293.08 μs -1.4%
StringHasherBenchmark.XxHash64_Hash64(Shape: NonAscii) 25.89 μs 209.4 ns 26.05 μs -0.6%
StringHasherBenchmark.SipHash24_Hash64(Shape: NonAscii) 48.47 μs 357.2 ns 48.14 μs +0.7%
IntegerHasherBenchmark.Guid_Bcl 1.27 μs 3.0 ns 1.27 μs -0.3%
IntegerHasherBenchmark.Guid_EqualityComparer 3.50 μs 2.4 ns 3.49 μs +0.4%
IntegerHasherBenchmark.Guid_Celerity 8.51 μs 20.4 ns 8.48 μs +0.4%
IntegerHasherBenchmark.Guid_Celerity_Hash64 8.03 μs 7.9 ns 8.03 μs +0.0%
IntegerHasherBenchmark.Int32_Bcl 685.8 ns 1.0 ns 686.0 ns -0.0%
IntegerHasherBenchmark.Int32_EqualityComparer 698.8 ns 0.7 ns 699.1 ns -0.0%
IntegerHasherBenchmark.Int32_Identity 683.8 ns 0.8 ns 683.8 ns +0.0%
IntegerHasherBenchmark.Int32_WangNaive 1.25 μs 0.4 ns 1.25 μs -0.1%
IntegerHasherBenchmark.Int32_Wang 3.03 μs 3.5 ns 3.02 μs +0.0%
IntegerHasherBenchmark.Int32_Murmur3 2.65 μs 1.1 ns 2.65 μs -0.0%
IntegerHasherBenchmark.Int64_Bcl 1.27 μs 1.2 ns 1.27 μs +0.1%
IntegerHasherBenchmark.Int64_EqualityComparer 1.25 μs 0.5 ns 1.25 μs +0.0%
IntegerHasherBenchmark.Int64_Identity 683.1 ns 1.4 ns 684.1 ns -0.1%
IntegerHasherBenchmark.Int64_WangNaive 1.87 μs 0.8 ns 1.87 μs -0.1%
IntegerHasherBenchmark.Int64_Wang 4.16 μs 2.3 ns 4.16 μs -0.1%
IntegerHasherBenchmark.Int64_Murmur3 2.37 μs 1.2 ns 2.37 μs -0.1%
IntegerHasherBenchmark.Int64_Wang_Hash64 4.16 μs 4.1 ns 4.16 μs +0.0%
IntegerHasherBenchmark.Int64_Murmur3_Hash64 2.37 μs 1.6 ns 2.37 μs -0.0%
IntegerHasherBenchmark.UInt32_Bcl 685.0 ns 0.6 ns 685.6 ns -0.1%
IntegerHasherBenchmark.UInt32_EqualityComparer 697.6 ns 1.2 ns 698.3 ns -0.1%
IntegerHasherBenchmark.UInt32_Default 1.25 μs 1.2 ns 1.25 μs +0.1%
IntegerHasherBenchmark.UInt32_Wang 3.02 μs 1.6 ns 3.03 μs -0.1%
IntegerHasherBenchmark.UInt32_Murmur3 2.65 μs 0.9 ns 2.65 μs -0.0%
IntegerHasherBenchmark.UInt64_Bcl 1.27 μs 1.0 ns 1.27 μs +0.0%
IntegerHasherBenchmark.UInt64_EqualityComparer 1.25 μs 0.3 ns 1.25 μs -0.1%
IntegerHasherBenchmark.UInt64_Default 2.37 μs 1.0 ns 2.37 μs -0.1%
IntegerHasherBenchmark.UInt64_Wang 4.16 μs 3.0 ns 4.16 μs +0.0%
IntegerHasherBenchmark.UInt64_WangNaive 1.87 μs 1.2 ns 1.87 μs +0.0%
IntegerHasherBenchmark.UInt64_Default_Hash64 2.37 μs 2.1 ns 2.37 μs +0.0%
IntegerHasherBenchmark.UInt64_Wang_Hash64 4.16 μs 4.3 ns 4.18 μs -0.4%

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

@marius-bughiu
marius-bughiu merged commit 7068546 into main Jul 29, 2026
17 checks passed
@marius-bughiu
marius-bughiu deleted the fix/issue-301-dashboard-unparameterized branch July 29, 2026 06:27
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.

fix(dashboard): EnumMap and EnumSet charts render empty — parser requires an (ItemCount: N) suffix

2 participants