perf: round 21 — CalDAV/CardDAV row-mapper pre-size, dedup hash-bind & digest-key dedup, CardDAV etag/BDAY emit, NC trashbin content-type

Round 21 of the benchmark-gated perf sweep. Six behaviour-preserving,
allocation-reducing changes, each with a BEFORE/AFTER counting-allocator
section in examples/bench_round21_micro.rs and a byte/-value equivalence
gate; all six pass their deterministic alloc gate (a non-winning AFTER
exits 1 = rollback).

- R1: pre-size the 16 CalDAV/CardDAV row-mapper Vecs (+1 HashMap) with
  Vec::with_capacity(rows.len()) — the ROUND20 §I1 file-side pattern
  extended to the calendar/contact repos it deferred. 7 → 1 allocs/op.
- R2: settle_batch binds a borrowed Vec<&str> instead of cloning every
  chunk hash into a Vec<String> (sqlx encodes &[&str] as text[]
  identically; favorites_pg_repository.rs:271 precedent). 33 → 1 allocs/op,
  39x wall.
- R3: store_loose_chunks keys its intra-request dedup set on the raw
  [u8;32] BLAKE3 digest and moves the hex on a duplicate (the ROUND17 §D2
  pattern applied to the delta-upload sibling). 401 → 209 allocs/op.
- R4: CardDAV getetag emits borrowed pre-escaped &quot; quotes via a shared
  write_quoted_etag helper (ROUND20 §C1 pattern, all 4 CardDAV etag sites).
  3 → 0 allocs/op.
- R5: BDAY stamped via the new fmt::compact_date stack renderer instead of
  chrono's strftime interpreter (chrono fallback out of the 4-digit-year
  range; byte-identical, unit-tested vs chrono). 2 → 0 allocs/op, 10.5x wall.
- R6: NC trashbin folder content-type via Cow::Borrowed instead of
  .to_string() on the constant (ROUND16 §M1 pattern). 1 → 0 allocs/op.

See benches/ROUND21.md for the full write-up and the deferred-items list
(HeaderMap-clone hot handlers, Query→typed-struct, WebDAV dead-props
HashSet, and others surfaced by the audit that want their own validated
pass). Validated: cargo fmt, cargo clippy --features bench --all-targets
-D warnings, cargo test --lib --features test_utils (529 passed).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015gHVq5Wy2TzdWeSqtEmK6m
This commit is contained in:
Claude
2026-07-20 08:48:42 +00:00
parent aec9b8f037
commit 77f13ac643
11 changed files with 910 additions and 55 deletions
+15
View File
@@ -354,6 +354,21 @@ name = "bench_micro_allocs"
path = "examples/bench_micro_allocs.rs"
required-features = ["bench"]
# Round-21 battery ────────────────────────────────────────────────────────────
# Round-21 CPU/alloc micro-pack — CalDAV/CardDAV row-mapper container pre-size
# (the ROUND20 §I1 sibling the calendar/contact repos deferred); dedup
# `settle_batch` hash bind Vec<String>→Vec<&str> borrow; `store_loose_chunks`
# intra-request dedup set keyed on the raw [u8;32] digest + move-on-dup (the
# ROUND17 §D2 pattern applied to the delta-upload sibling); CardDAV `getetag`
# borrowed pre-escaped quotes (the ROUND20 §C1 NextCloud pattern); `BDAY`
# stamp via fmt::compact_date stack render; NC trashbin folder content-type
# Cow::Borrowed. No Postgres.
[[example]]
name = "bench_round21_micro"
path = "examples/bench_round21_micro.rs"
required-features = ["bench"]
# Round-20 battery ────────────────────────────────────────────────────────────
# Round-20 CPU/alloc micro-pack — CalendarEvent `prop_with_params` throwaway