## Phase PERF-ULTRA-REBASE-3: 正しいパラメータで再計測 (2025-12-11) **問題**: Phase REBASE-2 で iters=1M, ws=400 は軽すぎて ULTRA 関数が invisible(238 samples のみ)だったため、正しいパラメータで再実施。 **修正内容**: iters=10M, ws=8192(Phase REBASE-1 と同じパラメータで再計測) ### Mixed 16-1024B ホットパス(self% 上位, 1890 samples) | 順位 | 関数 | self% | 分類 | |------|------|-------|------| | **#1** | **free** | **29.22%** | free dispatcher | | **#2** | **main** | **19.27%** | benchmark overhead | | **#3** | **tiny_alloc_gate_fast** | **18.17%** | alloc gate | | #4 | tiny_c7_ultra_refill | 6.92% | C7 ULTRA refill | | #5 | malloc | 5.00% | malloc dispatcher | | #6 | tiny_region_id_write_header (lto_priv) | 4.29% | header write | | #7 | hak_super_lookup | 2.90% | segment lookup | | #8 | hak_free_at | 2.36% | free routing | | #9 | so_free | 2.60% | v3 free | | #10 | so_alloc_fast | 2.46% | v3 alloc | **スループット**: - Mixed 16-1024B: **30.6M ops/s** (10M iter, ws=8192) - C6-heavy 257-768B: **17.0M ops/s** (10M iter, ws=8192) ### C6-heavy ホットパス(self% 上位, 3027 samples) | 順位 | 関数 | self% | 分類 | |------|------|-------|------| | **#1** | **worker_run** | **10.66%** | benchmark loop | | **#2** | **free** | **25.13%** | free dispatcher | | **#3** | **hak_free_at** | **19.89%** | free routing | | #4 | hak_pool_free_v1_impl | 10.16% | pool v1 free | | #5 | hak_pool_try_alloc_v1_impl | 10.95% | pool v1 alloc | | #6 | pthread_once | 5.94% | initialization | | #7 | hak_pool_free_fast_v2_impl | 3.94% | pool v2 fallback | | #8 | hak_super_lookup | 4.39% | segment lookup | | #9 | malloc | 3.77% | malloc dispatcher | | #10 | hak_pool_try_alloc (part) | 0.66% | pool alloc slow | ### 分析 **Mixed 16-1024B での変化**: - free: 29.22% (benchmark 外のディスパッチャ部分) - tiny_alloc_gate_fast: 18.17% (前回 REBASE-1 の計測と一致) - C7 ULTRA refill: 6.92% (前回 REBASE-1 では 7.66% だったが、ワークロードにより変動範囲内) - C4-C7 ULTRA free 群: 個別には invisible (< 1% each) だが、合計で数%程度 - so_alloc系: 2.46% (so_alloc_fast) + 1.16% (so_alloc) = 約 3.62% - page_of/segment: hak_super_lookup 2.90% **C6-heavy での状況**: - pool v1 経路が dominant: hak_pool_free_v1_impl (10.16%) + hak_pool_try_alloc_v1_impl (10.95%) - hak_free_at: 19.89% (free routing overhead が大きい) - hak_super_lookup: 4.39% (segment lookup) - C6-heavy は完全に pool v1 経路を使用(前回の FREE_PATH_STATS 分析と一致) ### 次のボトルネック確定 **Mixed では**: - **free dispatcher 全体(29.22%)** が最大 - tiny_alloc_gate_fast(18.17%)が第二 - C7 ULTRA refill(6.92%)は既に薄い部類 **C6-heavy では**: - **hak_free_at(19.89%)** が最大の allocator 内部ボトルネック - pool v1 alloc/free(各 10%)は構造的なコスト - hak_super_lookup(4.39%)も削減余地あり ### 次フェーズ候補 1. **Option A: free dispatcher 最適化** (Mixed 向け) - free() 内部の routing logic を最適化 - hak_free_at の分岐を削減 - 期待効果: Mixed で free 29% → 25% 程度に削減(+1-2M ops/s) 2. **Option B: alloc gate 最適化** (Mixed 向け) - tiny_alloc_gate_fast(18.17%)の内部最適化 - class 判定や routing の直線化 - 期待効果: Mixed で alloc gate 18% → 15% 程度に削減(+1-2M ops/s) 3. **Option C: C6-heavy mid/pool 再設計** (C6 向け) - hak_free_at(19.89%)の C6 専用 fast path 追加 - pool v1 の lookup overhead 削減 - 期待効果: C6-heavy で 17M → 20-25M ops/s **推奨**: Option A または B(Mixed が本線のため)。C6-heavy は別途 mid 再設計フェーズで対応。 --- ### 生成ファイル 1. `/mnt/workdisk/public_share/hakmem/perf_ultra_mixed_v3.txt` - Mixed 16-1024B の complete perf report (1890 samples) 2. `/mnt/workdisk/public_share/hakmem/perf_ultra_c6_v3.txt` - C6-heavy の complete perf report (3027 samples) 3. `/mnt/workdisk/public_share/hakmem/CURRENT_TASK_PERF_REBASE3.md` - 本レポート