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:
@ -110,3 +110,63 @@
|
||||
1. 実装完了後、perf 再計測で効果を検証
|
||||
2. self% が 5-6% に達したら次フェーズ(C4-C7 ULTRA free群 5.41% の軽量化)へ
|
||||
3. それ以上の改善は narrow point(page_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%)の最適化に移行
|
||||
|
||||
Reference in New Issue
Block a user