Files
hakmem/analyze_d1_results.py

128 lines
4.5 KiB
Python
Raw Normal View History

Phase 3 Finalization: D1 20-run validation, D2 frozen, baseline established Summary: - D1 (Free route cache): 20-run validation → PROMOTED TO DEFAULT - Baseline (20-run, ROUTE=0): 46.30M ops/s (mean), 46.30M (median) - Optimized (20-run, ROUTE=1): 47.32M ops/s (mean), 47.39M (median) - Mean gain: +2.19%, Median gain: +2.37% - Decision: GO (both criteria met: mean >= +1.0%, median >= +0.0%) - Implementation: Added HAKMEM_FREE_STATIC_ROUTE=1 to MIXED preset - D2 (Wrapper env cache): FROZEN - Previous result: -1.44% regression (TLS overhead > benefit) - Status: Research box (do not pursue further) - Default: OFF (not included in MIXED_TINYV3_C7_SAFE preset) - Baseline Phase 3: 46.04M ops/s (Mixed, 10-run, 2025-12-13) Cumulative Gains (Phase 2-3): B3: +2.89%, B4: +1.47%, C3: +2.20%, D1: +2.19% Total: ~7.6-8.9% (conservative: 7.6%, multiplicative: 8.93%) MID_V3 fix: +13% (structural change, Mixed OFF by default) Documentation Updates: - PHASE3_FINALIZATION_SUMMARY.md: Comprehensive Phase 3 report - PHASE3_CACHE_LOCALITY_NEXT_INSTRUCTIONS.md: D1/D2 final status - PHASE3_D1_FREE_ROUTE_CACHE_1_DESIGN.md: 20-run validation results - PHASE3_D2_WRAPPER_ENV_CACHE_1_DESIGN.md: FROZEN status - ENV_PROFILE_PRESETS.md: D1 ADOPT, D2 FROZEN - PHASE3_BASELINE_AND_CANDIDATES.md: Post-D1/D2 status - CURRENT_TASK.md: Phase 3 complete summary Next: - D3 requires perf validation (tiny_alloc_gate_fast self% ≥5%) - Or Phase 4 planning if no more D3-class targets - Current active optimizations: B3, B4, C3, D1, MID_V3 fix Files Changed: - docs/analysis/PHASE3_FINALIZATION_SUMMARY.md (new, 580+ lines) - docs/analysis/*.md (6 files updated with D1/D2 results) - CURRENT_TASK.md (Phase 3 status update) - analyze_d1_results.py (statistical analysis script) - core/bench_profile.h (D1 promoted to default in MIXED preset) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-13 22:42:22 +09:00
#!/usr/bin/env python3
import statistics
# Phase 3 Baseline (10-run)
baseline_10run = [
45753693, 46285007, 45977011, 46142131, 46068493,
45920245, 46143884, 46011560, 45995670, 46084818
]
# D1 Baseline (20-run, ROUTE=0)
d1_baseline = [
46264909, 46143884, 46296296, 46439628, 46296296,
46189376, 46296296, 46499548, 46296296, 46387832,
46143884, 46296296, 46143884, 46296296, 46439628,
46296296, 46296296, 46439628, 46296296, 46296296
]
# D1 Optimized (20-run, ROUTE=1)
d1_optimized = [
47259147, 47259147, 47501710, 47393365, 47165991,
47165991, 47393365, 47165991, 47393365, 47393365,
47165991, 47393365, 47165991, 47393365, 47393365,
47393365, 47393365, 47393365, 47165991, 47393365
]
def analyze(data, label):
mean = statistics.mean(data)
median = statistics.median(data)
stddev = statistics.stdev(data) if len(data) > 1 else 0
min_val = min(data)
max_val = max(data)
print(f"\n{label}:")
print(f" Mean: {mean:>12.2f} ops/s ({mean/1e6:.2f}M ops/s)")
print(f" Median: {median:>12.2f} ops/s ({median/1e6:.2f}M ops/s)")
print(f" StdDev: {stddev:>12.2f} ops/s ({stddev/1e6:.2f}M ops/s)")
print(f" Min: {min_val:>12.2f} ops/s ({min_val/1e6:.2f}M ops/s)")
print(f" Max: {max_val:>12.2f} ops/s ({max_val/1e6:.2f}M ops/s)")
return mean, median, stddev
print("=" * 70)
print("PHASE 3 FINALIZATION - D1 STATISTICAL ANALYSIS")
print("=" * 70)
baseline_mean, baseline_median, baseline_stddev = analyze(baseline_10run, "BASELINE_PHASE3 (10-run)")
d1_base_mean, d1_base_median, d1_base_stddev = analyze(d1_baseline, "D1_BASELINE (20-run, ROUTE=0)")
d1_opt_mean, d1_opt_median, d1_opt_stddev = analyze(d1_optimized, "D1_OPTIMIZED (20-run, ROUTE=1)")
print("\n" + "=" * 70)
print("D1 GAIN ANALYSIS")
print("=" * 70)
mean_gain = ((d1_opt_mean - d1_base_mean) / d1_base_mean) * 100
median_gain = ((d1_opt_median - d1_base_median) / d1_base_median) * 100
variance_ratio = d1_opt_stddev / d1_base_stddev if d1_base_stddev > 0 else 0
print(f"\nMean gain: {mean_gain:>+6.2f}%")
print(f"Median gain: {median_gain:>+6.2f}%")
print(f"Variance ratio: {variance_ratio:>6.2f}x (optimized/baseline)")
print("\n" + "=" * 70)
print("D1 DECISION CRITERIA")
print("=" * 70)
print("\nCriteria from PHASE3_CACHE_LOCALITY_NEXT_INSTRUCTIONS.md:65:")
print(" IF mean_gain >= +1.0% AND median_gain >= +0.0%:")
print(" → GO: Promote HAKMEM_FREE_STATIC_ROUTE=1 to default")
print(" ELSE IF both within ±1.0%:")
print(" → NEUTRAL: Keep as opt-in research box")
print(" ELSE:")
print(" → FLAG_FOR_INVESTIGATION")
print(f"\nActual results:")
print(f" Mean gain: {mean_gain:>+6.2f}% {'✓ >= +1.0%' if mean_gain >= 1.0 else '✗ < +1.0%'}")
print(f" Median gain: {median_gain:>+6.2f}% {'✓ >= +0.0%' if median_gain >= 0.0 else '✗ < +0.0%'}")
if mean_gain >= 1.0 and median_gain >= 0.0:
decision = "GO"
explanation = "Both criteria met: mean >= +1.0% AND median >= +0.0%"
elif abs(mean_gain) <= 1.0 and abs(median_gain) <= 1.0:
decision = "NEUTRAL"
explanation = "Both gains within ±1.0% threshold"
else:
decision = "FLAG_FOR_INVESTIGATION"
explanation = "Criteria not met, requires investigation"
print(f"\n{'=' * 70}")
print(f"DECISION: {decision}")
print(f"{'=' * 70}")
print(f"Reason: {explanation}")
print()
if decision == "GO":
print("ACTION REQUIRED:")
print(" 1. Update core/bench_profile.h MIXED_TINYV3_C7_SAFE preset")
print(" Add: bench_setenv_default(\"HAKMEM_FREE_STATIC_ROUTE\", \"1\");")
print(" 2. Rebuild: make clean && make bench_random_mixed_hakmem")
print(" 3. Sanity check: 1-run verification")
elif decision == "NEUTRAL":
print("ACTION REQUIRED:")
print(" 1. Keep HAKMEM_FREE_STATIC_ROUTE as opt-in research box")
print(" 2. Document as available but not default in MIXED preset")
else:
print("ACTION REQUIRED:")
print(" 1. Investigate why criteria not met")
print(" 2. Review benchmark variance and methodology")
print("\n" + "=" * 70)
print("SUMMARY FOR DOCUMENTATION")
print("=" * 70)
print(f"""
BASELINE_PHASE3 (10-run):
Mean: {baseline_mean/1e6:.2f}M ops/s, Median: {baseline_median/1e6:.2f}M ops/s, StdDev: {baseline_stddev/1e6:.2f}M
D1_BASELINE (20-run, ROUTE=0):
Mean: {d1_base_mean/1e6:.2f}M ops/s, Median: {d1_base_median/1e6:.2f}M ops/s, StdDev: {d1_base_stddev/1e6:.2f}M
D1_OPTIMIZED (20-run, ROUTE=1):
Mean: {d1_opt_mean/1e6:.2f}M ops/s, Median: {d1_opt_median/1e6:.2f}M ops/s, StdDev: {d1_opt_stddev/1e6:.2f}M
D1 GAIN:
Mean: {mean_gain:+.2f}%, Median: {median_gain:+.2f}%
D1 DECISION: {decision}
""")