Files
hakmem/docs/analysis/ALLOC_GATE_ANALYSIS.md
Moe Charm (CI) 0f15adae4e Phase ALLOC-GATE-OPT-1: tiny_alloc_gate_fast 統計計測
- AllocGateStats 構造体追加(size2class/route/env/class分布)
- malloc_tiny_fast にカウンタ埋め込み
- ENV: HAKMEM_ALLOC_GATE_STATS (default 0)
- 挙動変更なし(計測のみ)

計測結果:
- Mixed: total=542k, size2class=0, route_calls=0, env_checks=275k, C4-C7=95.2%
  - size_to_class/route_for_class は完全削減済み(LUT 効果)
  - C4-C7 が 95% → ULTRA fast path が有効
  - env_checks ≈ c7_calls → C7 ULTRA の ENV gate が毎回呼ばれる
- C6-heavy: total=11 → malloc_tiny_fast はほぼ通らない(mid/pool 主体)

結論:
- alloc gate は既に十分最適化済み(LUT + ULTRA で削減済み)
- さらなる最適化余地は小さい(env_checks は軽量化済み、数%以下の効果)
- 次フェーズでは free dispatcher (29%) や C7 ULTRA refill (7%) など、他のボトルネックを狙う

詳細: docs/analysis/ALLOC_GATE_ANALYSIS.md

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-11 21:32:40 +09:00

4.7 KiB
Raw Blame History

ALLOC_GATE_ANALYSIS

Phase ALLOC-GATE-OPT-1 計測結果

Mixed 16-1024B (1M iter, ws=400)

[ALLOC_GATE_STATS] total=542033 size2class=0 route_calls=0 env_checks=275089 c0=0 c1=0 c2=8746 c3=17279 c4=34727 c5=68871 c6=137321 c7=275089

Throughput: 42.5M ops/s

分析:

  • total_calls: 542,033 malloc_tiny_fast 呼び出し数)
  • size_to_class: 0 calls (毎回は呼ばれていない!)
  • route_for_class: 0 calls (毎回は呼ばれていない!)
    • avg per alloc: 0 calls/alloc LUT により完全に削減済み)
  • env_checks: 275,089 C7 ULTRA の ENV gate が主体)
    • env_checks ≈ c7 calls → C7 ULTRA 毎回 ENV check あり
  • class 分布:
    • C7: 50.7% (275,089 / 542,033)
    • C6: 25.3% (137,321 / 542,033)
    • C5: 12.7% (68,871 / 542,033)
    • C4: 6.4% (34,727 / 542,033)
    • C3: 3.2% (17,279 / 542,033)
    • C2: 1.6% (8,746 / 542,033)
    • C1/C0: 0.0%
    • C4〜C7: 95.2% hot classes が支配的)

コメント:

  • size_to_class と route_for_class が完全に削減済み → LUT (tiny_front_v3) が効いている
  • env_checks が C7 alloc で毎回発生 → tiny_c7_ultra_enabled_env() が毎回呼ばれている
    • C4/C5/C6 ULTRA の ENV check は早期リターンLUT で class 判定済み)のため計測されず
  • C4〜C7 が 95% → class-specific fast path の検討価値あり(ただし既に ULTRA で対応済み)

C6-heavy (257-768B, 1M iter, ws=400)

[ALLOC_GATE_STATS] total=11 size2class=0 route_calls=0 env_checks=0 c0=0 c1=1 c2=1 c3=0 c4=0 c5=0 c6=9 c7=0

Throughput: 27.4M ops/s

分析:

  • total_calls: 11 (ほぼ全て mid route に落ちている)
  • size_to_class: 0 calls
  • route_for_class: 0 calls
  • env_checks: 0 C6 ULTRA は OFF のため)
  • class 分布:
    • C6: 81.8% (9 / 11)
    • C1/C2: 各 1 回(初期化時のノイズ)

コメント:

  • C6-heavy では malloc_tiny_fast がほぼ呼ばれていない → mid/pool 経路が主体
  • total_calls=11 は初期化時の SuperSlab 確保等のノイズ
  • C6-heavy の alloc gate 最適化は効果なし(そもそも通らない)

Phase ALLOC-GATE-OPT-1B 候補施策

候補 A: C7 ULTRA ENV gate の snapshot 化

条件: env_checks ≈ c7_calls (毎回呼ばれている) 施策: tiny_c7_ultra_enabled_env() を初期化時に1回だけ評価し、結果を TLS snapshot に保持 期待: ENV check overhead 削減(ただし既に tiny_c7_ultra_enabled_env() 自体が static cached

評価: 効果は限定的ENV gate は既に sentinel パターンで最適化済み)

候補 B: size_to_class / route_for_class の snapshot 化

条件: size_to_class=0, route_calls=0 (既に削減済み) 施策: 不要LUT により完全に削減済み)

評価: 既に最適化済みで追加改善なし

候補 C: class-specific fast path (C4-C7)

条件: C4〜C7 が 95% 以上 施策: C4〜C7 用の直線パスと、その他サイズ用の旧ルートを分岐 期待: hot classes を完全に直線化

評価: 既に C4-C7 ULTRA で実装済み(寄生型 TLS キャッシュで fast path 確立)


判断基準

良い発見

  • size_to_class / route_for_class は既に完全削減済みLUT 効果)
  • C4-C7 ULTRA で hot classes の fast path は確立済み95% カバー)

さらなる最適化の余地は小さい

  • env_checks は C7 ULTRA の構造的コスト(毎回 ENV check する設計)
    • tiny_c7_ultra_enabled_env() 自体は既に sentinel cached で軽量
    • snapshot 化しても効果は誤差範囲(数%以下)
  • alloc gate 内部は既に十分薄いLUT + ULTRA で最適化済み)

次フェーズへの示唆

  • alloc gate よりも別の箇所を狙うべき
    • PERF-ULTRA-REBASE-3 では tiny_alloc_gate_fast = 18% だが、内訳は「LUT overhead」「ULTRA ENV check」「class dispatch」等に分散
    • 18% を削るよりも、他のボトルネックfree dispatcher 29%、C7 ULTRA refill 7% 等)を狙う方が効果的
  • alloc gate 自体は Phase FREE-DISPATCHER-OPT-1 と同様に「既に最適化済み」 と判断

結論

Phase ALLOC-GATE-OPT-1 の成果:

  • alloc gate の内訳を可視化
  • size_to_class / route_for_class が完全削減済みLUT 効果)を確認
  • C4-C7 が 95% で、ULTRA fast path が有効なことを確認
  • env_checks は C7 ULTRA の構造的コスト(軽量化済み)

Phase ALLOC-GATE-OPT-1B の方針:

  • 追加最適化は見送り
  • alloc gate は既に十分薄く、さらなる改善余地は小さい(数%以下)
  • 次フェーズでは free dispatcher (29%)C7 ULTRA refill (7%) など、他のボトルネックを狙う