#!/usr/bin/env bash set -euo pipefail # 10-run Mixed benchmark with explicit clean ENV for frozen/research knobs. # Purpose: avoid "bench_setenv_default() does not override exported ENV" drift. profile=${HAKMEM_PROFILE:-MIXED_TINYV3_C7_SAFE} iters=${ITERS:-20000000} ws=${WS:-400} runs=${RUNS:-10} bin=${BENCH_BIN:-./bench_random_mixed_hakmem} # Keep profiles reproducible even if user exported env vars. case "${profile}" in MIXED_TINYV3_C7_BALANCED) export HAKMEM_SS_MEM_LEAN=1 export HAKMEM_SS_MEM_LEAN_DECOMMIT=OFF export HAKMEM_SS_MEM_LEAN_TARGET_MB=10 ;; *) export HAKMEM_SS_MEM_LEAN=0 export HAKMEM_SS_MEM_LEAN_DECOMMIT=OFF export HAKMEM_SS_MEM_LEAN_TARGET_MB=10 ;; esac # Force known research knobs OFF to avoid accidental carry-over. export HAKMEM_TINY_HEADER_WRITE_ONCE=${HAKMEM_TINY_HEADER_WRITE_ONCE:-0} export HAKMEM_TINY_C7_PRESERVE_HEADER=${HAKMEM_TINY_C7_PRESERVE_HEADER:-0} export HAKMEM_TINY_TCACHE=${HAKMEM_TINY_TCACHE:-0} export HAKMEM_TINY_TCACHE_CAP=${HAKMEM_TINY_TCACHE_CAP:-64} export HAKMEM_MALLOC_TINY_DIRECT=${HAKMEM_MALLOC_TINY_DIRECT:-0} export HAKMEM_FRONT_FASTLANE_ALLOC_LEGACY_DIRECT=${HAKMEM_FRONT_FASTLANE_ALLOC_LEGACY_DIRECT:-0} export HAKMEM_FORCE_LIBC_ALLOC=${HAKMEM_FORCE_LIBC_ALLOC:-0} export HAKMEM_ENV_SNAPSHOT_SHAPE=${HAKMEM_ENV_SNAPSHOT_SHAPE:-0} export HAKMEM_TINY_C7_ULTRA_HEADER_LIGHT=${HAKMEM_TINY_C7_ULTRA_HEADER_LIGHT:-0} export HAKMEM_TINY_C2_LOCAL_CACHE=${HAKMEM_TINY_C2_LOCAL_CACHE:-0} export HAKMEM_TINY_INLINE_SLOTS_SWITCHDISPATCH_FIXED=${HAKMEM_TINY_INLINE_SLOTS_SWITCHDISPATCH_FIXED:-0} # NOTE: Phase 19-1b is promoted in presets. Keep cleanenv aligned by default. export HAKMEM_FASTLANE_DIRECT=${HAKMEM_FASTLANE_DIRECT:-1} # NOTE: Phase 9/10 are promoted (bench_profile defaults to 1). Keep cleanenv aligned by default. export HAKMEM_FREE_TINY_FAST_MONO_DUALHOT=${HAKMEM_FREE_TINY_FAST_MONO_DUALHOT:-1} export HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=${HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT:-1} # NOTE: Phase 69-1 winner (Warm Pool Size=16, +3.26% Strong GO, ENV-only) export HAKMEM_WARM_POOL_SIZE=${HAKMEM_WARM_POOL_SIZE:-16} # NOTE: Phase 75-3 winner (C5+C6 Inline Slots, +5.41% GO, 4-point matrix A/B) export HAKMEM_TINY_C5_INLINE_SLOTS=${HAKMEM_TINY_C5_INLINE_SLOTS:-1} export HAKMEM_TINY_C6_INLINE_SLOTS=${HAKMEM_TINY_C6_INLINE_SLOTS:-1} # NOTE: Phase 76-1 winner (C4 Inline Slots, +1.73% GO, 10-run A/B) export HAKMEM_TINY_C4_INLINE_SLOTS=${HAKMEM_TINY_C4_INLINE_SLOTS:-1} # NOTE: Phase 78-1 winner (Inline Slots Fixed Mode, removes per-op ENV gate overhead) export HAKMEM_TINY_INLINE_SLOTS_FIXED=${HAKMEM_TINY_INLINE_SLOTS_FIXED:-1} # NOTE: Phase 80-1 winner (Switch dispatch for inline slots, removes if-chain comparisons) export HAKMEM_TINY_INLINE_SLOTS_SWITCHDISPATCH=${HAKMEM_TINY_INLINE_SLOTS_SWITCHDISPATCH:-1} if [[ "${HAKMEM_BENCH_ENV_LOG:-0}" == "1" ]]; then if [[ -x ./scripts/bench_env_banner.sh ]]; then ./scripts/bench_env_banner.sh >&2 || true fi fi for i in $(seq 1 "${runs}"); do echo "=== Run ${i}/${runs} ===" HAKMEM_PROFILE="${profile}" "${bin}" "${iters}" "${ws}" 1 2>&1 | rg "Throughput" || true done