From ee5e2cc9c4e23c745ac5adbdf4a42ec8eb9698bc Mon Sep 17 00:00:00 2001 From: "Moe Charm (CI)" Date: Tue, 16 Dec 2025 15:10:36 +0900 Subject: [PATCH] =?UTF-8?q?Phase=2040=20=E6=BA=96=E5=82=99:=20FAST=20v3=20?= =?UTF-8?q?perf=20analysis=20=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - FAST v3 binary で perf record 実施 - 残存 gate function の hotspot 分析完了 Phase 40 候補特定: 1. tiny_header_mode() - alloc hot path (4.56% hotspot) 2. mid_v3_enabled() - free path check 3. mid_v3_debug_enabled() - free path debug check 期待効果: +0.5~1.5% (累積) 次: Step 1 - tiny_header_mode() BENCH_MINIMAL 定数化 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- CURRENT_TASK.md | 47 ++++++++++++++++++++++++++++++++++++++++-- perf.data.fast_v3 | Bin 0 -> 70248 bytes perf.data.fast_v3.old | Bin 0 -> 24592 bytes 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 perf.data.fast_v3 create mode 100644 perf.data.fast_v3.old diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 438c11ed..0fb8fee4 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -24,9 +24,52 @@ - ❌ Makefile から `.o` を外す / コード物理削除は原則しない(Phase 22-2 NO-GO) - A/B は **同一バイナリ**でトグル(ENV / build flag)。別バイナリ比較は layout が混ざる。 -## 3) 次の指示書 +## 3) 次の指示書(Phase 40) -TBD(Phase 39 完了) +**Phase 40: 残存 gate function の BENCH_MINIMAL 定数化(継続)** + +Phase 39 で +1.98% 達成。FAST v3 perf profile で残存 gate function を調査した結果、以下を特定: + +### 優先候補(HOT path): + +1. **tiny_header_mode()** (`core/tiny_region_id.h:180-200`) + - **Hotspot**: `tiny_region_id_write_header` (4.56% self-time) + - **Pattern**: lazy-init (`static int g_header_mode = -1` + `getenv()`) + - **Default**: TINY_HEADER_MODE_FULL (0) + - **BENCH_MINIMAL 値**: 固定 FULL (0)(ヘッダー書き込み有効) + - **影響**: alloc hot path、毎回実行 + - **期待**: +0.3~0.8% + +2. **mid_v3_enabled()** (`core/box/mid_hotbox_v3_env_box.h:14-26`) + - **Hotspot**: free path で条件分岐(`g_free_dispatch_ssot` ブロック) + - **Pattern**: lazy-init (`static int g_enable = -1` + `getenv()`) + - **Default**: 0 (OFF) + - **BENCH_MINIMAL 値**: 固定 0 + - **影響**: free path で毎回 check + - **期待**: +0.2~0.5% + +3. **mid_v3_debug_enabled()** (`core/box/mid_hotbox_v3_env_box.h:78-89`) + - **Hotspot**: free path で debug log check + - **Pattern**: lazy-init (`static int g_debug = -1` + `getenv()`) + - **Default**: 0 (OFF) + - **BENCH_MINIMAL 値**: 固定 0 + - **期待**: +0.1~0.3% + +### 保留候補: + +4. **g_free_dispatch_ssot** (`core/box/hak_free_api.inc.h:236-240`) + - Phase 39 で「保留」(互換性優先) + - Default: 0 (backward compat) + - 再検討: BENCH_MINIMAL で固定 1 にすべきか? + +### 実装方針: + +**Step 1**: tiny_header_mode() 単独で A/B test(最大 impact 候補) +**Step 2**: mid_v3_enabled() 単独で A/B test +**Step 3**: mid_v3_debug_enabled() を追加 +**Step 4**: 累積効果確認(GO 閾値: +0.5%) + +**GO 条件**: build-level 変更のため +0.5% 以上 ## 4) 直近のログ(要点だけ) diff --git a/perf.data.fast_v3 b/perf.data.fast_v3 new file mode 100644 index 0000000000000000000000000000000000000000..e3bfb0cfbbed840f4abdfc644eb31c783c7e6ad5 GIT binary patch literal 70248 zcmd^o34Bvk_WujGASf*$D5y{b7nG6$rIc~ufq-#ABZ{aXZJMSu(ljASp@<^|!9m;* z2V_*7iW}lWK}B?2ip$8jQFmMiTyPnex;vuszxSMb+IP>pfso?-nfc{Ia+AJyzh}MY zo_pSX5C6z9qfRDx2g7a)!w1n z<*L0?wJTJ6mul};?LDf!SG6luTc_Gps$H$x`&28Lndji>R9W+a|4dk zcKKJ*bB#hi9oj;xhx&ckJKb&hwOhw0W^LWJZJYXYQ={0mM#5jRTV<;wq~E3!)t9Ft zN5ePLJN2iQj*~rFseaVbak7(An?)@hC;RQ8`cq5C$*y~<A19~$MRdkWt7isx*NWao2yKTzsFAw#VbP<{U!%0DiYHpiSvt+ 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