docs: record Phase 10 GO promotion; add Phase 11 instructions
Phase 10 updates: - Mark Phase 10 as promoted (GO +1.89%) - Update CURRENT_TASK.md with Phase 10 results - Clean up absolute paths in PHASE10 docs - Add promotion status to PHASE10 docs Phase 11 instructions: - New: PHASE11_ENV_SNAPSHOT_MAYBE_FAST_1_NEXT_INSTRUCTIONS.md - Target: Consolidate ENV snapshot overhead - Strategy: Merge hakmem_env_snapshot* and tiny_front_v3_snapshot_get into single call - ENV: HAKMEM_ENV_SNAPSHOT_MAYBE_FAST=0/1 - Expected: +1-2% (reduce TLS/ENV read overhead) Files modified: - CURRENT_TASK.md: Phase 10 GO record, Phase 11 next - docs/analysis/PHASE10_FREE_TINY_FAST_MONO_LEGACY_DIRECT_1_AB_TEST_RESULTS.md - docs/analysis/PHASE10_FREE_TINY_FAST_MONO_LEGACY_DIRECT_1_NEXT_INSTRUCTIONS.md Files added: - docs/analysis/PHASE11_ENV_SNAPSHOT_MAYBE_FAST_1_NEXT_INSTRUCTIONS.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -1,5 +1,13 @@
|
||||
# Phase 10: FREE-TINY-FAST MONO LEGACY DIRECT A/B テスト結果
|
||||
|
||||
## Status(2025-12-14)
|
||||
|
||||
**✅ GO / 本線昇格(+1.89% Mixed 10-run)**
|
||||
|
||||
- コミット: `71b1354d3`
|
||||
- Preset: `core/bench_profile.h`(`MIXED_TINYV3_C7_SAFE` で default ON)
|
||||
- Rollback: `export HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=0`
|
||||
|
||||
## 実行日時
|
||||
2025-12-14
|
||||
|
||||
@ -9,13 +17,13 @@ Phase 9(C0-C3 DUALHOT)の成功を受けて、Phase 10 では C4-C7 を含
|
||||
## 実装内容
|
||||
|
||||
### Patch 1: ENV gate 箱を追加(L0)
|
||||
- ファイル: `/mnt/workdisk/public_share/hakmem/core/box/free_tiny_fast_mono_legacy_direct_env_box.h`
|
||||
- ファイル: `core/box/free_tiny_fast_mono_legacy_direct_env_box.h`
|
||||
- ENV変数: `HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=0/1`(default 0)
|
||||
- probe window: 64(bench_profile の putenv 競合に耐える)
|
||||
- nonlegacy_mask キャッシュ機能を追加(Phase POLICY-FAST-PATH-V2 の計算を初期化時に 1 回だけ実行)
|
||||
|
||||
### Patch 2: `free_tiny_fast()` に early-exit を追加(L1)
|
||||
- ファイル: `/mnt/workdisk/public_share/hakmem/core/front/malloc_tiny_fast.h`
|
||||
- ファイル: `core/front/malloc_tiny_fast.h`
|
||||
- Phase 9(C0-C3 direct)の後に、Phase 10(C4-C7 拡張)の条件を追加
|
||||
- 条件:
|
||||
1. `HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=1`
|
||||
@ -24,11 +32,11 @@ Phase 9(C0-C3 DUALHOT)の成功を受けて、Phase 10 では C4-C7 を含
|
||||
4. `tiny_env_cfg()->larson_fix == 0`
|
||||
|
||||
### Patch 3: 見える化(最小)
|
||||
- ファイル: `/mnt/workdisk/public_share/hakmem/core/box/free_path_stats_box.h`
|
||||
- ファイル: `core/box/free_path_stats_box.h`
|
||||
- カウンタ追加: `uint64_t mono_legacy_direct_hit;`
|
||||
|
||||
### Patch 4: A/B 用の cleanenv 追記
|
||||
- ファイル: `/mnt/workdisk/public_share/hakmem/scripts/run_mixed_10_cleanenv.sh`
|
||||
- ファイル: `scripts/run_mixed_10_cleanenv.sh`
|
||||
- ENV変数追加: `export HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=${HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT:-0}`
|
||||
|
||||
## A/B テスト結果
|
||||
@ -153,17 +161,19 @@ scripts/verify_health_profiles.sh
|
||||
|
||||
## 次のステップ
|
||||
|
||||
### 1. Preset 追加(推奨)
|
||||
`core/bench_profile.h` の `MIXED_TINYV3_C7_SAFE` プリセットに追加:
|
||||
```c
|
||||
bench_setenv_default("HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT","1");
|
||||
```
|
||||
### 昇格(GO)— 完了
|
||||
|
||||
### 2. C6_HEAVY_LEGACY_POOLV1 プリセットへの追加
|
||||
今回の結果では C6-heavy でも改善が見られたが、MID v3 有効時の誤爆防止のため、慎重に検討する:
|
||||
- Option A: 追加しない(安全側、現状維持)
|
||||
- Option B: 追加する(C6 以外のクラスの改善を取る)
|
||||
- **推奨**: Option A(誤爆防止のため未設定のまま)
|
||||
Phase 10 は本線に昇格済み(`71b1354d3`)。
|
||||
|
||||
- `core/bench_profile.h`: `MIXED_TINYV3_C7_SAFE` に `HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=1`
|
||||
- Rollback: `export HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=0`
|
||||
|
||||
### C6_HEAVY_LEGACY_POOLV1 について
|
||||
|
||||
今回の A/B では C6-heavy でも +7.86% が出たが、これは「C6 を誤って direct した」結果ではなく、**C6 以外の LEGACY クラス**が direct になった寄与と考えられる。
|
||||
|
||||
運用は保守的に:
|
||||
- `C6_HEAVY_LEGACY_POOLV1` は preset 未設定のまま(必要なら専用プリセットを作って opt-in)
|
||||
|
||||
### 3. Rollback 手順
|
||||
問題が発生した場合、同一バイナリで即座に無効化可能:
|
||||
|
||||
@ -1,5 +1,14 @@
|
||||
# Phase 10: FREE-TINY-FAST MONO LEGACY DIRECT(FastLane free 固定費削減)次の指示書
|
||||
|
||||
## Status(2025-12-14)
|
||||
|
||||
**✅ GO / 本線昇格(+1.89% Mixed 10-run)**
|
||||
|
||||
- A/B 結果: `docs/analysis/PHASE10_FREE_TINY_FAST_MONO_LEGACY_DIRECT_1_AB_TEST_RESULTS.md`
|
||||
- コミット: `71b1354d3`
|
||||
- Preset: `core/bench_profile.h` に `HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=1`(`MIXED_TINYV3_C7_SAFE`)
|
||||
- Rollback: `export HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=0`
|
||||
|
||||
## 0. 目的(狙い)
|
||||
|
||||
Phase 6 FastLane + Phase 6-2 Free DeDup + Phase 9 MONO DUALHOT により、Mixed の free は主に:
|
||||
|
||||
@ -0,0 +1,136 @@
|
||||
# Phase 11: ENV Snapshot “maybe-fast” API(hot-path の enabled/snapshot/front_snap を 1 回に集約)次の指示書
|
||||
|
||||
## 0. 目的(狙い)
|
||||
|
||||
Phase 10 までで `free_tiny_fast()` 側の policy/route 固定費はかなり削れたが、Perf(Phase 10 後, Mixed)では次が目立つ:
|
||||
|
||||
- `hakmem_env_snapshot` / `hakmem_env_snapshot_enabled`(合計 ~2%)
|
||||
- `tiny_front_v3_snapshot_get`(~1%)
|
||||
|
||||
これらは主に `tiny_legacy_fallback_free_base()` などの **超ホット経路で毎回呼ばれている “設定参照の固定費”**。
|
||||
|
||||
Phase 11 の狙いは、ENV gate(戻せる)を維持したまま **hot path の参照回数を 1 回に集約**し、同時に `tiny_front_v3_snapshot_get()` の “ready-check” を hot から消すこと。
|
||||
|
||||
## 1. 方針(Box Theory)
|
||||
|
||||
- 箱(L0/L1/L2):
|
||||
- L0: `HakmemEnvSnapshotBox`(既存)に “maybe-fast API” を追加
|
||||
- L1: `tiny_legacy_fallback_free_base()` / `malloc_tiny_fast_for_class()` などの hot call sites を段階移行
|
||||
- L2: refresh(`bench_profile`)は既存の `hakmem_env_snapshot_refresh_from_env()` に統合(変換点 1 箇所)
|
||||
- 境界:
|
||||
- “ENV→cached state” の変換点は **refresh 関数 1 箇所**に固定
|
||||
- hot path は「cached を読むだけ」
|
||||
- 戻せる:
|
||||
- 既存の `HAKMEM_ENV_SNAPSHOT=0/1` を維持(snapshot が OFF のとき旧経路に落ちる)
|
||||
- Fail-Fast:
|
||||
- snapshot が不整合(ready==0 等)の場合は init/refresh を通す(隠さない)
|
||||
- 見える化(最小):
|
||||
- perf の self% で `hakmem_env_snapshot*` / `tiny_front_v3_snapshot_get` が落ちることを確認(新規カウンタは増やさない)
|
||||
|
||||
## 2. 設計(要点)
|
||||
|
||||
### 2.1 追加する hot API
|
||||
|
||||
`hakmem_env_snapshot_enabled()` + `hakmem_env_snapshot()` の二段をやめ、**1 回で “使えるなら snapshot ptr” を返す** API を追加する:
|
||||
|
||||
- `hakmem_env_snapshot_maybe_fast() -> const HakmemEnvSnapshot* | NULL`
|
||||
- 返り値が non-NULL: snapshot 有効(`HAKMEM_ENV_SNAPSHOT=1`)かつ ready
|
||||
- NULL: snapshot 無効 → 既存の個別 ENV gate 経路へ
|
||||
|
||||
これにより、call site は:
|
||||
|
||||
- “enabled 判定” と “snapshot 取得” の重複を消せる
|
||||
- `g_hakmem_env_snapshot_ctor_mode` の分岐を hot から消せる(gate だけを見る)
|
||||
|
||||
### 2.2 `TinyFrontV3Snapshot*` を snapshot 内に保持
|
||||
|
||||
`tiny_legacy_fallback_free_base()` の hot path で `tiny_front_v3_snapshot_get()` が頻発しているため、
|
||||
`HakmemEnvSnapshot` に **`front_v3_snap`(ptr)をキャッシュ**する。
|
||||
|
||||
- snapshot init/refresh 時に `tiny_front_v3_snapshot_init()` を呼んで `g_tiny_front_v3_snapshot_ready=1` を確定
|
||||
- `front_v3_snap = &g_tiny_front_v3_snapshot`(front v3 が無効なら NULL)
|
||||
- hot path は `front_v3_snap` を読むだけ(ready-check をしない)
|
||||
|
||||
## 3. 実装指示(小パッチ順)
|
||||
|
||||
### Patch 1: `HakmemEnvSnapshot` を拡張(L0)
|
||||
|
||||
対象:
|
||||
- `core/box/hakmem_env_snapshot_box.h`
|
||||
|
||||
追加:
|
||||
- `typedef struct TinyFrontV3Snapshot TinyFrontV3Snapshot;`(前方宣言で include を増やさない)
|
||||
- `const TinyFrontV3Snapshot* front_v3_snap;` を `HakmemEnvSnapshot` に追加
|
||||
|
||||
### Patch 2: snapshot load/refresh で `front_v3_snap` を確定(L0)
|
||||
|
||||
対象:
|
||||
- `core/box/hakmem_env_snapshot_box.c`
|
||||
|
||||
やること:
|
||||
- `#include "tiny_front_v3_env_box.h"` を追加(型と extern に必要)
|
||||
- `snap->tiny_front_v3_enabled` が true のとき:
|
||||
- `tiny_front_v3_snapshot_init();`
|
||||
- `snap->front_v3_snap = &g_tiny_front_v3_snapshot;`
|
||||
- false のとき:
|
||||
- `snap->front_v3_snap = NULL;`
|
||||
|
||||
(refresh でも同様に上書きする)
|
||||
|
||||
### Patch 3: “maybe-fast” API を追加(L0)
|
||||
|
||||
対象:
|
||||
- `core/box/hakmem_env_snapshot_box.h`
|
||||
|
||||
追加:
|
||||
- `static inline const HakmemEnvSnapshot* hakmem_env_snapshot_maybe_fast(void);`
|
||||
|
||||
仕様:
|
||||
- gate==1 のとき `&g_hakmem_env_snapshot` を返す(ready==0 なら init)
|
||||
- gate==0 のとき NULL
|
||||
- gate==-1 のとき getenv して gate を確定(既存挙動互換)
|
||||
|
||||
### Patch 4: 超ホット call site を 1 箇所ずつ移行(L1)
|
||||
|
||||
優先順(ROI 高い順):
|
||||
1) `core/box/tiny_legacy_fallback_box.h`
|
||||
- `hakmem_env_snapshot_enabled()` / `hakmem_env_snapshot()` / `tiny_front_v3_snapshot_get()` を廃止
|
||||
- `env = hakmem_env_snapshot_maybe_fast();` と `env->front_v3_snap` に置換
|
||||
2) `core/front/malloc_tiny_fast.h`
|
||||
- C7 ULTRA gate などの `hakmem_env_snapshot_enabled()` 分岐を `env = hakmem_env_snapshot_maybe_fast()` へ置換
|
||||
3) `core/box/tiny_metadata_cache_hot_box.h`
|
||||
- `metadata_cache_eff` 判定を `env ? env->tiny_metadata_cache_eff : ...` へ置換
|
||||
|
||||
(その他の call site は Phase 11-2 で拡張でも OK)
|
||||
|
||||
## 4. A/B(推奨)
|
||||
|
||||
この Phase は “既存機能(ENV snapshot)” の内部固定費削減であり、挙動差は出ない設計。
|
||||
|
||||
最低限:
|
||||
- Mixed 10-run を Phase 11 前後で比較(+1.0% 以上で GO)
|
||||
- perf で `hakmem_env_snapshot*` / `tiny_front_v3_snapshot_get` が落ちることを確認
|
||||
|
||||
コマンド例:
|
||||
```sh
|
||||
scripts/run_mixed_10_cleanenv.sh
|
||||
perf record -F 199 -o /tmp/perf_phase11.data -- env -i PATH="$PATH" HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE ./bench_random_mixed_hakmem 300000000 400 1
|
||||
perf report --stdio -i /tmp/perf_phase11.data --no-children --percent-limit 0.5 | head
|
||||
```
|
||||
|
||||
判定(Mixed 10-run mean):
|
||||
- GO: **+1.0% 以上**
|
||||
- NEUTRAL: **±1.0%**
|
||||
- NO-GO: **-1.0% 以下**
|
||||
|
||||
## 5. 健康診断(必須)
|
||||
|
||||
```sh
|
||||
scripts/verify_health_profiles.sh
|
||||
```
|
||||
|
||||
## 6. Rollback
|
||||
|
||||
- 最小 rollback: `export HAKMEM_ENV_SNAPSHOT=0`(snapshot 自体を無効化)
|
||||
- コード rollback: Phase 11 のコミットを revert(この Phase は “内部最適化” のため revert が実用)
|
||||
|
||||
Reference in New Issue
Block a user