Skip to content

test: canary for the flaky-benchmark fixes in #8742 (do not merge)#8743

Closed
connortsui20 wants to merge 1 commit into
claude/flaky-microbenchmarks-cleanup-u68he8from
claude/flaky-bench-canary-u68he8
Closed

test: canary for the flaky-benchmark fixes in #8742 (do not merge)#8743
connortsui20 wants to merge 1 commit into
claude/flaky-microbenchmarks-cleanup-u68he8from
claude/flaky-bench-canary-u68he8

Conversation

@connortsui20

@connortsui20 connortsui20 commented Jul 13, 2026

Copy link
Copy Markdown
Member

Rationale for this change

Validation canary for #8742served its purpose, closed without merging.

This PR stacked a deliberately layout-shifting, perf-irrelevant change (a cold-path error-string tweak in vortex-array, mimicking #8681 — a real PR that collected five false CodSpeed flags under glibc malloc) on top of the flaky-benchmark fixes, so CodSpeed would compare mimalloc-vs-mimalloc across different binaries — the comparison every future PR gets after #8742 merges.

Result: Performance Gate Passed ✅

✅ 1660 untouched benchmarks, ⏩ 47 skipped — zero regressed, zero improved, zero new, comparing claude/flaky-bench-canary-u68he8 (40c5e76) with claude/flaky-microbenchmarks-cleanup-u68he8 (4efeb0d). CodSpeed posts no comment when there are no changes to report; the green check is the report.

Together with the A/A rerun on #8742 (identical tree measured twice on separate runners: all values reproduced exactly), this validates the fixes from both directions.

https://claude.ai/code/session_01T6PPcdrqcNeUkfi1EGd4oC

Extends a cold-path error string in vortex-array, mimicking #8681 - a PR that
changed only this kind of string and still got five false CodSpeed flags under
glibc malloc. The change shifts the vortex-array bench binaries' layout
without touching any benchmarked code path, so this stacked PR's CodSpeed run
(compared against the flaky-microbenchmarks-cleanup branch) should report no
changes if the mimalloc fixes hold.

Signed-off-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T6PPcdrqcNeUkfi1EGd4oC
@connortsui20 connortsui20 added the changelog/skip Do not list PR in the changelog label Jul 13, 2026 — with Claude
@connortsui20 connortsui20 deleted the claude/flaky-bench-canary-u68he8 branch July 13, 2026 19:38
robert3005 pushed a commit that referenced this pull request Jul 14, 2026
A small pool of microbenchmarks flips ±10-35% between two fixed values
on unrelated PRs (including docs-only and lockfile-only changes),
spamming every CodSpeed report. This PR fixes them (and removes only 1
benchmark). No `#[cfg(codspeed)]` gating; CI and local runs stay
identical. One commit per benchmark.

## Changes

- **mimalloc as global allocator** in the 5 flaky `vortex-array` bench
files: `chunk_array_builder`, `dict_compress`, `varbinview_compact`,
`compare`, `binary_ops`
- **`bitwise_not_vortex_buffer_mut`**: drop the 128/1024/2048 sizes
(measured only harness overhead)
- **`slice_empty_vortex`**: rewrite as a 1024-iteration tight loop,
renamed `slice_empty_tight_loop_vortex`
- **`rebuild_naive` (vortex-zstd)**: the one benchmark removed instead
of fixed — its cost is dominated by zstd-internal copies (glibc
`ifunc`-resolved `memcpy`) that no bench-level change can stabilize, its
fixture is degenerate (a 4-string dictionary with all-zero offsets), and
ListView rebuild is already benchmarked across element types and list
shapes in `vortex-array/benches/listview_rebuild.rs`. The crate's
now-unused `divan` dev-dependency goes with it.

<details>
<summary>Which benchmarks were flaky, and the evidence</summary>

Identified by reading the CodSpeed comments on the ~47 PRs merged since
June 25 (post-#8490). The tell: the same benchmark flipping between the
same two values, in both directions, on PRs that can't have affected it
— including deny.toml-only (#8712, #8716), uv.lock-only (#8732),
docs-only (#8737, #8728, #8685), and CI-YAML-only (#8660, #8683)
changes.

| Benchmark | Evidence |
|---|---|
| `bitwise_not_vortex_buffer_mut[128/1024/2048]` | ~half of all PRs —
worst offender |
| `chunked_varbinview_*` ×4 | ~20 PRs, both directions |
| `chunked_bool_canonical_into[(1000,10)]` | ~2× flips (16µs ↔ 35µs) on
4 PRs |
| `encode_varbin`, `encode_varbinview` | ~12 PRs;
`encode_varbinview[(10000,4)]` also flipped on an earlier revision of
this PR |
| `compact`, `compact_sliced` (90%-utilization args) | ~8 PRs |
| `compare_int_constant` | ±11.1% verbatim on ≥9 PRs |
| `eq_i64_constant` | same ±11% signature incl. docs-only PR |
| `slice_empty_vortex` | -14.66% verbatim on ~13 PRs |
| `rebuild_naive` (vortex-zstd) | ~10 PRs, both directions |

Watch list (left alone, below the ≥3-independent-sightings bar):
`copy_nullable`/`copy_non_nullable[65536]` in `cast_decimal.rs`,
`true_count_vortex_buffer[128]`.
</details>

<details>
<summary>Root causes and why each fix matches</summary>

- **Allocation in the timed region** → glibc malloc's code differs
across CodSpeed runner images, so alloc-heavy benchmarks trace
differently for byte-identical Vortex code. Vendored mimalloc removes
glibc malloc from the trace. Empirical support: the only three bench
files already using mimalloc (`single_encoding_throughput`,
`common_encoding_tree_throughput`, `row_encode`) are the most
alloc-heavy suites in the repo and were never flagged once in the 47-PR
window.
- **Sub-microsecond work** → the measurement is fixed harness overhead
plus binary code layout, which shifts with any unrelated change. Fix by
making the operation dominate: the in-place NOT (no alloc, no copy)
keeps only sizes where the loop dominates; the empty slice runs 1024×
per iteration, mirroring the neighboring `slice_tight_loop_vortex`.
- **Environment-bound and low-signal** → `rebuild_naive`, per the
justification above: unfixable at the bench level and redundant with the
vortex-array ListView rebuild suite, so removed.
</details>

<details>
<summary>Validation: A/A reruns and a stacked canary PR</summary>

- **Expected one-time step changes on this PR**: swapping the allocator
changes the trace of every benchmark in the touched files, so this PR's
report shows a few ±10-20% level shifts (including on never-flaky
`encode_primitives`, which just shares a file). These need a one-time
acknowledgment on the CodSpeed dashboard; after merge every PR compares
mimalloc-vs-mimalloc.
- **A/A reruns** (same bench binaries measured three times, on separate
runners and commits): every value reproduced exactly — 211.5µs, 137.1µs,
14.6µs, 26.3µs — with zero new flags across 1656 benchmarks.
- **Canary #8743** (a #8681-style cold-string change stacked on this
branch — the class of change that used to collect five false flags):
**Performance Gate Passed**, `✅ 1660 untouched`, zero changes reported.
</details>

No public API changes; benchmark-only.

https://claude.ai/code/session_01T6PPcdrqcNeUkfi1EGd4oC

---------

Signed-off-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog/skip Do not list PR in the changelog

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants