## Summary Fixed CRITICAL bottleneck (mincore overhead) and macro definition bug. Result: 2-3x performance improvement across all benchmarks. ## Performance Results - Larson 1T: 631K → 2.73M ops/s (+333%) 🚀 - bench_random_mixed (128B): 768K → 2.26M ops/s (+194%) 🚀 - bench_random_mixed (512B): → 1.43M ops/s (new) - [HEADER_INVALID] messages: Many → ~Zero ✅ ## Changes ### 1. Hybrid mincore Optimization (317-634x faster) **Problem**: `hak_is_memory_readable()` calls mincore() syscall on EVERY free - Cost: 634 cycles/call - Impact: 40x slower than System malloc **Solution**: Check alignment BEFORE calling mincore() - Step 1 (1-byte header): `if ((ptr & 0xFFF) == 0)` → only 0.1% call mincore - Step 2 (16-byte header): `if ((ptr & 0xFFF) < HEADER_SIZE)` → only 0.4% call mincore - Result: 634 → 1-2 cycles effective (99.6% skip mincore) **Files**: - core/tiny_free_fast_v2.inc.h:53-71 - Step 1 hybrid check - core/box/hak_free_api.inc.h:94-107 - Step 2 hybrid check - core/hakmem_internal.h:281-312 - Performance warning added ### 2. HAK_RET_ALLOC Macro Fix (CRITICAL BUG) **Problem**: Macro definition order prevented Phase 7 header write - hakmem_tiny.c:130 defined legacy macro (no header write) - tiny_alloc_fast.inc.h:67 had `#ifndef` guard → skipped! - Result: Headers NEVER written → All frees failed → Slow path **Solution**: Force Phase 7 macro to override legacy - hakmem_tiny.c:119 - Added `#ifndef HAK_RET_ALLOC` guard - tiny_alloc_fast.inc.h:69-72 - Added `#undef` before redefine ### 3. Magic Byte Fix **Problem**: Release builds don't write magic byte, but free ALWAYS checks it - Result: All headers marked as invalid **Solution**: ALWAYS write magic byte (same 1-byte write, no overhead) - tiny_region_id.h:50-54 - Removed `#if !HAKMEM_BUILD_RELEASE` guard ## Technical Details ### Hybrid mincore Effectiveness | Case | Frequency | Cost | Weighted | |------|-----------|------|----------| | Normal (Step 1) | 99.9% | 1-2 cycles | 1-2 | | Page boundary | 0.1% | 634 cycles | 0.6 | | **Total** | - | - | **1.6-2.6 cycles** | **Improvement**: 634 → 1.6 cycles = **317-396x faster!** ### Macro Fix Impact **Before**: HAK_RET_ALLOC(cls, ptr) → return (ptr) // No header write **After**: HAK_RET_ALLOC(cls, ptr) → return tiny_region_id_write_header((ptr), (cls)) **Result**: Headers properly written → Fast path works → +194-333% performance ## Investigation Task Agent Ultrathink analysis identified: 1. mincore() syscall overhead (634 cycles) 2. Macro definition order conflict 3. Release/Debug build mismatch (magic byte) Full report: PHASE7_DESIGN_REVIEW.md (23KB, 758 lines) ## Related - Phase 7-1.0: PoC implementation (+39%~+436%) - Phase 7-1.1: Dual-header dispatch (Task Agent) - Phase 7-1.2: Page boundary SEGV fix (100% crash-free) - Phase 7-1.3: Hybrid mincore + Macro fix (this commit) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
16 KiB
Executable File
16 KiB
Executable File