Files
hakmem/docs/analysis/PHASE4_E3_ENV_CONSTRUCTOR_INIT_NEXT_INSTRUCTIONS.md
Moe Charm (CI) 21e2e4ac2b Phase 4 E3-4: ENV Constructor Init (+4.75% GO)
Target: Eliminate E1 lazy init check overhead (3.22% self%)
- E1 consolidated ENV gates but lazy check remained in hot path
- Strategy: __attribute__((constructor(101))) for pre-main init

Implementation:
- ENV gate: HAKMEM_ENV_SNAPSHOT_CTOR=0/1 (default 0, research box)
- core/box/hakmem_env_snapshot_box.c: Constructor function added
  - Reads ENV before main() when CTOR=1
  - Refresh also syncs gate state for bench_profile putenv
- core/box/hakmem_env_snapshot_box.h: Dual-mode enabled check
  - CTOR=1 fast path: direct global read (no lazy branch)
  - CTOR=0 fallback: legacy lazy init (rollback safe)
  - Branch hints adjusted for default OFF baseline

A/B Test Results (Mixed, 10-run, 20M iters, E1=1):
- Baseline (CTOR=0): 44.28M ops/s (mean), 44.60M ops/s (median)
- Optimized (CTOR=1): 46.38M ops/s (mean), 46.53M ops/s (median)
- Improvement: +4.75% mean, +4.35% median

Decision: GO (+4.75% >> +0.5% threshold)
- Expected +0.5-1.5%, achieved +4.75%
- Lazy init branch overhead was larger than expected
- Action: Keep as research box (default OFF), evaluate promotion

Phase 4 Cumulative:
- E1 (ENV Snapshot): +3.92%
- E2 (Alloc Per-Class): -0.21% (NEUTRAL, frozen)
- E3-4 (Constructor Init): +4.75%
- Total Phase 4: ~+8.5%

Deliverables:
- docs/analysis/PHASE4_E3_ENV_CONSTRUCTOR_INIT_DESIGN.md
- docs/analysis/PHASE4_E3_ENV_CONSTRUCTOR_INIT_NEXT_INSTRUCTIONS.md
- docs/analysis/PHASE4_COMPREHENSIVE_STATUS_ANALYSIS.md
- docs/analysis/PHASE4_EXECUTIVE_SUMMARY.md
- scripts/verify_health_profiles.sh (sanity check script)
- CURRENT_TASK.md (E3-4 complete, next instructions)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-14 02:57:35 +09:00

2.9 KiB
Raw Blame History

Phase 4 E3-4: ENV Constructor Init次の指示書

Status2025-12-14

  • 実装済みresearch box / default OFF
  • A/BMixed, 10-run, iter=20M, ws=400, E1=1+4.75% mean / +4.35% median を観測
  • ENV:
    • E1: HAKMEM_ENV_SNAPSHOT=0/1default 0
    • E3-4: HAKMEM_ENV_SNAPSHOT_CTOR=0/1default 0、E1=1 前提)

ゴール

  1. “E3-4 の勝ち” を再確認して固定化する
  2. 本線(プリセット)へ昇格するか判断する(戻せる形で)

Step 0: 前提E1 を ON にして測る)

E3-4 は hakmem_env_snapshot_enabled() の gate 判定を短絡する最適化なので、E1 が ON であることが前提。


Step 1: Build & 健康診断(先に通す)

make bench_random_mixed_hakmem -j
scripts/verify_health_profiles.sh

Step 2: A/BMixed 10-run

Mixed 10-runiter=20M, ws=400:

# Baseline: ctor=0
HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE \
HAKMEM_ENV_SNAPSHOT=1 \
HAKMEM_ENV_SNAPSHOT_CTOR=0 \
./bench_random_mixed_hakmem 20000000 400 1

# Optimized: ctor=1
HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE \
HAKMEM_ENV_SNAPSHOT=1 \
HAKMEM_ENV_SNAPSHOT_CTOR=1 \
./bench_random_mixed_hakmem 20000000 400 1

判定10-run mean:

  • GO: +1.0% 以上
  • ±1%: NEUTRALresearch box 維持)
  • -1% 以下: NO-GOfreeze

注意:

  • “constructor の pre-main init” を効かせたい場合は、起動前に ENV を設定するbench_profile putenv だけでは遅い)。

Step 3: perf で “消えたか” を確認E3-4=1

HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE \
HAKMEM_ENV_SNAPSHOT=1 \
HAKMEM_ENV_SNAPSHOT_CTOR=1 \
perf record -F 99 -- ./bench_random_mixed_hakmem 20000000 400 1

perf report --stdio --no-children

確認ポイント:

  • hakmem_env_snapshot_enabled の self% が有意に下がるTop から落ちる
  • 代わりに “snapshot 参照” が 1 箇所に集約されている

Step 4: 昇格GO の場合のみ)

Option A推奨・安全: E1 だけプリセット昇格、E3-4 は opt-in 維持

  • core/bench_profile.hMIXED_TINYV3_C7_SAFE:
    • bench_setenv_default("HAKMEM_ENV_SNAPSHOT","1");
    • HAKMEM_ENV_SNAPSHOT_CTOR は入れない(研究箱のまま)
  • docs/analysis/ENV_PROFILE_PRESETS.md に E1/E3-4 の推奨セットを追記
  • CURRENT_TASK.md を更新

Option B攻める: E1+E3-4 をプリセット昇格

  • 20-run validationmean/median 両方)を通してから
  • 注意: HAKMEM_ENV_SNAPSHOT_CTOR=1 をプリセット default にする場合、分岐 hint/期待値も合わせて見直すbaseline を汚さない)

Step 5: Rollbackいつでも戻せる

HAKMEM_ENV_SNAPSHOT=0
HAKMEM_ENV_SNAPSHOT_CTOR=0

NextPhase 4 Close

  • E1/E3-4 の “どこまで本線に入れるか” を決めたら、Phase 4 は CLOSE勝ち箱はプリセットへ、研究箱は freezeにする。