Skip to content

fix(release): gate breaking API changes and bad release notes before the NuGet push - #326

Merged
marius-bughiu merged 6 commits into
mainfrom
fix/issue-315-release-gates
Jul 29, 2026
Merged

fix(release): gate breaking API changes and bad release notes before the NuGet push#326
marius-bughiu merged 6 commits into
mainfrom
fix/issue-315-release-gates

Conversation

@marius-bughiu

@marius-bughiu marius-bughiu commented Jul 27, 2026

Copy link
Copy Markdown
Owner

Closes #315.

Two guards this repo needed were on the wrong side of the irreversible dotnet nuget push. Both are now in front of it.

(a) Package validation — the binary-compatibility gate

ApiCompat / PackageValidation / public-API-baseline tooling did not exist anywhere in the repo. Six packages published on a tag, in a project that already needed a hand-written TypeForwarders.cs to survive one assembly split — so deleting a public member, narrowing a parameter type, or dropping a forwarder produced a green CI run and a silently breaking package, with no test that could catch it because it is not a behavioural failure.

EnablePackageValidation + a pinned baseline now downloads each package's published predecessor at pack time and fails the build on any break, across every TFM.

Why the enablement lives in a new src/Directory.Build.targets and not in Directory.Build.props: props is imported before the project body, so at that point IsPackable is unset on every project. Enabling validation there puts a baseline PackageDownload on the test / benchmark / fuzz / AOT-smoke projects too, which have no PackageId to resolve it against, and restore dies with error : Invalid framework identifier ''. Directory.Build.targets is imported after the project body, where each dev project's IsPackable=false is already visible. The baseline version stays in props as a single property to bump.

Two escape hatches, both deliberate rather than silent:

  • Intentional breakdotnet pack -p:ApiCompatGenerateSuppressionFile=true writes a CompatibilitySuppressions.xml next to the .csproj; commit it with a comment per entry so the break is reviewed in the PR.
  • A package's first release — no published predecessor exists and asking for one fails restore, so the package sets <CelerityNoPublishedBaseline>true</CelerityNoPublishedBaseline> for one release, then drops it. This is what Celerity.Sorting (New package: Celerity.Sorting — RadixSort, CountingSort, PartialSort over primitive keys #309) will need.

(b) The release-notes check ran after the packages were live

release.yml's job graph was builddeploygithub-release, with the CHANGELOG extraction and its only check ([ ! -s release-notes.md ]) inside github-release. An over-long body therefore failed after all six packages were already on NuGet.org, leaving a half-shipped release recoverable only by hand from the nuget artifact.

This is not hypothetical: ## [1.5.0] measures 183,991 bytes against GitHub's ~125k release-body cap.

The extraction moves into build (before the build even starts — fail fast), gains a body-size assertion, and is uploaded as a release-notes artifact that github-release downloads instead of re-extracting, so the published body is exactly the one that passed the gate. github-release keeps needs: [ deploy ]. Both new steps are guarded by startsWith(github.ref, 'refs/tags/v'), matching github-release, so a workflow_dispatch run from a branch is unaffected.

Dry-run evidence

A deliberate breaking change fails packAbuseTracker.EstimateDistinctKeys temporarily made internal, then reverted:

EXIT_DELIBERATE_BREAK=1
error CP0002: Member 'long Celerity.Sentinel.AbuseTracker<TKey, THasher>.EstimateDistinctKeys()'
  exists on [Baseline] lib/net8.0/Celerity.Sentinel.dll but not on lib/net8.0/Celerity.Sentinel.dll
  (...same for net9.0 and net10.0)
error : API breaking changes found. If those are intentional, the APICompat suppression file
  can be updated by rebuilding with '/p:ApiCompatGenerateSuppressionFile=true'

main is clean against the 2.4.0 baseline — full solution pack, exit 0, all six packages produced. So the gate is being switched on from a green state; no suppression file is needed today.

The release-notes gate, against the real CHANGELOG:

$ ./.github/scripts/extract-release-notes.sh 2.4.0
Release notes for [2.4.0]: 4047 bytes (limit 120000).            -> exit 0

$ ./.github/scripts/extract-release-notes.sh 9.9.9
::error::No CHANGELOG.md section found for [9.9.9]. ...          -> exit 1

$ ./.github/scripts/extract-release-notes.sh 1.5.0
::error::Release notes for [1.5.0] are 183991 bytes, at or over
  the 120000-byte guard for GitHub's ~125k release-body cap. ... -> exit 1

The gates now run on every PR, not just at release

Nothing in the PR matrix packed, so both gates lived only on the release path (plus the nightly preview). A breaking API change was therefore discoverable a night late at best, and after an irreversible push at worst — which is the exact shape of the bug being fixed. The new release-gates job in ci.yml is a release dry run on every PR: the extraction self-test, then dotnet pack (which is what runs the baseline comparison), then validate-packages.ps1. validate-packages.ps1 also gains per-PR coverage it did not have before.

A comment in nightly-preview.yml notes the same new failure mode there, so a red nightly on an API break is not a mystery.

Regression test

The extraction is pure shell, so it sits outside dotnet test and the coverage gate. .github/scripts/test-extract-release-notes.sh covers it — happy path, section bounded by the next ## [ heading, missing section, oversized section, no partial file left behind on failure, missing changelog, missing argument — and runs as a new release-gates job in ci.yml on every PR.

It is a genuine regression test, not a restatement: with the size assertion neutered to simulate pre-fix behaviour it goes red.

FAIL: rejects an oversized section — expected exit 1, got 0
FAIL: output file left behind after a failing run
::error::2 release-notes gate test(s) failed.

Package-list sync

Confirmed both halves cover all six packages. validate-packages.ps1 lists them explicitly and errors on a missing or unexpected id, and package validation applies to every project with IsPackable != false — so a new packable project is automatically in both, and the only thing its first release needs is CelerityNoPublishedBaseline.

Files changed

Facet Files
Gate (a) src/Directory.Build.props (baseline version + the bump ritual), src/Directory.Build.targets (new)
Gate (b) .github/workflows/release.yml, .github/scripts/extract-release-notes.sh (new)
Tests .github/scripts/test-extract-release-notes.sh (new), .github/workflows/ci.yml (release-gates job: extraction self-test + pack/package-validation + validate-packages.ps1), .github/workflows/nightly-preview.yml (comment)
Docs CONTRIBUTING.md (baseline bump folded into "Cutting a release" + a "Package validation" section), docs/testing.md (TL;DR row + a "Release gates" section)
CHANGELOG [Unreleased] -> Fixed, one entry per gate
ROADMAP Both "Build- and release-pipeline integrity" bullets for #315 flipped to done; the adjacent coverage-gate bullet was stale at planned after #314 shipped, so it is corrected too
Repo hygiene .gitattributes (new) — pins *.sh to LF so a Windows contributor cannot commit a CRLF shebang that fails on the Linux runners

Parity facets that genuinely do not apply: no new collection, public API, or hasher, so there are no dedicated *Tests.cs / cross-collection shared-test rows, no XxxBenchmark.cs or Program.cs registration, no dashboard COLLECTIONS entry, and no docs/api/*.md section. There is no release runbook under docs/, so per the issue the procedure went into CONTRIBUTING.md.

Test plan

  • dotnet build -c Release — 0 errors.
  • dotnet test -c Release4926 × 3 TFMs + 113 showcase tests, all passing, 0 failures.
  • dotnet pack on the full solution against the 2.4.0 baseline — exit 0, all six .nupkg + .snupkg produced.
  • Deliberate public -> internal break fails pack with CP0002 on all three TFMs (log above); change reverted.
  • ./.github/scripts/test-extract-release-notes.sh — 7/7 pass; 2 fail when the size check is neutered.
  • CI matrix: build-and-test on ubuntu / windows / macos, coverage (100% line + branch, six assemblies), aot-publish × net8.0/net9.0/net10.0, the 8 benchmark shards + aggregate, and the new release-gates job (which is itself the pack + package-validation + package-metadata dry run).
  • No dashboard refresh expected on merge to main — no benchmark class or collection was added, so gh-pages data.js and the dashboard COLLECTIONS arrays are untouched by this PR.

Note for the maintainer

The baseline bump is now a step in the release ritual: <CelerityPackageValidationBaseline> in src/Directory.Build.props must move to X.Y.Z in the same commit that promotes the CHANGELOG block. It is documented in three places (the props comment, CONTRIBUTING.md, docs/testing.md) because a stale baseline fails silently — it keeps validating against an older surface rather than erroring.

🤖 Generated with Claude Code

…the NuGet push

Two guards this repo needed were on the wrong side of the irreversible
`dotnet nuget push`.

Package validation. Six packages shipped on a tag with no ApiCompat /
PackageValidation / public-API-baseline check anywhere in the repo — in a
project that already needed a hand-written TypeForwarders.cs to survive one
assembly split. Deleting a public member produced a green CI run and a
silently breaking package. `EnablePackageValidation` plus a pinned baseline
now fails `pack` on any break, across all three TFMs.

The enablement lives in a new src/Directory.Build.targets rather than in
Directory.Build.props, because props is imported before the project body:
at that point IsPackable is unset on every project, so the baseline
PackageDownload lands on the test / benchmark / fuzz / AOT-smoke projects
too and restore dies with "Invalid framework identifier ''". Targets is
imported after the project body, where IsPackable=false is visible.

Release notes. The CHANGELOG extraction and its only check lived in
`github-release`, which needs `deploy` — so an over-long body failed after
all six packages were already public. `## [1.5.0]` is 183,991 bytes against
GitHub's ~125k cap, so this is a failure the repo has actually hit. The
extraction moves into `build`, gains a body-size assertion, and is handed
forward as an artifact so the release body is exactly what passed the gate.

The extraction is pure shell and therefore outside `dotnet test`, so it
gets its own test script and a `release-gates` CI job on every PR. The
oversized-section case is the regression test: it fails against the old
behaviour.

Closes #315.
Copilot AI review requested due to automatic review settings July 27, 2026 07:03
@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown

Coverage

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

Nothing in the PR matrix packs, so package validation and
validate-packages.ps1 only ran on the nightly preview and on the release
itself. That leaves a breaking API change discoverable a night late at
best and after an irreversible push at worst. The release-gates job now
does a full release dry run: extract-release-notes self-test, pack (which
is what runs the baseline comparison), then validate-packages.ps1.

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 strengthens Celerity’s release pipeline by moving two critical “fail-fast” checks to occur before the irreversible NuGet push: (1) MSBuild package/API compatibility validation during dotnet pack, and (2) CHANGELOG-derived release-notes extraction + size validation ahead of publish, with the validated notes passed forward as an artifact.

Changes:

  • Add MSBuild EnablePackageValidation with a pinned baseline version for all packable projects, with an explicit opt-out for first releases.
  • Hoist release-notes extraction/validation into the build job in release.yml, upload the validated notes as an artifact, and consume it in github-release.
  • Add CI coverage for the release-notes extraction script, plus .gitattributes to enforce LF line endings for *.sh.

Reviewed changes

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

Show a summary per file
File Description
src/Directory.Build.targets Enables package validation only for packable projects (post-project import), avoiding restore failures for dev/test tooling projects.
src/Directory.Build.props Adds a single baseline version property and documents the baseline bump ritual.
.github/workflows/release.yml Moves CHANGELOG extraction/validation before packaging/publish and passes validated release notes via artifact to the release job.
.github/scripts/extract-release-notes.sh New script to extract a tagged version section and enforce a size guard for GitHub release body limits.
.github/scripts/test-extract-release-notes.sh Regression tests for the extraction script, executed in CI.
.github/workflows/ci.yml Adds a release-gates job to run the shell-script regression tests on every PR.
docs/testing.md Documents the new release gates and how to run/verify them locally.
CONTRIBUTING.md Updates the release procedure to include the baseline bump and documents package validation + release-notes validation.
CHANGELOG.md Adds two “Fixed” entries under [Unreleased] for the new pre-publish guards.
ROADMAP.md Marks #315 pipeline-integrity bullets as done.
.gitattributes Forces LF endings for *.sh to avoid CI runner shebang failures.

Comment thread docs/testing.md Outdated
Copilot AI review requested due to automatic review settings July 27, 2026 07:07
…ives in

Addresses Copilot review on #326: the gates table listed both
Directory.Build.props and Directory.Build.targets for
EnablePackageValidation, but the switch is only in targets — props
carries the baseline version. Split the two out and link both files.

Also gitignore release-notes.md, the local output of
extract-release-notes.sh when previewing a release body.

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

Comments suppressed due to low confidence (1)

docs/testing.md:115

  • The “Package validation” row implies EnablePackageValidation is set in src/Directory.Build.props, but the implementation sets EnablePackageValidation in src/Directory.Build.targets (with only the baseline version property in props). Tweaking this wording avoids sending readers to the wrong file when debugging a validation failure.
| Package validation | Any breaking public-API change against the last published version of that package, on any TFM. | `dotnet pack`. The switch is `EnablePackageValidation` in [`src/Directory.Build.targets`](../src/Directory.Build.targets); the baseline version it compares against is `CelerityPackageValidationBaseline` in [`src/Directory.Build.props`](../src/Directory.Build.props). |

Copilot AI review requested due to automatic review settings July 27, 2026 07:11
…release'

Inserting the Package validation section pushed that sentence under the
wrong heading, where it read as a note about validation. Moved it back
above the new heading and pointed the section at the release-gates job.

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 encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

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

@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown

Benchmarks

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

Highlights

Benchmark This PR StdDev main Δ
CeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 13.75 μs 256.0 ns 12.07 μs +14.0% ⚠️
TopKSketchBenchmark.Dictionary_Add(ItemCount: 1000) 14.41 μs 111.2 ns 13.06 μs +10.4% ⚠️
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 1000) 40.65 μs 3.20 μs 66.11 μs -38.5% ✅
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 9.75 μs 50.1 ns 11.86 μs -17.8% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 1000) 42.69 μs 422.2 ns 53.83 μs -20.7% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 1000) 6.86 μs 30.0 ns 8.39 μs -18.3% ✅
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 100000) 20.02 ms 328.16 μs 24.15 ms -17.1% ✅
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 4.08 ms 33.41 μs 4.79 ms -14.9% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 100000) 13.47 ms 64.25 μs 16.04 ms -16.0% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 100000) 2.46 ms 10.03 μs 2.88 ms -14.7% ✅
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 3.65 μs 3.8 ns 4.74 μs -22.9% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 1000) 1.60 μs 44.4 ns 1.94 μs -17.3% ✅
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.17 ms 3.52 μs 1.57 ms -25.4% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 100000) 396.06 μs 17.10 μs 578.55 μs -31.5% ✅
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 1000) 61.83 μs 2.08 μs 144.02 μs -57.1% ✅
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 1000) 146.45 μs 719.8 ns 262.80 μs -44.3% ✅
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 100000) 27.40 ms 444.41 μs 33.98 ms -19.4% ✅
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 100000) 43.49 ms 196.51 μs 57.22 ms -24.0% ✅
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 1000) 3.71 μs 18.5 ns 5.04 μs -26.5% ✅
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 1000) 22.75 μs 42.0 ns 30.46 μs -25.3% ✅
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 100000) 899.87 μs 6.38 μs 1.09 ms -17.3% ✅
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 100000) 4.94 ms 102.05 μs 6.50 ms -24.0% ✅
DequeBenchmark.Deque_Enumerate(ItemCount: 1000) 824.9 ns 0.5 ns 942.6 ns -12.5% ✅
DequeBenchmark.LinkedList_Enumerate(ItemCount: 100000) 117.84 μs 68.2 ns 135.52 μs -13.0% ✅
DequeBenchmark.Deque_Enumerate(ItemCount: 100000) 81.95 μs 29.2 ns 93.95 μs -12.8% ✅
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 10.28 μs 48.8 ns 12.95 μs -20.6% ✅
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 10.14 μs 75.3 ns 12.84 μs -21.0% ✅
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 1000) 6.62 μs 101.9 ns 10.96 μs -39.6% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 1000) 13.72 μs 161.2 ns 17.42 μs -21.2% ✅
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 3.42 ms 48.46 μs 4.17 ms -18.1% ✅
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 3.98 ms 64.67 μs 4.74 ms -16.0% ✅
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 100000) 4.15 ms 50.99 μs 4.87 ms -14.9% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 100000) 7.01 ms 139.60 μs 7.87 ms -11.0% ✅
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 1000) 20.59 μs 171.6 ns 35.14 μs -41.4% ✅
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.57 μs 3.8 ns 4.74 μs -24.7% ✅
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.62 μs 46.0 ns 4.74 μs -23.7% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 1000) 13.79 μs 143.7 ns 25.39 μs -45.7% ✅
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 1000) 1.74 μs 95.6 ns 2.14 μs -18.7% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 1000) 2.33 μs 3.4 ns 2.84 μs -18.0% ✅
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 100000) 14.56 ms 37.27 μs 19.73 ms -26.2% ✅
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.16 ms 20.84 μs 1.60 ms -27.5% ✅
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.24 ms 1.46 μs 1.60 ms -22.3% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 100000) 10.97 ms 80.21 μs 13.02 ms -15.7% ✅
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 100000) 567.91 μs 32.04 μs 679.06 μs -16.4% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 100000) 676.63 μs 16.60 μs 856.61 μs -21.0% ✅
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 1000) 71.59 μs 3.13 μs 190.77 μs -62.5% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 1000) 55.19 μs 475.0 ns 85.43 μs -35.4% ✅
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 100000) 39.33 ms 227.37 μs 47.21 ms -16.7% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 100000) 21.86 ms 42.84 μs 26.14 ms -16.4% ✅
DequeBenchmark.LinkedList_PushFront(ItemCount: 1000) 28.11 μs 1.23 μs 42.52 μs -33.9% ✅
DequeBenchmark.LinkedList_PushFront(ItemCount: 100000) 1.39 ms 12.76 μs 1.78 ms -22.0% ✅
DequeBenchmark.Deque_PushFront(ItemCount: 100000) 475.98 μs 8.90 μs 641.13 μs -25.8% ✅
DequeBenchmark.LinkedList_Queue(ItemCount: 1000) 42.29 μs 3.64 μs 59.32 μs -28.7% ✅
DequeBenchmark.Deque_Queue(ItemCount: 1000) 24.02 μs 4.24 μs 38.79 μs -38.1% ✅
DequeBenchmark.LinkedList_Queue(ItemCount: 100000) 3.65 ms 172.42 μs 4.11 ms -11.2% ✅
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 1000) 3.58 μs 23.7 ns 4.44 μs -19.4% ✅
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 1000) 64.0 ns 1.4 ns 79.3 ns -19.4% ✅
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 100000) 899.10 μs 3.77 μs 1.19 ms -24.6% ✅
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 100000) 4.49 μs 4.1 ns 5.79 μs -22.5% ✅
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 1000) 517.11 μs 12.05 μs 792.47 μs -34.7% ✅
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 58.60 μs 5.09 μs 81.15 μs -27.8% ✅
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 20.75 μs 1.11 μs 28.05 μs -26.0% ✅
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 62.90 μs 6.77 μs 85.98 μs -26.8% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 1000) 213.94 μs 7.84 μs 314.18 μs -31.9% ✅
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 1000) 71.74 μs 7.17 μs 98.07 μs -26.8% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 1000) 91.13 μs 6.08 μs 121.36 μs -24.9% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 1000) 91.51 μs 4.13 μs 119.21 μs -23.2% ✅
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 100000) 21.79 ms 632.74 μs 26.77 ms -18.6% ✅
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.57 ms 32.01 μs 2.04 ms -23.2% ✅
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.29 ms 10.81 μs 1.71 ms -24.3% ✅
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.55 ms 18.35 μs 2.04 ms -24.3% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 100000) 15.11 ms 137.55 μs 18.44 ms -18.1% ✅
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 100000) 2.05 ms 1.48 ms 6.69 ms -69.4% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 100000) 1.10 ms 10.54 μs 1.37 ms -19.8% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 100000) 1.42 ms 22.94 μs 1.77 ms -19.4% ✅
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 100000) 316.74 μs 18.50 μs 349.58 μs -9.4% ✅
CuckooFilterBenchmark.HashSet_Add(ItemCount: 1000) 12.26 μs 303.4 ns 13.57 μs -9.7% ✅
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 1000) 3.43 ms 214.48 μs 3.95 ms -13.0% ✅
SwissSetBenchmark.HashSet_Remove(ItemCount: 1000) 26.91 μs 1.20 μs 31.00 μs -13.2% ✅
FrozenCelerityDictionaryBenchmark.FrozenDictionary_SpanLookup(ItemCount: 100000) 5.75 ms 14.06 μs 6.34 ms -9.3% ✅
EnumMapBenchmark.Dictionary_Add 583.7 ns 3.8 ns 478.1 ns +22.1% ⚠️
EnumSetBenchmark.HashSet_Add 548.7 ns 3.3 ns 445.5 ns +23.2% ⚠️
EnumMapBenchmark.EnumMap_Add 148.7 ns 0.5 ns 84.6 ns +75.8% ⚠️
EnumSetBenchmark.EnumSet_Add 84.0 ns 0.3 ns 64.0 ns +31.3% ⚠️
SmallSetBenchmark.HashSet_Add(ItemCount: 8) 158.4 ns 0.9 ns 130.6 ns +21.3% ⚠️
SmallSetBenchmark.HashSet_Add(ItemCount: 64) 725.5 ns 4.1 ns 596.2 ns +21.7% ⚠️
EnumSetBenchmark.HashSet_Contains 175.2 ns 0.2 ns 134.2 ns +30.5% ⚠️
EnumSetBenchmark.EnumSet_Contains 45.9 ns 0.1 ns 39.9 ns +15.1% ⚠️
SmallSetBenchmark.HashSet_Contains(ItemCount: 8) 37.4 ns 0.2 ns 29.7 ns +26.0% ⚠️
SmallSetBenchmark.SmallSet_Contains(ItemCount: 8) 18.9 ns 0.1 ns 15.2 ns +23.7% ⚠️
SmallSetBenchmark.HashSet_Contains(ItemCount: 64) 300.6 ns 1.3 ns 234.2 ns +28.3% ⚠️
SmallSetBenchmark.SmallSet_Contains(ItemCount: 64) 1.09 μs 12.0 ns 721.6 ns +51.6% ⚠️
EnumMapBenchmark.Dictionary_Enumerate 50.4 ns 0.2 ns 33.4 ns +50.7% ⚠️
EnumMapBenchmark.EnumMap_Enumerate 41.7 ns 1.9 ns 29.6 ns +40.9% ⚠️
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 1000) 29.20 μs 272.3 ns 20.66 μs +41.3% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 1000) 37.53 μs 493.1 ns 30.02 μs +25.0% ⚠️
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 100000) 12.42 ms 791.94 μs 10.10 ms +22.9% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 100000) 17.20 ms 119.28 μs 14.80 ms +16.3% ⚠️
EnumMapBenchmark.Dictionary_Lookup 118.0 ns 0.2 ns 105.3 ns +12.0% ⚠️
EnumMapBenchmark.EnumMap_Lookup 64.1 ns 0.1 ns 54.6 ns +17.2% ⚠️
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.01 μs 32.1 ns 4.07 μs +23.2% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 1000) 2.36 μs 2.6 ns 1.99 μs +18.1% ⚠️
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.75 ms 2.06 μs 1.37 ms +27.3% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 100000) 735.96 μs 5.84 μs 597.57 μs +23.2% ⚠️
EnumMapBenchmark.Dictionary_Remove 3.28 μs 131.1 ns 1.98 μs +65.5% ⚠️
EnumSetBenchmark.HashSet_Remove 3.82 μs 359.6 ns 2.13 μs +79.5% ⚠️
EnumMapBenchmark.EnumMap_Remove 1.47 μs 61.4 ns 954.1 ns +53.7% ⚠️
SmallSetBenchmark.SmallSet_Remove(ItemCount: 8) 1.20 μs 59.2 ns 890.0 ns +34.8% ⚠️
SmallSetBenchmark.SmallSet_Remove(ItemCount: 64) 26.76 μs 4.43 μs 17.87 μs +49.7% ⚠️
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 1000) 35.50 μs 2.35 μs 20.70 μs +71.5% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 1000) 120.57 μs 8.63 μs 94.00 μs +28.3% ⚠️
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 1.95 ms 131.46 μs 1.59 ms +22.6% ⚠️
EnumSetBenchmark.HashSet_Union 402.8 ns 3.4 ns 319.8 ns +26.0% ⚠️
EnumSetBenchmark.EnumSet_Union 21.3 ns 0.1 ns 18.5 ns +14.8% ⚠️
TrieBenchmark.Trie_Add(ItemCount: 1000) 540.68 μs 20.00 μs 396.98 μs +36.2% ⚠️
TrieBenchmark.Trie_Add(ItemCount: 100000) 26.78 ms 611.99 μs 22.69 ms +18.0% ⚠️
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 1000) 2.52 ms 242.38 μs 3.33 ms -24.2% ✅
TrieBenchmark.Dictionary_Lookup(ItemCount: 1000) 13.24 μs 552.1 ns 9.73 μs +36.0% ⚠️
TrieBenchmark.Trie_Lookup(ItemCount: 1000) 40.96 μs 253.1 ns 35.05 μs +16.8% ⚠️
TrieBenchmark.Dictionary_Lookup(ItemCount: 100000) 2.70 ms 11.89 μs 2.15 ms +25.5% ⚠️
TrieBenchmark.Trie_Lookup(ItemCount: 100000) 8.94 ms 200.06 μs 7.99 ms +11.8% ⚠️
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 1000) 73.48 μs 247.5 ns 62.01 μs +18.5% ⚠️
TrieBenchmark.Trie_PrefixMatch(ItemCount: 1000) 57.86 μs 489.9 ns 44.04 μs +31.4% ⚠️
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 100000) 7.39 ms 16.05 μs 6.25 ms +18.2% ⚠️
TrieBenchmark.Trie_PrefixMatch(ItemCount: 100000) 8.09 ms 545.44 μs 5.62 ms +43.9% ⚠️
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 1000) 41.17 μs 378.4 ns 30.62 μs +34.4% ⚠️
TrieBenchmark.Trie_SpanLookup(ItemCount: 1000) 43.33 μs 317.3 ns 35.99 μs +20.4% ⚠️
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 100000) 5.94 ms 229.77 μs 4.96 ms +19.8% ⚠️
TrieBenchmark.Trie_SpanLookup(ItemCount: 100000) 8.82 ms 197.35 μs 7.48 ms +18.0% ⚠️
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 1000) 5.91 μs 17.9 ns 7.27 μs -18.7% ✅
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 8) 1.66 μs 202.1 ns 1.32 μs +25.4% ⚠️
Collections (488)
Benchmark This PR StdDev main Δ
CeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 13.75 μs 256.0 ns 12.07 μs +14.0% ⚠️
TopKSketchBenchmark.Dictionary_Add(ItemCount: 1000) 14.41 μs 111.2 ns 13.06 μs +10.4% ⚠️
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 1000) 9.47 μs 60.4 ns 8.84 μs +7.1%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 1000) 87.60 μs 565.5 ns 87.91 μs -0.4%
CeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 5.06 ms 83.82 μs 5.03 ms +0.5%
TopKSketchBenchmark.Dictionary_Add(ItemCount: 100000) 3.42 ms 126.34 μs 3.20 ms +6.9%
CeleritySetBenchmark.CeleritySet_Add(ItemCount: 100000) 3.23 ms 35.54 μs 3.19 ms +1.3%
TopKSketchBenchmark.TopKSketch_Add(ItemCount: 100000) 15.06 ms 476.67 μs 14.41 ms +4.5%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 10.0 ns 4.74 μs -0.0%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 1000) 1.85 μs 6.1 ns 1.96 μs -5.4%
CeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.58 ms 14.90 μs 1.57 ms +0.6%
CeleritySetBenchmark.CeleritySet_Contains(ItemCount: 100000) 598.36 μs 2.52 μs 591.05 μs +1.2%
LruCacheBenchmark.Dictionary_Get(ItemCount: 1000) 24.80 μs 59.2 ns 26.35 μs -5.9%
LruCacheBenchmark.LruCache_Get(ItemCount: 1000) 6.77 μs 56.6 ns 6.81 μs -0.6%
LruCacheBenchmark.Dictionary_Get(ItemCount: 100000) 25.36 μs 147.9 ns 25.50 μs -0.5%
LruCacheBenchmark.LruCache_Get(ItemCount: 100000) 6.89 μs 18.8 ns 7.08 μs -2.6%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 1000) 4.82 μs 73.7 ns 4.83 μs -0.1%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 1000) 3.60 μs 11.4 ns 3.60 μs +0.0%
LruCacheBenchmark.Dictionary_GetMissing(ItemCount: 100000) 519.50 μs 563.1 ns 519.59 μs -0.0%
LruCacheBenchmark.LruCache_GetMissing(ItemCount: 100000) 1.34 ms 732.6 ns 1.34 ms +0.1%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.66 μs 870.1 ns 13.51 μs +8.5%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 1000) 8.18 μs 34.3 ns 8.16 μs +0.2%
PooledCelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 5.00 ms 59.12 μs 4.93 ms +1.4%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Insert(ItemCount: 100000) 3.00 ms 21.76 μs 2.95 ms +1.5%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.73 μs 8.1 ns 4.70 μs +0.6%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 1000) 2.34 μs 22.4 ns 7.92 μs -70.5%
PooledCelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.69 ms 71.07 μs 1.62 ms +4.1%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Lookup(ItemCount: 100000) 722.29 μs 2.67 μs 715.68 μs +0.9%
LruCacheBenchmark.Dictionary_Put(ItemCount: 1000) 109.46 μs 5.12 μs 112.23 μs -2.5%
LruCacheBenchmark.LruCache_Put(ItemCount: 1000) 482.07 μs 18.50 μs 479.78 μs +0.5%
LruCacheBenchmark.Dictionary_Put(ItemCount: 100000) 8.36 ms 42.54 μs 8.15 ms +2.6%
LruCacheBenchmark.LruCache_Put(ItemCount: 100000) 5.83 ms 51.48 μs 5.85 ms -0.3%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 31.09 μs 4.21 μs 27.05 μs +15.0%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 84.15 μs 7.41 μs 82.41 μs +2.1%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 1000) 116.49 μs 4.92 μs 116.92 μs -0.4%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 1000) 125.51 μs 4.14 μs 129.83 μs -3.3%
CeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.79 ms 64.66 μs 1.69 ms +5.8%
PooledCelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.11 ms 66.13 μs 2.04 ms +3.4%
CeleritySetBenchmark.CeleritySet_Remove(ItemCount: 100000) 1.43 ms 134.16 μs 1.32 ms +8.6%
PooledCelerityDictionaryBenchmark.PooledCelerityDictionary_Remove(ItemCount: 100000) 1.67 ms 166.68 μs 1.59 ms +4.9%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 1000) 32.1 ns 0.2 ns 29.4 ns +9.3%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 1000) 1.31 μs 13.8 ns 1.22 μs +7.2%
TopKSketchBenchmark.Dictionary_TopK(ItemCount: 100000) 32.6 ns 0.7 ns 30.3 ns +7.7%
TopKSketchBenchmark.TopKSketch_TopK(ItemCount: 100000) 1.26 μs 5.6 ns 1.17 μs +8.4%
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 1000) 40.65 μs 3.20 μs 66.11 μs -38.5% ✅
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 1000) 9.75 μs 50.1 ns 11.86 μs -17.8% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 1000) 42.69 μs 422.2 ns 53.83 μs -20.7% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 1000) 6.86 μs 30.0 ns 8.39 μs -18.3% ✅
BTreeDictionaryBenchmark.SortedDictionary_Add(ItemCount: 100000) 20.02 ms 328.16 μs 24.15 ms -17.1% ✅
PooledCeleritySetBenchmark.HashSet_Add(ItemCount: 100000) 4.08 ms 33.41 μs 4.79 ms -14.9% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Add(ItemCount: 100000) 13.47 ms 64.25 μs 16.04 ms -16.0% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Add(ItemCount: 100000) 2.46 ms 10.03 μs 2.88 ms -14.7% ✅
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 1000) 3.65 μs 3.8 ns 4.74 μs -22.9% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 1000) 1.60 μs 44.4 ns 1.94 μs -17.3% ✅
PooledCeleritySetBenchmark.HashSet_Contains(ItemCount: 100000) 1.17 ms 3.52 μs 1.57 ms -25.4% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Contains(ItemCount: 100000) 396.06 μs 17.10 μs 578.55 μs -31.5% ✅
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 1000) 61.83 μs 2.08 μs 144.02 μs -57.1% ✅
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 1000) 146.45 μs 719.8 ns 262.80 μs -44.3% ✅
IndexedPriorityQueueBenchmark.PriorityQueue_DecreaseKey(ItemCount: 100000) 27.40 ms 444.41 μs 33.98 ms -19.4% ✅
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_DecreaseKey(ItemCount: 100000) 43.49 ms 196.51 μs 57.22 ms -24.0% ✅
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 1000) 3.71 μs 18.5 ns 5.04 μs -26.5% ✅
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 1000) 22.75 μs 42.0 ns 30.46 μs -25.3% ✅
IndexedPriorityQueueBenchmark.PriorityQueue_Enqueue(ItemCount: 100000) 899.87 μs 6.38 μs 1.09 ms -17.3% ✅
IndexedPriorityQueueBenchmark.IndexedPriorityQueue_Enqueue(ItemCount: 100000) 4.94 ms 102.05 μs 6.50 ms -24.0% ✅
DequeBenchmark.LinkedList_Enumerate(ItemCount: 1000) 1.28 μs 0.3 ns 1.37 μs -6.6%
DequeBenchmark.Deque_Enumerate(ItemCount: 1000) 824.9 ns 0.5 ns 942.6 ns -12.5% ✅
DequeBenchmark.LinkedList_Enumerate(ItemCount: 100000) 117.84 μs 68.2 ns 135.52 μs -13.0% ✅
DequeBenchmark.Deque_Enumerate(ItemCount: 100000) 81.95 μs 29.2 ns 93.95 μs -12.8% ✅
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 10.28 μs 48.8 ns 12.95 μs -20.6% ✅
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 10.14 μs 75.3 ns 12.84 μs -21.0% ✅
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 1000) 6.62 μs 101.9 ns 10.96 μs -39.6% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 1000) 13.72 μs 161.2 ns 17.42 μs -21.2% ✅
IntDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 3.42 ms 48.46 μs 4.17 ms -18.1% ✅
RobinHoodDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 3.98 ms 64.67 μs 4.74 ms -16.0% ✅
IntDictionaryBenchmark.IntDictionary_Insert(ItemCount: 100000) 4.15 ms 50.99 μs 4.87 ms -14.9% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Insert(ItemCount: 100000) 7.01 ms 139.60 μs 7.87 ms -11.0% ✅
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 1000) 20.59 μs 171.6 ns 35.14 μs -41.4% ✅
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.57 μs 3.8 ns 4.74 μs -24.7% ✅
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 3.62 μs 46.0 ns 4.74 μs -23.7% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 1000) 13.79 μs 143.7 ns 25.39 μs -45.7% ✅
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 1000) 1.74 μs 95.6 ns 2.14 μs -18.7% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 1000) 2.33 μs 3.4 ns 2.84 μs -18.0% ✅
BTreeDictionaryBenchmark.SortedDictionary_Lookup(ItemCount: 100000) 14.56 ms 37.27 μs 19.73 ms -26.2% ✅
IntDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.16 ms 20.84 μs 1.60 ms -27.5% ✅
RobinHoodDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.24 ms 1.46 μs 1.60 ms -22.3% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Lookup(ItemCount: 100000) 10.97 ms 80.21 μs 13.02 ms -15.7% ✅
IntDictionaryBenchmark.IntDictionary_Lookup(ItemCount: 100000) 567.91 μs 32.04 μs 679.06 μs -16.4% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Lookup(ItemCount: 100000) 676.63 μs 16.60 μs 856.61 μs -21.0% ✅
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 1000) 71.59 μs 3.13 μs 190.77 μs -62.5% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 1000) 55.19 μs 475.0 ns 85.43 μs -35.4% ✅
BTreeDictionaryBenchmark.SortedDictionary_Mixed(ItemCount: 100000) 39.33 ms 227.37 μs 47.21 ms -16.7% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Mixed(ItemCount: 100000) 21.86 ms 42.84 μs 26.14 ms -16.4% ✅
DequeBenchmark.LinkedList_PushFront(ItemCount: 1000) 28.11 μs 1.23 μs 42.52 μs -33.9% ✅
DequeBenchmark.Deque_PushFront(ItemCount: 1000) 17.51 μs 1.47 μs 20.59 μs -15.0%
DequeBenchmark.LinkedList_PushFront(ItemCount: 100000) 1.39 ms 12.76 μs 1.78 ms -22.0% ✅
DequeBenchmark.Deque_PushFront(ItemCount: 100000) 475.98 μs 8.90 μs 641.13 μs -25.8% ✅
DequeBenchmark.LinkedList_Queue(ItemCount: 1000) 42.29 μs 3.64 μs 59.32 μs -28.7% ✅
DequeBenchmark.Deque_Queue(ItemCount: 1000) 24.02 μs 4.24 μs 38.79 μs -38.1% ✅
DequeBenchmark.LinkedList_Queue(ItemCount: 100000) 3.65 ms 172.42 μs 4.11 ms -11.2% ✅
DequeBenchmark.Deque_Queue(ItemCount: 100000) 385.33 μs 57.28 μs 421.60 μs -8.6%
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 1000) 3.58 μs 23.7 ns 4.44 μs -19.4% ✅
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 1000) 64.0 ns 1.4 ns 79.3 ns -19.4% ✅
BTreeDictionaryBenchmark.SortedDictionary_RangeScan(ItemCount: 100000) 899.10 μs 3.77 μs 1.19 ms -24.6% ✅
BTreeDictionaryBenchmark.BTreeDictionary_RangeScan(ItemCount: 100000) 4.49 μs 4.1 ns 5.79 μs -22.5% ✅
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 1000) 517.11 μs 12.05 μs 792.47 μs -34.7% ✅
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 58.60 μs 5.09 μs 81.15 μs -27.8% ✅
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 1000) 20.75 μs 1.11 μs 28.05 μs -26.0% ✅
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 62.90 μs 6.77 μs 85.98 μs -26.8% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 1000) 213.94 μs 7.84 μs 314.18 μs -31.9% ✅
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 1000) 71.74 μs 7.17 μs 98.07 μs -26.8% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 1000) 91.13 μs 6.08 μs 121.36 μs -24.9% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 1000) 91.51 μs 4.13 μs 119.21 μs -23.2% ✅
BTreeDictionaryBenchmark.SortedDictionary_Remove(ItemCount: 100000) 21.79 ms 632.74 μs 26.77 ms -18.6% ✅
IntDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.57 ms 32.01 μs 2.04 ms -23.2% ✅
PooledCeleritySetBenchmark.HashSet_Remove(ItemCount: 100000) 1.29 ms 10.81 μs 1.71 ms -24.3% ✅
RobinHoodDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.55 ms 18.35 μs 2.04 ms -24.3% ✅
BTreeDictionaryBenchmark.BTreeDictionary_Remove(ItemCount: 100000) 15.11 ms 137.55 μs 18.44 ms -18.1% ✅
IntDictionaryBenchmark.IntDictionary_Remove(ItemCount: 100000) 2.05 ms 1.48 ms 6.69 ms -69.4% ✅
PooledCeleritySetBenchmark.PooledCeleritySet_Remove(ItemCount: 100000) 1.10 ms 10.54 μs 1.37 ms -19.8% ✅
RobinHoodDictionaryBenchmark.RobinHoodDictionary_Remove(ItemCount: 100000) 1.42 ms 22.94 μs 1.77 ms -19.4% ✅
BTreeSetBenchmark.SortedSet_Add(ItemCount: 1000) 42.31 μs 929.7 ns 43.32 μs -2.3%
IntSetBenchmark.HashSet_Add(ItemCount: 1000) 12.76 μs 176.1 ns 13.61 μs -6.2%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 1000) 41.55 μs 77.2 ns 41.84 μs -0.7%
IntSetBenchmark.IntSet_Add(ItemCount: 1000) 8.66 μs 81.1 ns 9.12 μs -5.1%
BTreeSetBenchmark.SortedSet_Add(ItemCount: 100000) 21.16 ms 177.10 μs 21.14 ms +0.1%
IntSetBenchmark.HashSet_Add(ItemCount: 100000) 4.95 ms 94.19 μs 5.13 ms -3.5%
BTreeSetBenchmark.BTreeSet_Add(ItemCount: 100000) 13.94 ms 73.67 μs 14.08 ms -1.0%
IntSetBenchmark.IntSet_Add(ItemCount: 100000) 3.16 ms 18.82 μs 3.26 ms -2.9%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 1000) 18.62 μs 74.4 ns 19.13 μs -2.6%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 1000) 16.55 μs 91.6 ns 17.20 μs -3.8%
DisjointSetBenchmark.Dictionary_Components(ItemCount: 100000) 4.31 ms 79.50 μs 4.50 ms -4.3%
DisjointSetBenchmark.DisjointSet_Components(ItemCount: 100000) 3.24 ms 134.08 μs 3.22 ms +0.7%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 1000) 9.16 μs 5.3 ns 9.42 μs -2.8%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 1000) 12.16 μs 59.8 ns 12.20 μs -0.3%
DisjointSetBenchmark.Dictionary_Connected(ItemCount: 100000) 259.35 μs 7.73 μs 260.81 μs -0.6%
DisjointSetBenchmark.DisjointSet_Connected(ItemCount: 100000) 316.74 μs 18.50 μs 349.58 μs -9.4% ✅
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 1000) 16.71 μs 24.6 ns 16.70 μs +0.0%
IntSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.74 μs 4.9 ns 4.74 μs -0.0%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 1000) 17.32 μs 163.7 ns 17.34 μs -0.1%
IntSetBenchmark.IntSet_Contains(ItemCount: 1000) 1.81 μs 15.5 ns 1.81 μs -0.2%
BTreeSetBenchmark.SortedSet_Contains(ItemCount: 100000) 15.82 ms 155.49 μs 14.79 ms +7.0%
IntSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.54 ms 2.17 μs 1.59 ms -2.6%
BTreeSetBenchmark.BTreeSet_Contains(ItemCount: 100000) 12.55 ms 16.04 μs 12.78 ms -1.9%
IntSetBenchmark.IntSet_Contains(ItemCount: 100000) 571.86 μs 1.81 μs 580.59 μs -1.5%
StringInternTableBenchmark.Dictionary_Dedupe(ItemCount: 1000) 35.71 μs 179.0 ns 34.11 μs +4.7%
StringInternTableBenchmark.StringInternTable_Dedupe(ItemCount: 1000) 35.76 μs 35.1 ns 35.82 μs -0.2%
StringInternTableBenchmark.Dictionary_Dedupe(ItemCount: 100000) 3.39 ms 13.79 μs 3.25 ms +4.5%
StringInternTableBenchmark.StringInternTable_Dedupe(ItemCount: 100000) 3.20 ms 2.31 μs 3.20 ms +0.0%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 15.90 μs 591.3 ns 16.54 μs -3.9%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.09 μs 842.1 ns 14.58 μs -3.4%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 1000) 11.46 μs 197.2 ns 12.61 μs -9.1%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 1000) 29.79 μs 364.6 ns 30.59 μs -2.6%
LongDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.94 ms 37.28 μs 5.16 ms -4.2%
SwissDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.52 ms 262.95 μs 4.73 ms -4.5%
LongDictionaryBenchmark.LongDictionary_Insert(ItemCount: 100000) 6.69 ms 66.66 μs 7.06 ms -5.3%
SwissDictionaryBenchmark.SwissDictionary_Insert(ItemCount: 100000) 3.91 ms 21.82 μs 4.04 ms -3.1%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.00 μs 46.0 ns 4.89 μs +2.1%
StringInternTableBenchmark.HashSet_Lookup(ItemCount: 1000) 34.23 μs 739.7 ns 32.45 μs +5.5%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.71 μs 19.2 ns 4.72 μs -0.2%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 1000) 2.27 μs 9.6 ns 2.27 μs -0.2%
StringInternTableBenchmark.StringInternTable_Lookup(ItemCount: 1000) 31.42 μs 23.0 ns 31.40 μs +0.1%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 1000) 3.03 μs 32.5 ns 3.24 μs -6.2%
LongDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.58 ms 2.79 μs 1.60 ms -1.5%
StringInternTableBenchmark.HashSet_Lookup(ItemCount: 100000) 3.43 ms 17.72 μs 3.32 ms +3.4%
SwissDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.55 ms 53.93 μs 1.66 ms -6.8%
LongDictionaryBenchmark.LongDictionary_Lookup(ItemCount: 100000) 696.74 μs 2.44 μs 705.44 μs -1.2%
StringInternTableBenchmark.StringInternTable_Lookup(ItemCount: 100000) 3.17 ms 2.36 μs 3.18 ms -0.3%
SwissDictionaryBenchmark.SwissDictionary_Lookup(ItemCount: 100000) 822.04 μs 29.97 μs 822.85 μs -0.1%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 1000) 100.29 μs 627.4 ns 99.26 μs +1.0%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 1000) 64.95 μs 2.31 μs 60.94 μs +6.6%
BTreeSetBenchmark.SortedSet_Mixed(ItemCount: 100000) 31.68 ms 180.41 μs 31.69 ms -0.0%
BTreeSetBenchmark.BTreeSet_Mixed(ItemCount: 100000) 24.20 ms 214.59 μs 24.02 ms +0.7%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 1000) 169.3 ns 1.0 ns 170.9 ns -1.0%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 1000) 74.3 ns 0.3 ns 73.9 ns +0.6%
BTreeSetBenchmark.SortedSet_RangeScan(ItemCount: 100000) 9.14 μs 479.3 ns 9.39 μs -2.7%
BTreeSetBenchmark.BTreeSet_RangeScan(ItemCount: 100000) 5.31 μs 130.4 ns 5.18 μs +2.5%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 1000) 735.89 μs 17.82 μs 729.78 μs +0.8%
IntSetBenchmark.HashSet_Remove(ItemCount: 1000) 33.38 μs 3.10 μs 31.51 μs +6.0%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 88.32 μs 3.94 μs 87.11 μs +1.4%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 81.22 μs 7.58 μs 88.97 μs -8.7%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 1000) 268.03 μs 10.95 μs 269.32 μs -0.5%
IntSetBenchmark.IntSet_Remove(ItemCount: 1000) 82.64 μs 5.87 μs 81.71 μs +1.1%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 1000) 87.27 μs 5.78 μs 91.01 μs -4.1%
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 1000) 78.50 μs 11.07 μs 75.18 μs +4.4%
BTreeSetBenchmark.SortedSet_Remove(ItemCount: 100000) 25.21 ms 270.30 μs 25.12 ms +0.4%
IntSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.70 ms 14.21 μs 1.76 ms -3.3%
LongDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 1.99 ms 18.26 μs 2.04 ms -2.4%
SwissDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.05 ms 11.08 μs 2.25 ms -8.8%
BTreeSetBenchmark.BTreeSet_Remove(ItemCount: 100000) 15.58 ms 257.27 μs 15.36 ms +1.4%
IntSetBenchmark.IntSet_Remove(ItemCount: 100000) 1.34 ms 10.52 μs 1.33 ms +0.6%
LongDictionaryBenchmark.LongDictionary_Remove(ItemCount: 100000) 1.61 ms 67.64 μs 1.89 ms -14.7%
SwissDictionaryBenchmark.SwissDictionary_Remove(ItemCount: 100000) 1.75 ms 192.64 μs 1.99 ms -12.1%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 1000) 100.48 μs 2.24 μs 100.68 μs -0.2%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 1000) 27.07 μs 242.2 ns 27.71 μs -2.3%
DisjointSetBenchmark.Dictionary_Union(ItemCount: 100000) 44.86 ms 929.32 μs 49.07 ms -8.6%
DisjointSetBenchmark.DisjointSet_Union(ItemCount: 100000) 8.56 ms 132.70 μs 8.64 ms -1.0%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 1000) 12.26 μs 303.4 ns 13.57 μs -9.7% ✅
LongSetBenchmark.HashSet_Add(ItemCount: 1000) 13.37 μs 571.4 ns 13.38 μs -0.0%
SwissSetBenchmark.HashSet_Add(ItemCount: 1000) 12.79 μs 105.9 ns 12.29 μs +4.1%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 1000) 7.12 μs 50.0 ns 7.26 μs -1.9%
LongSetBenchmark.LongSet_Add(ItemCount: 1000) 9.04 μs 56.6 ns 9.48 μs -4.6%
SwissSetBenchmark.SwissSet_Add(ItemCount: 1000) 26.87 μs 117.8 ns 26.39 μs +1.8%
CuckooFilterBenchmark.HashSet_Add(ItemCount: 100000) 4.67 ms 74.76 μs 4.72 ms -1.0%
LongSetBenchmark.HashSet_Add(ItemCount: 100000) 4.55 ms 160.35 μs 4.56 ms -0.2%
SwissSetBenchmark.HashSet_Add(ItemCount: 100000) 4.71 ms 74.24 μs 4.77 ms -1.2%
CuckooFilterBenchmark.CuckooFilter_Add(ItemCount: 100000) 2.08 ms 7.61 μs 2.10 ms -0.5%
LongSetBenchmark.LongSet_Add(ItemCount: 100000) 6.05 ms 63.79 μs 6.08 ms -0.5%
SwissSetBenchmark.SwissSet_Add(ItemCount: 100000) 4.58 ms 24.43 μs 4.58 ms +0.1%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 1000) 160.71 μs 657.6 ns 161.80 μs -0.7%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 1000) 3.43 ms 214.48 μs 3.95 ms -13.0% ✅
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Build(ItemCount: 100000) 28.97 ms 528.70 μs 28.22 ms +2.6%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Build(ItemCount: 100000) 1.50 s 41.55 ms 1.52 s -1.4%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.85 μs 114.3 ns 4.72 μs +2.7%
LongSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.80 μs 48.0 ns 4.79 μs +0.3%
SwissSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.96 μs 234.5 ns 4.75 μs +4.4%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 1000) 4.92 μs 4.9 ns 4.91 μs +0.1%
LongSetBenchmark.LongSet_Contains(ItemCount: 1000) 2.01 μs 7.7 ns 2.00 μs +0.2%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 1000) 2.86 μs 5.9 ns 2.87 μs -0.1%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 1000) 18.04 μs 146.3 ns 18.03 μs +0.0%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 1000) 24.54 μs 185.1 ns 24.27 μs +1.1%
CuckooFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.63 ms 54.47 μs 1.60 ms +1.5%
LongSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.58 ms 54.12 μs 1.61 ms -1.9%
SwissSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.55 ms 1.15 μs 1.57 ms -1.4%
CuckooFilterBenchmark.CuckooFilter_Contains(ItemCount: 100000) 1.74 ms 2.72 μs 1.74 ms +0.1%
LongSetBenchmark.LongSet_Contains(ItemCount: 100000) 638.85 μs 769.6 ns 644.44 μs -0.9%
SwissSetBenchmark.SwissSet_Contains(ItemCount: 100000) 592.72 μs 24.01 μs 628.84 μs -5.7%
StringKeyProbeBenchmark.HashSet_Contains(ItemCount: 100000) 3.39 ms 24.63 μs 3.46 ms -1.9%
StringKeyProbeBenchmark.CeleritySet_Contains(ItemCount: 100000) 4.75 ms 82.66 μs 4.85 ms -2.2%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.58 μs 42.1 ns 4.55 μs +0.9%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 5.3 ns 4.45 μs +2.0%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 1000) 8.43 μs 6.8 ns 8.43 μs +0.0%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 1000) 2.37 μs 6.6 ns 2.37 μs -0.2%
CuckooFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.99 ms 65.45 μs 1.90 ms +4.9%
SwissSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 2.00 ms 67.66 μs 1.93 ms +3.7%
CuckooFilterBenchmark.CuckooFilter_ContainsMissing(ItemCount: 100000) 876.08 μs 1.94 μs 877.06 μs -0.1%
SwissSetBenchmark.SwissSet_ContainsMissing(ItemCount: 100000) 348.23 μs 4.67 μs 340.74 μs +2.2%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 1000) 18.71 μs 227.8 ns 18.73 μs -0.1%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 26.68 μs 106.1 ns 26.93 μs -0.9%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 1000) 7.68 μs 369.4 ns 7.33 μs +4.8%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 1000) 87.03 μs 2.90 μs 87.64 μs -0.7%
StringKeyProbeBenchmark.Dictionary_Lookup(ItemCount: 100000) 3.55 ms 21.51 μs 3.46 ms +2.6%
StringKeyProbeBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 5.13 ms 46.15 μs 5.34 ms -3.8%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_Lookup(ItemCount: 100000) 1.98 ms 21.80 μs 2.03 ms -2.2%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_Lookup(ItemCount: 100000) 7.60 ms 27.58 μs 8.08 ms -6.0%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 1000) 14.92 μs 40.8 ns 14.88 μs +0.3%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 1000) 28.50 μs 438.2 ns 28.24 μs +0.9%
StringKeyProbeBenchmark.Dictionary_LookupMissing(ItemCount: 100000) 3.91 ms 12.57 μs 3.91 ms +0.1%
StringKeyProbeBenchmark.CelerityDictionary_LookupMissing(ItemCount: 100000) 5.38 ms 247.66 μs 5.87 ms -8.4%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 1000) 181.80 μs 383.3 ns 181.99 μs -0.1%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 1000) 11.02 μs 42.8 ns 11.30 μs -2.4%
FenwickTreeBenchmark.Array_Mixed(ItemCount: 100000) 166.92 ms 955.95 μs 167.09 ms -0.1%
FenwickTreeBenchmark.FenwickTree_Mixed(ItemCount: 100000) 628.15 μs 13.08 μs 630.98 μs -0.4%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 1000) 220.84 μs 157.1 ns 220.93 μs -0.0%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 1000) 7.46 μs 6.0 ns 7.45 μs +0.1%
FenwickTreeBenchmark.Array_RangeSum(ItemCount: 100000) 201.77 ms 20.55 ms 210.66 ms -4.2%
FenwickTreeBenchmark.FenwickTree_RangeSum(ItemCount: 100000) 325.44 μs 1.30 μs 341.46 μs -4.7%
LongSetBenchmark.HashSet_Remove(ItemCount: 1000) 75.67 μs 5.03 μs 83.05 μs -8.9%
LongSetBenchmark.LongSet_Remove(ItemCount: 1000) 87.97 μs 8.27 μs 84.55 μs +4.1%
SwissSetBenchmark.HashSet_Remove(ItemCount: 1000) 26.91 μs 1.20 μs 31.00 μs -13.2% ✅
SwissSetBenchmark.SwissSet_Remove(ItemCount: 1000) 75.69 μs 8.75 μs 73.70 μs +2.7%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 1000) 13.13 μs 136.0 ns 13.42 μs -2.2%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 1000) 12.90 μs 74.6 ns 13.08 μs -1.4%
LongSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.96 ms 16.84 μs 1.97 ms -0.4%
LongSetBenchmark.LongSet_Remove(ItemCount: 100000) 1.42 ms 14.90 μs 1.43 ms -0.5%
SwissSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.71 ms 19.05 μs 1.71 ms -0.0%
SwissSetBenchmark.SwissSet_Remove(ItemCount: 100000) 1.06 ms 6.77 μs 1.07 ms -0.9%
CuckooFilterBenchmark.HashSet_Remove(ItemCount: 100000) 3.87 ms 83.80 μs 3.91 ms -1.0%
CuckooFilterBenchmark.CuckooFilter_Remove(ItemCount: 100000) 3.96 ms 21.52 μs 4.00 ms -0.8%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_SpanLookup(ItemCount: 1000) 30.33 μs 428.2 ns 32.30 μs -6.1%
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_SpanLookup(ItemCount: 1000) 91.34 μs 202.8 ns 91.21 μs +0.1%
FrozenCelerityDictionaryBenchmark.FrozenDictionary_SpanLookup(ItemCount: 100000) 5.75 ms 14.06 μs 6.34 ms -9.3% ✅
FrozenCelerityDictionaryBenchmark.FrozenCelerityDictionary_SpanLookup(ItemCount: 100000) 8.46 ms 75.64 μs 8.84 ms -4.3%
EnumMapBenchmark.Dictionary_Add 583.7 ns 3.8 ns 478.1 ns +22.1% ⚠️
EnumSetBenchmark.HashSet_Add 548.7 ns 3.3 ns 445.5 ns +23.2% ⚠️
EnumMapBenchmark.EnumMap_Add 148.7 ns 0.5 ns 84.6 ns +75.8% ⚠️
EnumSetBenchmark.EnumSet_Add 84.0 ns 0.3 ns 64.0 ns +31.3% ⚠️
SmallSetBenchmark.HashSet_Add(ItemCount: 8) 158.4 ns 0.9 ns 130.6 ns +21.3% ⚠️
SmallSetBenchmark.SmallSet_Add(ItemCount: 8) 44.9 ns 0.5 ns 40.9 ns +9.6%
SmallSetBenchmark.HashSet_Add(ItemCount: 64) 725.5 ns 4.1 ns 596.2 ns +21.7% ⚠️
SmallSetBenchmark.SmallSet_Add(ItemCount: 64) 1.66 μs 8.0 ns 1.50 μs +10.3%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 1000) 12.07 μs 172.8 ns 13.17 μs -8.3%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 1000) 17.17 μs 46.4 ns 17.46 μs -1.6%
RobinHoodSetBenchmark.HashSet_Add(ItemCount: 100000) 4.47 ms 482.82 μs 4.39 ms +1.8%
RobinHoodSetBenchmark.RobinHoodSet_Add(ItemCount: 100000) 6.24 ms 53.32 μs 6.41 ms -2.6%
BitSetBenchmark.BitArray_And(ItemCount: 1024) 56.1 ns 1.8 ns 54.6 ns +2.8%
BitSetBenchmark.BitSet_And(ItemCount: 1024) 1.25 μs 4.0 ns 1.21 μs +3.1%
BitSetBenchmark.BitArray_And(ItemCount: 1000000) 43.66 μs 343.9 ns 44.41 μs -1.7%
BitSetBenchmark.BitSet_And(ItemCount: 1000000) 4.47 ms 2.75 μs 4.48 ms -0.1%
EnumSetBenchmark.HashSet_Contains 175.2 ns 0.2 ns 134.2 ns +30.5% ⚠️
EnumSetBenchmark.EnumSet_Contains 45.9 ns 0.1 ns 39.9 ns +15.1% ⚠️
SmallSetBenchmark.HashSet_Contains(ItemCount: 8) 37.4 ns 0.2 ns 29.7 ns +26.0% ⚠️
SmallSetBenchmark.SmallSet_Contains(ItemCount: 8) 18.9 ns 0.1 ns 15.2 ns +23.7% ⚠️
SmallSetBenchmark.HashSet_Contains(ItemCount: 64) 300.6 ns 1.3 ns 234.2 ns +28.3% ⚠️
SmallSetBenchmark.SmallSet_Contains(ItemCount: 64) 1.09 μs 12.0 ns 721.6 ns +51.6% ⚠️
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.77 μs 25.2 ns 4.72 μs +1.0%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 1000) 2.50 μs 9.8 ns 2.50 μs +0.2%
RobinHoodSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.54 ms 48.90 μs 1.58 ms -2.7%
RobinHoodSetBenchmark.RobinHoodSet_Contains(ItemCount: 100000) 744.99 μs 1.45 μs 755.15 μs -1.3%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.54 μs 6.2 ns 4.54 μs +0.0%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 1000) 2.74 μs 2.2 ns 2.74 μs +0.0%
RobinHoodSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.93 ms 3.28 μs 1.97 ms -1.7%
RobinHoodSetBenchmark.RobinHoodSet_ContainsMissing(ItemCount: 100000) 1.18 ms 2.37 μs 1.19 ms -0.9%
EnumMapBenchmark.Dictionary_Enumerate 50.4 ns 0.2 ns 33.4 ns +50.7% ⚠️
EnumMapBenchmark.EnumMap_Enumerate 41.7 ns 1.9 ns 29.6 ns +40.9% ⚠️
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 1000) 29.20 μs 272.3 ns 20.66 μs +41.3% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 1000) 37.53 μs 493.1 ns 30.02 μs +25.0% ⚠️
CelerityMultiMapBenchmark.Dictionary_Insert(ItemCount: 100000) 12.42 ms 791.94 μs 10.10 ms +22.9% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Insert(ItemCount: 100000) 17.20 ms 119.28 μs 14.80 ms +16.3% ⚠️
EnumMapBenchmark.Dictionary_Lookup 118.0 ns 0.2 ns 105.3 ns +12.0% ⚠️
EnumMapBenchmark.EnumMap_Lookup 64.1 ns 0.1 ns 54.6 ns +17.2% ⚠️
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 1000) 5.01 μs 32.1 ns 4.07 μs +23.2% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 1000) 2.36 μs 2.6 ns 1.99 μs +18.1% ⚠️
CelerityMultiMapBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.75 ms 2.06 μs 1.37 ms +27.3% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Lookup(ItemCount: 100000) 735.96 μs 5.84 μs 597.57 μs +23.2% ⚠️
BitSetBenchmark.BitArray_Or(ItemCount: 1024) 54.6 ns 0.4 ns 54.2 ns +0.7%
BitSetBenchmark.BitSet_Or(ItemCount: 1024) 1.25 μs 6.1 ns 1.21 μs +2.8%
BitSetBenchmark.BitArray_Or(ItemCount: 1000000) 43.73 μs 369.0 ns 44.55 μs -1.8%
BitSetBenchmark.BitSet_Or(ItemCount: 1000000) 4.48 ms 2.56 μs 4.48 ms -0.0%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1024) 1.24 μs 3.3 ns 1.24 μs -0.0%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1024) 7.1 ns 0.0 ns 7.1 ns -0.2%
BitSetBenchmark.BitArray_PopCount(ItemCount: 1000000) 4.83 ms 2.84 μs 4.83 ms +0.0%
BitSetBenchmark.BitSet_PopCount(ItemCount: 1000000) 5.00 μs 42.9 ns 4.94 μs +1.3%
EnumMapBenchmark.Dictionary_Remove 3.28 μs 131.1 ns 1.98 μs +65.5% ⚠️
EnumSetBenchmark.HashSet_Remove 3.82 μs 359.6 ns 2.13 μs +79.5% ⚠️
EnumMapBenchmark.EnumMap_Remove 1.47 μs 61.4 ns 954.1 ns +53.7% ⚠️
EnumSetBenchmark.EnumSet_Remove 1.21 μs 209.9 ns 1.01 μs +20.1%
SmallSetBenchmark.HashSet_Remove(ItemCount: 8) 435.9 ns 33.5 ns 340.7 ns +27.9%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 8) 1.20 μs 59.2 ns 890.0 ns +34.8% ⚠️
SmallSetBenchmark.HashSet_Remove(ItemCount: 64) 1.49 μs 353.4 ns 1.08 μs +38.7%
SmallSetBenchmark.SmallSet_Remove(ItemCount: 64) 26.76 μs 4.43 μs 17.87 μs +49.7% ⚠️
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 1000) 35.50 μs 2.35 μs 20.70 μs +71.5% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 1000) 120.57 μs 8.63 μs 94.00 μs +28.3% ⚠️
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 1000) 26.12 μs 1.40 μs 30.57 μs -14.5%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 1000) 109.99 μs 8.40 μs 117.74 μs -6.6%
CelerityMultiMapBenchmark.Dictionary_Remove(ItemCount: 100000) 1.95 ms 131.46 μs 1.59 ms +22.6% ⚠️
CelerityMultiMapBenchmark.CelerityMultiMap_Remove(ItemCount: 100000) 1.73 ms 80.51 μs 1.64 ms +5.3%
RobinHoodSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.71 ms 16.86 μs 1.77 ms -3.2%
RobinHoodSetBenchmark.RobinHoodSet_Remove(ItemCount: 100000) 1.38 ms 43.07 μs 1.57 ms -12.4%
EnumSetBenchmark.HashSet_Union 402.8 ns 3.4 ns 319.8 ns +26.0% ⚠️
EnumSetBenchmark.EnumSet_Union 21.3 ns 0.1 ns 18.5 ns +14.8% ⚠️
BitSetBenchmark.BitArray_Xor(ItemCount: 1024) 54.7 ns 0.2 ns 54.6 ns +0.3%
BitSetBenchmark.BitSet_Xor(ItemCount: 1024) 1.23 μs 22.3 ns 1.18 μs +4.3%
BitSetBenchmark.BitArray_Xor(ItemCount: 1000000) 43.97 μs 364.6 ns 44.28 μs -0.7%
BitSetBenchmark.BitSet_Xor(ItemCount: 1000000) 4.47 ms 2.12 μs 4.48 ms -0.1%
TrieBenchmark.Dictionary_Add(ItemCount: 1000) 43.40 μs 7.10 μs 34.60 μs +25.4%
TrieBenchmark.Trie_Add(ItemCount: 1000) 540.68 μs 20.00 μs 396.98 μs +36.2% ⚠️
BloomFilterBenchmark.HashSet_Add(ItemCount: 1000) 12.77 μs 356.2 ns 13.30 μs -4.0%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 1000) 13.13 μs 426.4 ns 12.49 μs +5.1%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 1000) 12.83 μs 460.3 ns 13.33 μs -3.8%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 1000) 14.50 μs 20.5 ns 14.51 μs -0.0%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 1000) 11.67 μs 265.1 ns 11.49 μs +1.6%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 1000) 27.49 μs 85.4 ns 27.38 μs +0.4%
TrieBenchmark.Dictionary_Add(ItemCount: 100000) 5.39 ms 1.44 ms 4.39 ms +22.7%
TrieBenchmark.Trie_Add(ItemCount: 100000) 26.78 ms 611.99 μs 22.69 ms +18.0% ⚠️
BloomFilterBenchmark.HashSet_Add(ItemCount: 100000) 4.78 ms 179.93 μs 4.76 ms +0.3%
HashCachingSetBenchmark.HashSet_Add(ItemCount: 100000) 4.48 ms 446.01 μs 4.30 ms +4.0%
HyperLogLogBenchmark.HashSet_Add(ItemCount: 100000) 4.87 ms 65.83 μs 4.86 ms +0.2%
BloomFilterBenchmark.BloomFilter_Add(ItemCount: 100000) 1.10 ms 6.61 μs 1.10 ms +0.7%
HashCachingSetBenchmark.HashCachingSet_Add(ItemCount: 100000) 5.37 ms 74.42 μs 5.18 ms +3.5%
HyperLogLogBenchmark.HyperLogLog_Add(ItemCount: 100000) 576.05 μs 1.83 μs 575.85 μs +0.0%
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 1000) 170.77 μs 2.65 μs 168.46 μs +1.4%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 1000) 2.52 ms 242.38 μs 3.33 ms -24.2% ✅
FrozenCeleritySetBenchmark.FrozenSet_Build(ItemCount: 100000) 30.39 ms 410.00 μs 30.08 ms +1.0%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Build(ItemCount: 100000) 1.54 s 85.06 ms 1.65 s -6.7%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.73 μs 6.9 ns 4.75 μs -0.4%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 1000) 6.91 μs 11.5 ns 6.88 μs +0.4%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.72 μs 6.0 ns 4.98 μs -5.3%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 1000) 12.52 μs 3.1 ns 12.52 μs +0.0%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 1000) 89.36 μs 1.14 μs 92.35 μs -3.2%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 1000) 2.52 μs 15.4 ns 2.53 μs -0.5%
BloomFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.58 ms 5.99 μs 1.60 ms -1.5%
FrozenCeleritySetBenchmark.FrozenSet_Contains(ItemCount: 100000) 2.06 ms 49.18 μs 2.01 ms +2.6%
HashCachingSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.58 ms 9.92 μs 1.56 ms +0.7%
BloomFilterBenchmark.BloomFilter_Contains(ItemCount: 100000) 869.15 μs 261.2 ns 869.15 μs +0.0%
FrozenCeleritySetBenchmark.FrozenCeleritySet_Contains(ItemCount: 100000) 7.92 ms 434.10 μs 7.45 ms +6.3%
HashCachingSetBenchmark.HashCachingSet_Contains(ItemCount: 100000) 729.79 μs 2.21 μs 733.41 μs -0.5%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.57 μs 28.9 ns 4.55 μs +0.4%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.55 μs 6.8 ns 4.54 μs +0.2%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 1000) 3.53 μs 10.3 ns 3.53 μs +0.0%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 1000) 3.12 μs 153.0 ns 2.95 μs +5.6%
BloomFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.95 ms 9.85 μs 1.96 ms -0.9%
HashCachingSetBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.94 ms 8.15 μs 1.94 ms +0.1%
BloomFilterBenchmark.BloomFilter_ContainsMissing(ItemCount: 100000) 1.49 ms 874.2 ns 1.49 ms +0.0%
HashCachingSetBenchmark.HashCachingSet_ContainsMissing(ItemCount: 100000) 1.13 ms 2.45 μs 1.13 ms +0.6%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 1000) 10.25 μs 158.1 ns 10.31 μs -0.5%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 1000) 5.41 μs 39.6 ns 5.43 μs -0.4%
CelerityMultiSetBenchmark.Dictionary_Count(ItemCount: 100000) 1.49 ms 19.89 μs 1.51 ms -1.0%
CelerityMultiSetBenchmark.CelerityMultiSet_Count(ItemCount: 100000) 737.40 μs 6.56 μs 754.98 μs -2.3%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 1000) 0.0 ns 0.0 ns 0.0 ns +193.4%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 1000) 23.45 μs 15.1 ns 23.45 μs +0.0%
HyperLogLogBenchmark.HashSet_Estimate(ItemCount: 100000) 0.0 ns 0.0 ns 0.0 ns -38.1%
HyperLogLogBenchmark.HyperLogLog_Estimate(ItemCount: 100000) 22.99 μs 21.6 ns 22.98 μs +0.0%
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.69 μs 3.0 ns 4.54 μs +3.1%
TrieBenchmark.Dictionary_Lookup(ItemCount: 1000) 13.24 μs 552.1 ns 9.73 μs +36.0% ⚠️
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 1000) 1.72 μs 2.0 ns 1.72 μs +0.0%
TrieBenchmark.Trie_Lookup(ItemCount: 1000) 40.96 μs 253.1 ns 35.05 μs +16.8% ⚠️
CelerityMultiSetBenchmark.Dictionary_Lookup(ItemCount: 100000) 633.54 μs 1.32 μs 645.34 μs -1.8%
TrieBenchmark.Dictionary_Lookup(ItemCount: 100000) 2.70 ms 11.89 μs 2.15 ms +25.5% ⚠️
CelerityMultiSetBenchmark.CelerityMultiSet_Lookup(ItemCount: 100000) 190.91 μs 376.5 ns 191.49 μs -0.3%
TrieBenchmark.Trie_Lookup(ItemCount: 100000) 8.94 ms 200.06 μs 7.99 ms +11.8% ⚠️
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 1000) 73.48 μs 247.5 ns 62.01 μs +18.5% ⚠️
TrieBenchmark.Trie_PrefixMatch(ItemCount: 1000) 57.86 μs 489.9 ns 44.04 μs +31.4% ⚠️
TrieBenchmark.Dictionary_PrefixMatch(ItemCount: 100000) 7.39 ms 16.05 μs 6.25 ms +18.2% ⚠️
TrieBenchmark.Trie_PrefixMatch(ItemCount: 100000) 8.09 ms 545.44 μs 5.62 ms +43.9% ⚠️
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 1000) 53.80 μs 6.59 μs 56.25 μs -4.4%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 1000) 79.56 μs 3.77 μs 89.43 μs -11.0%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 1000) 26.69 μs 1.23 μs 31.03 μs -14.0%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 1000) 120.07 μs 2.17 μs 120.12 μs -0.0%
CelerityMultiSetBenchmark.Dictionary_Remove(ItemCount: 100000) 548.24 μs 12.02 μs 548.07 μs +0.0%
CelerityMultiSetBenchmark.CelerityMultiSet_Remove(ItemCount: 100000) 1.28 ms 15.02 μs 1.29 ms -1.1%
HashCachingSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.73 ms 23.90 μs 1.73 ms +0.1%
HashCachingSetBenchmark.HashCachingSet_Remove(ItemCount: 100000) 1.53 ms 70.92 μs 1.51 ms +1.2%
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 1000) 41.17 μs 378.4 ns 30.62 μs +34.4% ⚠️
TrieBenchmark.Trie_SpanLookup(ItemCount: 1000) 43.33 μs 317.3 ns 35.99 μs +20.4% ⚠️
TrieBenchmark.Dictionary_SpanLookup(ItemCount: 100000) 5.94 ms 229.77 μs 4.96 ms +19.8% ⚠️
TrieBenchmark.Trie_SpanLookup(ItemCount: 100000) 8.82 ms 197.35 μs 7.48 ms +18.0% ⚠️
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 1000) 10.47 μs 23.8 ns 10.29 μs +1.7%
SparseSetBenchmark.HashSet_Add(ItemCount: 1000) 7.05 μs 242.4 ns 6.68 μs +5.5%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 1000) 10.66 μs 39.5 ns 10.34 μs +3.1%
SparseSetBenchmark.SparseSet_Add(ItemCount: 1000) 6.18 μs 50.2 ns 5.87 μs +5.3%
CountMinSketchBenchmark.Dictionary_Add(ItemCount: 100000) 1.42 ms 4.33 μs 1.43 ms -0.5%
SparseSetBenchmark.HashSet_Add(ItemCount: 100000) 1.73 ms 43.21 μs 1.68 ms +2.9%
CountMinSketchBenchmark.CountMinSketch_Add(ItemCount: 100000) 961.52 μs 822.7 ns 962.27 μs -0.1%
SparseSetBenchmark.SparseSet_Add(ItemCount: 100000) 1.48 ms 70.41 μs 1.39 ms +6.8%
XorFilterBenchmark.HashSet_Build(ItemCount: 1000) 8.06 μs 38.4 ns 7.89 μs +2.2%
XorFilterBenchmark.XorFilter_Build(ItemCount: 1000) 39.78 μs 295.9 ns 39.76 μs +0.0%
XorFilterBenchmark.HashSet_Build(ItemCount: 100000) 2.08 ms 30.48 μs 2.07 ms +0.5%
XorFilterBenchmark.XorFilter_Build(ItemCount: 100000) 12.59 ms 256.24 μs 12.52 ms +0.6%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 1000) 5.91 μs 17.9 ns 7.27 μs -18.7% ✅
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 1000) 4.64 μs 42.8 ns 4.62 μs +0.4%
SparseSetBenchmark.HashSet_ClearRefill(ItemCount: 100000) 1.37 ms 7.45 μs 1.36 ms +1.3%
SparseSetBenchmark.SparseSet_ClearRefill(ItemCount: 100000) 649.41 μs 8.78 μs 642.73 μs +1.0%
SparseSetBenchmark.HashSet_Contains(ItemCount: 1000) 4.66 μs 26.6 ns 4.65 μs +0.3%
XorFilterBenchmark.HashSet_Contains(ItemCount: 1000) 4.75 μs 37.4 ns 4.95 μs -4.0%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 1000) 1.29 μs 1.8 ns 1.29 μs +0.1%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 1000) 6.77 μs 10.9 ns 6.77 μs +0.0%
SparseSetBenchmark.HashSet_Contains(ItemCount: 100000) 1.36 ms 2.17 μs 1.35 ms +0.8%
XorFilterBenchmark.HashSet_Contains(ItemCount: 100000) 1.57 ms 1.75 μs 1.59 ms -1.2%
SparseSetBenchmark.SparseSet_Contains(ItemCount: 100000) 259.48 μs 2.24 μs 253.90 μs +2.2%
XorFilterBenchmark.XorFilter_Contains(ItemCount: 100000) 703.75 μs 647.3 ns 704.46 μs -0.1%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 1000) 4.55 μs 7.0 ns 4.57 μs -0.5%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 1000) 6.78 μs 8.4 ns 6.78 μs -0.0%
XorFilterBenchmark.HashSet_ContainsMissing(ItemCount: 100000) 1.93 ms 12.07 μs 1.94 ms -0.3%
XorFilterBenchmark.XorFilter_ContainsMissing(ItemCount: 100000) 705.81 μs 796.6 ns 705.50 μs +0.0%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 1000) 4.37 μs 3.0 ns 4.38 μs -0.1%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 1000) 10.06 μs 13.5 ns 9.75 μs +3.2%
CountMinSketchBenchmark.Dictionary_Estimate(ItemCount: 100000) 506.60 μs 12.64 μs 488.61 μs +3.7%
CountMinSketchBenchmark.CountMinSketch_Estimate(ItemCount: 100000) 1.97 ms 2.78 μs 1.97 ms +0.0%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 8) 171.1 ns 1.4 ns 174.5 ns -1.9%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 8) 88.7 ns 0.4 ns 91.3 ns -2.8%
SmallDictionaryBenchmark.Dictionary_Insert(ItemCount: 64) 897.1 ns 93.5 ns 818.7 ns +9.6%
SmallDictionaryBenchmark.SmallDictionary_Insert(ItemCount: 64) 1.06 μs 3.5 ns 1.09 μs -2.6%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 13.96 μs 186.2 ns 13.71 μs +1.8%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 1000) 14.02 μs 374.5 ns 13.50 μs +3.9%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 1000) 11.98 μs 56.2 ns 11.84 μs +1.1%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 1000) 11.82 μs 94.3 ns 11.91 μs -0.7%
CelerityDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.16 ms 76.19 μs 4.10 ms +1.6%
HashCachingDictionaryBenchmark.Dictionary_Insert(ItemCount: 100000) 4.71 ms 51.59 μs 4.69 ms +0.5%
CelerityDictionaryBenchmark.CelerityDictionary_Insert(ItemCount: 100000) 4.85 ms 38.97 μs 4.84 ms +0.2%
HashCachingDictionaryBenchmark.HashCachingDictionary_Insert(ItemCount: 100000) 6.58 ms 207.61 μs 6.63 ms -0.8%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 8) 36.9 ns 0.1 ns 37.1 ns -0.6%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 8) 23.2 ns 0.1 ns 22.4 ns +3.8%
SmallDictionaryBenchmark.Dictionary_Lookup(ItemCount: 64) 296.8 ns 0.1 ns 296.0 ns +0.3%
SmallDictionaryBenchmark.SmallDictionary_Lookup(ItemCount: 64) 1.12 μs 12.0 ns 1.10 μs +1.5%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.70 μs 18.3 ns 4.72 μs -0.4%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 1000) 4.73 μs 13.6 ns 4.73 μs +0.0%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 1000) 2.48 μs 13.2 ns 2.48 μs +0.2%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 1000) 2.74 μs 39.9 ns 2.68 μs +2.2%
CelerityDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.60 ms 5.09 μs 1.54 ms +4.5%
HashCachingDictionaryBenchmark.Dictionary_Lookup(ItemCount: 100000) 1.60 ms 2.06 μs 1.60 ms +0.2%
CelerityDictionaryBenchmark.CelerityDictionary_Lookup(ItemCount: 100000) 738.04 μs 5.11 μs 732.65 μs +0.7%
HashCachingDictionaryBenchmark.HashCachingDictionary_Lookup(ItemCount: 100000) 819.15 μs 4.67 μs 823.41 μs -0.5%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 8) 1.66 μs 202.1 ns 1.32 μs +25.4% ⚠️
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 8) 1.58 μs 256.7 ns 1.56 μs +1.2%
SmallDictionaryBenchmark.Dictionary_Remove(ItemCount: 64) 4.88 μs 230.2 ns 4.90 μs -0.3%
SmallDictionaryBenchmark.SmallDictionary_Remove(ItemCount: 64) 24.94 μs 4.75 μs 25.51 μs -2.2%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 89.44 μs 9.91 μs 83.71 μs +6.8%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 1000) 80.64 μs 6.62 μs 81.27 μs -0.8%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 1000) 125.53 μs 8.44 μs 131.32 μs -4.4%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 1000) 118.54 μs 3.06 μs 121.83 μs -2.7%
SparseSetBenchmark.HashSet_Remove(ItemCount: 1000) 25.88 μs 2.20 μs 29.63 μs -12.7%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 1000) 22.97 μs 2.23 μs 24.20 μs -5.1%
CelerityDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.04 ms 13.93 μs 2.04 ms -0.2%
HashCachingDictionaryBenchmark.Dictionary_Remove(ItemCount: 100000) 2.05 ms 15.77 μs 2.08 ms -1.8%
CelerityDictionaryBenchmark.CelerityDictionary_Remove(ItemCount: 100000) 1.65 ms 80.42 μs 1.58 ms +4.4%
HashCachingDictionaryBenchmark.HashCachingDictionary_Remove(ItemCount: 100000) 1.77 ms 46.15 μs 1.90 ms -6.9%
SparseSetBenchmark.HashSet_Remove(ItemCount: 100000) 1.49 ms 15.51 μs 1.48 ms +1.0%
SparseSetBenchmark.SparseSet_Remove(ItemCount: 100000) 808.24 μs 15.68 μs 785.73 μs +2.9%
Hashers (111)
Benchmark This PR StdDev main Δ
StringHasherBenchmark.Bcl_GetHashCode(Shape: ShortAscii) 15.42 μs 29.0 ns 15.39 μs +0.2%
StringHasherBenchmark.EqualityComparer_Default(Shape: ShortAscii) 15.37 μs 12.9 ns 15.39 μs -0.1%
StringHasherBenchmark.Djb2(Shape: ShortAscii) 22.73 μs 53.5 ns 22.73 μs +0.0%
StringHasherBenchmark.Djb2A(Shape: ShortAscii) 22.74 μs 23.6 ns 22.73 μs +0.0%
StringHasherBenchmark.Sdbm(Shape: ShortAscii) 33.15 μs 48.1 ns 33.11 μs +0.1%
StringHasherBenchmark.Elf(Shape: ShortAscii) 45.65 μs 739.0 ns 44.80 μs +1.9%
StringHasherBenchmark.Crc32(Shape: ShortAscii) 50.55 μs 36.6 ns 50.52 μs +0.1%
StringHasherBenchmark.Adler32(Shape: ShortAscii) 96.48 μs 78.2 ns 96.47 μs +0.0%
StringHasherBenchmark.FnV1(Shape: ShortAscii) 27.14 μs 31.0 ns 27.13 μs +0.0%
StringHasherBenchmark.FnV1_64(Shape: ShortAscii) 25.81 μs 26.9 ns 25.84 μs -0.1%
StringHasherBenchmark.FnV1A(Shape: ShortAscii) 11.08 μs 31.4 ns 11.07 μs +0.2%
StringHasherBenchmark.FnV1A_Full(Shape: ShortAscii) 25.85 μs 18.4 ns 25.85 μs -0.0%
StringHasherBenchmark.FnV1A_64(Shape: ShortAscii) 27.87 μs 21.5 ns 27.88 μs -0.0%
StringHasherBenchmark.JenkinsOaat(Shape: ShortAscii) 39.52 μs 15.5 ns 39.51 μs +0.0%
StringHasherBenchmark.Murmur2(Shape: ShortAscii) 15.41 μs 33.6 ns 15.41 μs -0.0%
StringHasherBenchmark.Murmur3(Shape: ShortAscii) 17.16 μs 29.8 ns 17.18 μs -0.1%
StringHasherBenchmark.XxHash32(Shape: ShortAscii) 16.90 μs 19.8 ns 16.90 μs +0.0%
StringHasherBenchmark.XxHash64(Shape: ShortAscii) 18.38 μs 18.9 ns 18.37 μs +0.0%
StringHasherBenchmark.XxHash3(Shape: ShortAscii) 15.46 μs 27.1 ns 15.53 μs -0.4%
StringHasherBenchmark.CityHash64(Shape: ShortAscii) 15.56 μs 8.9 ns 15.56 μs -0.1%
StringHasherBenchmark.MetroHash64(Shape: ShortAscii) 15.45 μs 16.0 ns 15.45 μs +0.0%
StringHasherBenchmark.SipHash13(Shape: ShortAscii) 27.63 μs 18.8 ns 27.62 μs +0.0%
StringHasherBenchmark.SipHash24(Shape: ShortAscii) 37.91 μs 27.4 ns 37.91 μs +0.0%
StringHasherBenchmark.HalfSipHash24(Shape: ShortAscii) 49.78 μs 115.3 ns 49.81 μs -0.1%
StringHasherBenchmark.HighwayHash64(Shape: ShortAscii) 441.44 μs 18.15 μs 449.71 μs -1.8%
StringHasherBenchmark.XxHash64_Hash64(Shape: ShortAscii) 17.35 μs 8.7 ns 17.35 μs +0.0%
StringHasherBenchmark.SipHash24_Hash64(Shape: ShortAscii) 37.86 μs 28.6 ns 37.85 μs +0.0%
StringHasherBenchmark.Bcl_GetHashCode(Shape: LongAscii) 96.87 μs 42.7 ns 96.84 μs +0.0%
StringHasherBenchmark.EqualityComparer_Default(Shape: LongAscii) 96.58 μs 53.6 ns 96.59 μs -0.0%
StringHasherBenchmark.Djb2(Shape: LongAscii) 223.78 μs 204.7 ns 223.75 μs +0.0%
StringHasherBenchmark.Djb2A(Shape: LongAscii) 223.82 μs 45.2 ns 223.71 μs +0.0%
StringHasherBenchmark.Sdbm(Shape: LongAscii) 308.18 μs 92.1 ns 308.11 μs +0.0%
StringHasherBenchmark.Elf(Shape: LongAscii) 578.73 μs 276.4 ns 578.51 μs +0.0%
StringHasherBenchmark.Crc32(Shape: LongAscii) 591.14 μs 195.3 ns 590.92 μs +0.0%
StringHasherBenchmark.Adler32(Shape: LongAscii) 786.62 μs 320.8 ns 786.75 μs -0.0%
StringHasherBenchmark.FnV1(Shape: LongAscii) 289.10 μs 76.1 ns 289.08 μs +0.0%
StringHasherBenchmark.FnV1_64(Shape: LongAscii) 282.95 μs 146.9 ns 283.01 μs -0.0%
StringHasherBenchmark.FnV1A(Shape: LongAscii) 122.91 μs 49.1 ns 123.07 μs -0.1%
StringHasherBenchmark.FnV1A_Full(Shape: LongAscii) 282.38 μs 116.9 ns 282.40 μs -0.0%
StringHasherBenchmark.FnV1A_64(Shape: LongAscii) 286.83 μs 140.1 ns 286.74 μs +0.0%
StringHasherBenchmark.JenkinsOaat(Shape: LongAscii) 378.51 μs 177.9 ns 378.54 μs -0.0%
StringHasherBenchmark.Murmur2(Shape: LongAscii) 102.19 μs 737.1 ns 101.65 μs +0.5%
StringHasherBenchmark.Murmur3(Shape: LongAscii) 115.82 μs 260.0 ns 115.73 μs +0.1%
StringHasherBenchmark.XxHash32(Shape: LongAscii) 73.59 μs 103.7 ns 73.55 μs +0.1%
StringHasherBenchmark.XxHash64(Shape: LongAscii) 94.83 μs 984.9 ns 94.61 μs +0.2%
StringHasherBenchmark.XxHash3(Shape: LongAscii) 81.80 μs 106.0 ns 84.04 μs -2.7%
StringHasherBenchmark.CityHash64(Shape: LongAscii) 123.72 μs 1.14 μs 123.97 μs -0.2%
StringHasherBenchmark.MetroHash64(Shape: LongAscii) 74.84 μs 302.7 ns 74.65 μs +0.2%
StringHasherBenchmark.SipHash13(Shape: LongAscii) 117.18 μs 109.5 ns 117.09 μs +0.1%
StringHasherBenchmark.SipHash24(Shape: LongAscii) 162.41 μs 557.4 ns 162.08 μs +0.2%
StringHasherBenchmark.HalfSipHash24(Shape: LongAscii) 250.83 μs 272.5 ns 250.99 μs -0.1%
StringHasherBenchmark.HighwayHash64(Shape: LongAscii) 848.57 μs 5.92 μs 846.73 μs +0.2%
StringHasherBenchmark.XxHash64_Hash64(Shape: LongAscii) 87.19 μs 676.6 ns 87.40 μs -0.2%
StringHasherBenchmark.SipHash24_Hash64(Shape: LongAscii) 162.31 μs 307.2 ns 162.35 μs -0.0%
StringHasherBenchmark.Bcl_GetHashCode(Shape: NonAscii) 22.89 μs 27.5 ns 22.87 μs +0.1%
StringHasherBenchmark.EqualityComparer_Default(Shape: NonAscii) 23.49 μs 653.8 ns 22.84 μs +2.9%
StringHasherBenchmark.Djb2(Shape: NonAscii) 43.07 μs 46.3 ns 43.04 μs +0.1%
StringHasherBenchmark.Djb2A(Shape: NonAscii) 43.07 μs 27.5 ns 43.05 μs +0.0%
StringHasherBenchmark.Sdbm(Shape: NonAscii) 61.63 μs 24.9 ns 61.61 μs +0.0%
StringHasherBenchmark.Elf(Shape: NonAscii) 100.16 μs 139.1 ns 100.21 μs -0.1%
StringHasherBenchmark.Crc32(Shape: NonAscii) 103.57 μs 51.1 ns 103.56 μs +0.0%
StringHasherBenchmark.Adler32(Shape: NonAscii) 174.48 μs 83.4 ns 174.48 μs +0.0%
StringHasherBenchmark.FnV1(Shape: NonAscii) 48.43 μs 63.1 ns 48.45 μs -0.0%
StringHasherBenchmark.FnV1_64(Shape: NonAscii) 50.26 μs 100.9 ns 50.24 μs +0.0%
StringHasherBenchmark.FnV1A(Shape: NonAscii) 22.04 μs 82.6 ns 21.99 μs +0.2%
StringHasherBenchmark.FnV1A_Full(Shape: NonAscii) 46.11 μs 42.8 ns 46.11 μs -0.0%
StringHasherBenchmark.FnV1A_64(Shape: NonAscii) 50.06 μs 83.3 ns 50.06 μs +0.0%
StringHasherBenchmark.JenkinsOaat(Shape: NonAscii) 73.37 μs 119.3 ns 73.34 μs +0.0%
StringHasherBenchmark.Murmur2(Shape: NonAscii) 26.98 μs 200.8 ns 27.06 μs -0.3%
StringHasherBenchmark.Murmur3(Shape: NonAscii) 31.68 μs 145.1 ns 31.64 μs +0.1%
StringHasherBenchmark.XxHash32(Shape: NonAscii) 23.89 μs 21.1 ns 23.89 μs -0.0%
StringHasherBenchmark.XxHash64(Shape: NonAscii) 30.05 μs 21.0 ns 30.07 μs -0.1%
StringHasherBenchmark.XxHash3(Shape: NonAscii) 23.58 μs 222.8 ns 23.26 μs +1.4%
StringHasherBenchmark.CityHash64(Shape: NonAscii) 22.26 μs 35.5 ns 22.29 μs -0.1%
StringHasherBenchmark.MetroHash64(Shape: NonAscii) 25.87 μs 16.8 ns 25.88 μs -0.0%
StringHasherBenchmark.SipHash13(Shape: NonAscii) 37.95 μs 125.2 ns 37.91 μs +0.1%
StringHasherBenchmark.SipHash24(Shape: NonAscii) 50.09 μs 47.4 ns 50.08 μs +0.0%
StringHasherBenchmark.HalfSipHash24(Shape: NonAscii) 73.04 μs 1.46 μs 73.99 μs -1.3%
StringHasherBenchmark.HighwayHash64(Shape: NonAscii) 486.31 μs 11.72 μs 501.33 μs -3.0%
StringHasherBenchmark.XxHash64_Hash64(Shape: NonAscii) 29.02 μs 17.4 ns 28.96 μs +0.2%
StringHasherBenchmark.SipHash24_Hash64(Shape: NonAscii) 51.58 μs 467.3 ns 51.72 μs -0.3%
IntegerHasherBenchmark.Guid_Bcl 1.27 μs 2.3 ns 1.27 μs -0.5%
IntegerHasherBenchmark.Guid_EqualityComparer 3.50 μs 18.0 ns 3.49 μs +0.2%
IntegerHasherBenchmark.Guid_Celerity 8.53 μs 28.4 ns 8.50 μs +0.4%
IntegerHasherBenchmark.Guid_Celerity_Hash64 8.03 μs 15.3 ns 8.03 μs -0.0%
IntegerHasherBenchmark.Int32_Bcl 692.1 ns 9.8 ns 687.6 ns +0.7%
IntegerHasherBenchmark.Int32_EqualityComparer 700.0 ns 1.5 ns 700.8 ns -0.1%
IntegerHasherBenchmark.Int32_Identity 683.9 ns 1.0 ns 685.2 ns -0.2%
IntegerHasherBenchmark.Int32_WangNaive 1.25 μs 1.6 ns 1.25 μs -0.0%
IntegerHasherBenchmark.Int32_Wang 3.03 μs 21.5 ns 3.03 μs +0.1%
IntegerHasherBenchmark.Int32_Murmur3 2.65 μs 7.1 ns 2.66 μs -0.3%
IntegerHasherBenchmark.Int64_Bcl 1.27 μs 5.5 ns 1.27 μs +0.1%
IntegerHasherBenchmark.Int64_EqualityComparer 1.25 μs 6.7 ns 1.25 μs +0.1%
IntegerHasherBenchmark.Int64_Identity 685.4 ns 3.1 ns 685.0 ns +0.1%
IntegerHasherBenchmark.Int64_WangNaive 1.87 μs 4.9 ns 1.87 μs -0.0%
IntegerHasherBenchmark.Int64_Wang 4.17 μs 18.4 ns 4.16 μs +0.3%
IntegerHasherBenchmark.Int64_Murmur3 2.37 μs 4.0 ns 2.37 μs +0.0%
IntegerHasherBenchmark.Int64_Wang_Hash64 4.16 μs 2.8 ns 4.16 μs +0.0%
IntegerHasherBenchmark.Int64_Murmur3_Hash64 2.37 μs 3.0 ns 2.37 μs -0.0%
IntegerHasherBenchmark.UInt32_Bcl 685.2 ns 0.7 ns 694.1 ns -1.3%
IntegerHasherBenchmark.UInt32_EqualityComparer 699.7 ns 1.1 ns 710.8 ns -1.6%
IntegerHasherBenchmark.UInt32_Default 1.25 μs 1.5 ns 1.25 μs +0.1%
IntegerHasherBenchmark.UInt32_Wang 3.02 μs 3.4 ns 3.03 μs -0.0%
IntegerHasherBenchmark.UInt32_Murmur3 2.64 μs 1.5 ns 2.64 μs +0.0%
IntegerHasherBenchmark.UInt64_Bcl 1.37 μs 105.9 ns 1.27 μs +7.9%
IntegerHasherBenchmark.UInt64_EqualityComparer 1.25 μs 2.0 ns 1.25 μs +0.0%
IntegerHasherBenchmark.UInt64_Default 2.37 μs 4.7 ns 2.38 μs -0.3%
IntegerHasherBenchmark.UInt64_Wang 4.16 μs 8.9 ns 4.16 μs -0.0%
IntegerHasherBenchmark.UInt64_WangNaive 1.87 μs 2.9 ns 1.87 μs +0.0%
IntegerHasherBenchmark.UInt64_Default_Hash64 2.37 μs 3.3 ns 2.37 μs -0.0%
IntegerHasherBenchmark.UInt64_Wang_Hash64 4.18 μs 40.0 ns 4.16 μs +0.4%

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.

…-gates

Conflicts were all additive-vs-additive, kept both sides:

- .github/workflows/ci.yml — main's `dashboard-coverage` job (#301) and this
  branch's `release-gates` job landed in the same slot after `build-and-test`.
- CHANGELOG.md — main's two dashboard entries and this branch's two release-gate
  entries both appended to [Unreleased] > Fixed.
- ROADMAP.md — the pipeline-integrity list: three bullets flipped to `done` here,
  a fourth (the dashboard guard) added and flipped on main.

Package validation still passes against the 2.4.0 baseline: #311's new surface
(ISpanHashProvider, the span-keyed overloads, StringInternTable) is purely
additive, so the gate this branch introduces stays green on the merged tree.
Copilot AI review requested due to automatic review settings July 29, 2026 06:36
@marius-bughiu
marius-bughiu merged commit 2c13c49 into main Jul 29, 2026
17 of 18 checks passed
@marius-bughiu
marius-bughiu deleted the fix/issue-315-release-gates branch July 29, 2026 06:49

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.

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.

Release pipeline: nothing can fail after the NuGet push — add package validation and hoist the release-notes check

2 participants