Phase PERF-ULTRA-ALLOC-OPT-1 (改訂版): C7 ULTRA 内部最適化

設計判断:
- 寄生型 C7 ULTRA_FREE_BOX を削除(設計的に不整合)
- C7 ULTRA は C4/C5/C6 と異なり専用 segment + TLS を持つ独立サブシステム
- tiny_c7_ultra.c 内部で直接最適化する方針に統一

実装内容:
1. 寄生型パスの削除
   - core/box/tiny_c7_ultra_free_box.{h,c} 削除
   - core/box/tiny_c7_ultra_free_env_box.h 削除
   - Makefile から tiny_c7_ultra_free_box.o 削除
   - malloc_tiny_fast.h を元の tiny_c7_ultra_alloc/free 呼び出しに戻す

2. TLS 構造の最適化 (tiny_c7_ultra_box.h)
   - count を struct 先頭に移動(L1 cache locality 向上)
   - 配列ベース TLS キャッシュに変更(cap=128, C6 同等)
   - freelist: linked-list → BASE pointer 配列
   - cold フィールド(seg_base/seg_end/meta)を後方配置

3. alloc の純 TLS pop 化 (tiny_c7_ultra.c)
   - hot path: 1 分岐のみ(count > 0)
   - TLS access は 1 回のみ(ctx に cache)
   - ENV check を呼び出し側に移動
   - segment/page_meta アクセスは refill 時(cold path)のみ

4. free の UF-3 segment learning 維持
   - 最初の free で segment 学習(seg_base/seg_end を TLS に記憶)
   - 以降は範囲チェック → TLS push
   - 範囲外は v3 free にフォールバック

実測値 (Mixed 16-1024B, 1M iter, ws=400):
- tiny_c7_ultra_alloc self%: 7.66% (維持 - 既に最適化済み)
- tiny_c7_ultra_free self%: 3.50%
- Throughput: 43.5M ops/s

評価: 部分達成
- 設計一貫性の回復: 成功
- Array-based TLS cache 移行: 成功
- pure TLS pop パターン統一: 成功
- perf self% 削減(7.66% → 5-6%): 未達成(既に最適)

C7 ULTRA は独立サブシステムとして tiny_c7_ultra.c に閉じる設計を維持。
次は refill path 最適化または C4-C7 ULTRA free 群の軽量化へ。

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Moe Charm (CI)
2025-12-11 20:39:46 +09:00
parent b381219a68
commit 753909fa4d
5 changed files with 351 additions and 162 deletions

View File

@ -110,3 +110,63 @@
1. 実装完了後perf 再計測で効果を検証
2. self% 5-6% に達したら次フェーズC4-C7 ULTRA free群 5.41% の軽量化
3. それ以上の改善は narrow pointpage_of/segment 判定, so_alloc系の検討が必要
---
## Phase PERF-ULTRA-ALLOC-OPT-1 実装完了 (2025-12-11)
### 設計判断
**方針転換**: 寄生型の C7 ULTRA_FREE_BOX は設計的に不整合と判断し撤去
- C7 ULTRA C4/C5/C6 ULTRA と異なり専用 segment + TLS を持つ独立サブシステム
- 寄生型パターンは他の ULTRA クラスには適用可能だがC7 には不適合
- **C7 tiny_c7_ultra.c 内部だけで最適化する方針に切り替え**
### 実装内容
1. **寄生型パスの削除**
- `core/box/tiny_c7_ultra_free_box.{h,c}` を削除
- `core/box/tiny_c7_ultra_free_env_box.h` を削除
- Makefile から `tiny_c7_ultra_free_box.o` を削除
- malloc_tiny_fast.h を元の `tiny_c7_ultra_alloc()` / `tiny_c7_ultra_free()` 呼び出しに戻す
2. **TLS 構造の最適化** (`tiny_c7_ultra_box.h`)
- **count struct の先頭に移動** (L1 cache locality 向上)
- 配列ベース TLS キャッシュに変更capacity=128, C6 と同じ
- freelist: linked-list BASE pointer 配列に変更
- cold フィールドseg_base/seg_end/segment metaを後方に配置
3. **alloc の純 TLS pop 化** (`tiny_c7_ultra.c`)
- **hot path: 1 分岐のみ** (count > 0)
- TLS access は 1 回のみctx に cache
- ENV check を呼び出し側malloc_tiny_fast.hに移動
- segment/page_meta アクセスは refill 時cold pathのみ
4. **free の UF-3 segment learning 維持**
- 最初の free で segment 学習seg_base/seg_end を TLS に記憶)
- 以降は seg_base/seg_end 範囲チェック → TLS push
- 範囲外は v3 free にフォールバック
### 実測値 (Mixed 16-1024B, 1M iter, ws=400)
**Perf profile (self%)**:
- `tiny_c7_ultra_alloc`: **7.66%** (維持 - 既に最適化済み)
- `tiny_c7_ultra_free`: **3.50%**
- Throughput: **43.5M ops/s** (1M iterations)
**注**: 今回の実装で内部構造を array-based に変更し、pure TLS pop パターンに統一したが、
perf self% は baseline と同等。これは元の linked-list 実装も既に効率的だったことを示す。
今後の最適化は refill ロジックsegment 取得部分)や page_meta 管理の軽量化が必要。
### 評価
**部分達成**:
- 寄生型パターンの撤回による設計一貫性の回復: **成功**
- Array-based TLS cache への移行: **成功**
- pure TLS pop パターンへの統一: **成功**
- perf self% 削減7.66% → 5-6%: **未達成** (既に最適)
**次のアクション**:
1. refill path の最適化segment 取得の軽量化)
2. page_meta 管理の簡略化bitmap 化など)
3. C4-C7 ULTRA free 群5.41%)の最適化に移行