# HAKMEM Tiny リファクタリング - クイックスタートガイド ## 本ドキュメントについて 3つの計画書を読む時間がない場合、このガイドで必要な情報をすべて把握できます。 --- ## 1分で理解 **目標**: hakmem_tiny_free.inc (1470行) を 500行以下に分割 **効果**: - Fast path: 20+ instructions → 3-4 instructions (-80%) - Throughput: +10-25% - Code review: 3h → 30min (-90%) **期間**: 6週間 (20時間コーディング) --- ## 5分で理解 ### 現状の問題 ``` hakmem_tiny_free.inc (1470行) ├─ Free パス (400行) ├─ SuperSlab Alloc (400行) ├─ SuperSlab Free (400行) ├─ Query (commented-out, 100行) └─ Shutdown (30行) 問題: 単一ファイルに4つの責務が混在 → 複雑度が高い, バグが多発, 保守が困難 ``` ### 解決策 ``` 9つのBoxに分割 (各500行以下): Box 1: tiny_atomic.h (80行) - Atomic ops Box 2: tiny_remote_queue.inc.h (300行) - Remote queue Box 3: hakmem_tiny_superslab.{c,h} (810行, 既存) Box 4: tiny_adopt.inc.h (300行) - Adopt logic Box 5: tiny_alloc_fast.inc.h (250行) - Fast path (3-4 cmd) Box 6: tiny_free_fast.inc.h (200行) - Same-thread free Box 7: Statistics & Query (existing) Box 8: Lifecycle & Init (split into 5 files) Box 9: Intel-specific (split into 3 files) 各Boxが単一責務 → テスト可能 → 保守しやすい ``` --- ## 15分で全体理解 ### 実装計画 (6週間) | Week | Focus | Files | Lines | |------|-------|-------|-------| | 1 | Fast Path | tiny_atomic.h, tiny_alloc_fast.inc.h, tiny_free_fast.inc.h | 530 | | 2 | Remote/Own | tiny_remote_queue.inc.h, tiny_owner.inc.h | 420 | | 3 | Publish/Adopt | tiny_adopt.inc.h, mailbox split | 430 | | 4 | Alloc/Free Slow | tiny_alloc_slow.inc.h, tiny_free_remote.inc.h, tiny_free_guard.inc.h | 720 | | 5 | Lifecycle/Intel | tiny_init_*.inc.h, tiny_lifecycle_*.inc.h, tiny_intel_*.inc.h | 1070 | | 6 | Test/Bench | Unit tests, Integration tests, Performance validation | - | ### 期待効果 | Metric | Before | After | Improvement | |--------|--------|-------|-------------| | Fast path cmd | 20+ | 3-4 | -80% | | Max file size | 1470行 | 500行 | -66% | | Code review | 3h | 30min | -90% | | Throughput | 52 M/s | 58-65 M/s | +10-25% | --- ## 30分で準備完了 ### Step 1: 3つのドキュメントを確認 ```bash ls -lh REFACTOR_*.md # 1. REFACTOR_SUMMARY.md (13KB) を読む (15分) # 2. REFACTOR_PLAN.md (22KB) で詳細確認 (30分) # 3. REFACTOR_IMPLEMENTATION_GUIDE.md (17KB) で実装例確認 (20分) ``` ### Step 2: 現状ベースラインを記録 ```bash # Fast path latency を測定 ./larson_hakmem 16 1 1000 1000 0 > baseline.txt # Assembly を確認 gcc -S -O3 core/hakmem_tiny.c # Include 依存関係を可視化 cd core && \ grep -h "^#include" *.c *.h | sort | uniq | wc -l # Expected: 100+ includes ``` ### Step 3: Week 1 の計画を立てる ```bash # REFACTOR_IMPLEMENTATION_GUIDE.md Phase 1.1-1.4 をプリントアウト wc -l core/tiny_atomic.h core/tiny_alloc_fast.inc.h core/tiny_free_fast.inc.h # Expected: 80 + 250 + 200 = 530行 # テストテンプレートを確認 # REFACTOR_IMPLEMENTATION_GUIDE.md の Testing Framework セクション ``` --- ## よくある質問 ### Q1: 実装の優先順位は? **A**: 箱理論に基づく依存関係順: 1. **Box 1 (tiny_atomic.h)** - 最下層、他すべてが依存 2. **Box 2 (Remote/Ownership)** - リモート通信の基盤 3. **Box 3 (SuperSlab)** - 中核アロケータ (既存) 4. **Box 4 (Publish/Adopt)** - マルチスレッド連携 5. **Box 5-6 (Alloc/Free)** - メインパス 6. **Box 7-9** - 周辺・最適化 詳細: REFACTOR_PLAN.md Phase 3 --- ### Q2: パフォーマンス回帰のリスクは? **A**: 4段階の検証で排除: 1. **Assembly review** - 命令数を確認 (Week 1) 2. **Unit tests** - Box ごとのテスト (Week 1-5) 3. **Integration tests** - End-to-end テスト (Week 5-6) 4. **Larson benchmark** - 全体パフォーマンス (Week 6) 詳細: REFACTOR_IMPLEMENTATION_GUIDE.md の Performance Validation --- ### Q3: 既存コードとの互換性は? **A**: 完全に保つ: - 古い .inc ファイルは削除しない - Feature flags で新旧を切り替え可能 (HAKMEM_TINY_NEW_FAST_PATH=0) - Rollback plan が完備されている 詳細: REFACTOR_IMPLEMENTATION_GUIDE.md の Rollback Plan --- ### Q4: 循環依存はどう防ぐ? **A**: 層状の DAG (Directed Acyclic Graph) 設計: ``` Layer 0 (tiny_atomic.h) ↓ Layer 1 (tiny_remote_queue.inc.h) ↓ Layer 2-3 (SuperSlab, Publish/Adopt) ↓ Layer 4-6 (Alloc/Free) ↓ Layer 7-9 (Stats, Lifecycle, Intel) 各層は上位層にのみ依存 → 循環依存なし ``` 詳細: REFACTOR_PLAN.md Phase 5 --- ### Q5: テストはどこまで書く? **A**: 3段階: | Level | Coverage | Time | |-------|----------|------| | Unit | 個々の関数テスト | 30min/func | | Integration | パス全体テスト | 1h/path | | Performance | Larson benchmark | 2h | 例: REFACTOR_IMPLEMENTATION_GUIDE.md の Testing Framework --- ## 実装チェックリスト (印刷向け) ### Week 1: Fast Path ``` □ tiny_atomic.h を作成 □ macros: load, store, cas, exchange □ unit tests を書く □ コンパイル確認 □ tiny_alloc_fast.inc.h を作成 □ tiny_alloc_fast_pop() (3-4 cmd) □ tiny_alloc_fast_push() □ unit tests □ Cache hit rate を測定 □ tiny_free_fast.inc.h を作成 □ tiny_free_fast() (ownership check) □ Same-thread free パス □ unit tests □ hakmem_tiny_free.inc を refactor □ Fast path を抽出 (1470 → 800行) □ コンパイル確認 □ Integration tests 実行 □ Larson benchmark で +10% を目指す ``` ### Week 2-6: その他の Box - REFACTOR_PLAN.md Phase 3 を参照 - REFACTOR_IMPLEMENTATION_GUIDE.md で各 Box の実装例を確認 - 毎週 Benchmark を実行して進捗を記録 --- ## デバッグのコツ ### Include order エラーが出た場合 ```bash # Include の依存関係を確認 grep "^#include" core/tiny_*.h | grep -v "<" | head -20 # Compilation order を確認 gcc -c -E core/hakmem_tiny.c 2>&1 | grep -A5 "error:" # 解決策: REFACTOR_PLAN.md Phase 5 の include order を参照 ``` ### パフォーマンスが低下した場合 ```bash # Assembly を確認 gcc -S -O3 core/hakmem_tiny.c grep -A10 "tiny_alloc_fast_pop:" core/hakmem_tiny.s | wc -l # Expected: <= 8 instructions # Profiling perf record -g ./larson_hakmem 16 1 1000 1000 0 perf report # Hot spot を特定して最適化 ``` ### テストが失敗した場合 ```bash # Unit test を詳細表示 ./test_tiny_atomic -v # 特定の Box をテスト gcc -I./core tests/test_tiny_atomic.c -lhakmem -o /tmp/test /tmp/test # 既知の問題がないか REFACTOR_PLAN.md Phase 7 (Risk) を確認 ``` --- ## 重要なリマインダー 1. **Baseline を記録**: Week 1 開始前に必ず larson benchmark を実行 2. **毎週ベンチマーク**: パフォーマンス回帰を早期発見 3. **テスト優先**: コード量より テストカバレッジを重視 4. **Rollback plan**: 必ず理解して実装開始 5. **ドキュメント更新**: 各 Box 完成時に doc を更新 --- ## 次のステップ ```bash # Step 1: REFACTOR_SUMMARY.md を読む less REFACTOR_SUMMARY.md # Step 2: REFACTOR_PLAN.md で詳細確認 less REFACTOR_PLAN.md # Step 3: Baseline ベンチマークを実行 make clean && make ./larson_hakmem 16 1 1000 1000 0 > baseline.txt # Step 4: Week 1 の実装を開始 cd core # ... tiny_atomic.h を作成 ``` --- ## 連絡先・質問 - **戦略/分析**: REFACTOR_PLAN.md - **実装例**: REFACTOR_IMPLEMENTATION_GUIDE.md - **期待効果**: REFACTOR_SUMMARY.md ✨ **Happy Refactoring!** ✨