java-topology/defects/lean4/bench/bench-lean4-0007.py
russell@unturf.com 87503f60ef bench backfill: 20 benches close custom/sibling/empty buckets
Closes the three tractable pending buckets (all non-no_dir work):
  + lean4-0004..0007: 4 correctness/race benches (ir_interp DCL, jobreg
    IO.Ref race, g_opts thread-local leakage, process envvar hash).
    lean4-0007 shows 138x O(N^2)->O(N); 0004-0006 demonstrate lost
    updates/leaks of several hundred in defective, 0 in fixed.
  + 0ad-0001..0004: 3 CWE-407 list.find->unordered_set speedup benches
    (obstruction dirty shapes, modified entities, template cache) at
    70-341x, plus 0ad-0004 log-redaction correctness at 100% redaction.
  + activemq-0001..0003: 3 CWE-407 benches (queue/topic consumer rotation,
    demand-bridge candidate dedup, transaction-context endedXA set) at
    95-178x.
  + linux-0001..0008: 8 Python complexity-class models for the kernel
    patches. Coexist with the existing build-and-bench.sh kernel-level
    bench; the Python models give 10-389x and the generator embeds them.
  + mercurial-0001-0001: standalone graphmod O(k^2)->O(k) model at
    3-20x, alongside the existing bench_google_scale.py (which imports
    the real mercurial graphmod).

Progress: 13 -> 33 full coverage. Remaining pending: 1262 no_dir +
12 non-CWE-407 race/leaked-context defects (future work on per-MOAD
bench templates).
2026-04-23 11:48:03 -04:00

57 lines
1.8 KiB
Python

#!/usr/bin/env python3
# bench-lean4-0007.py
# Windows env var inheritance: new_env_vars.count({key_begin, key_end}) constructs
# a std::string per iteration over N inherited env vars vs a pre-built
# std::unordered_set<std::string> of override keys for O(1) amortized lookup.
import sys
import time
def bench_defective(n):
"""Model: list-backed key set with per-iteration allocation."""
override_keys = [f"KEY_{i}" for i in range(max(1, n // 4))]
env_keys = [f"ENV_{i}" for i in range(n)] + [f"KEY_{i}" for i in range(n // 4)]
t0 = time.perf_counter()
kept = []
for k in env_keys:
# Emulate per-iteration std::string construction + linear find.
tmp = "".join(list(k))
if tmp not in override_keys:
kept.append(k)
return time.perf_counter() - t0
def bench_fixed(n):
"""Pre-built unordered_set of override keys; O(1) amortized lookup."""
override_keys = {f"KEY_{i}" for i in range(max(1, n // 4))}
env_keys = [f"ENV_{i}" for i in range(n)] + [f"KEY_{i}" for i in range(n // 4)]
t0 = time.perf_counter()
kept = []
for k in env_keys:
if k not in override_keys:
kept.append(k)
return time.perf_counter() - t0
TRIALS = 3
SIZES = [100, 500, 1000, 2000]
def run():
lines = []
header = "=== lean4-0007: process.cpp Windows env vars list-count vs unordered_set ==="
print(header); lines.append(header)
for n in SIZES:
d = min(bench_defective(n) for _ in range(TRIALS))
f = min(bench_fixed(n) for _ in range(TRIALS))
speedup = (d / f) if f > 0 else float("inf")
line = f"N={n:<5}: defective={d*1000:.3f}ms fixed={f*1000:.3f}ms speedup={speedup:.1f}x"
print(line); lines.append(line); sys.stdout.flush()
return lines
if __name__ == "__main__":
run()