| 25 | |
| 26 | |
| 27 | class ResultAnalyzer: |
| 28 | def __init__(self, results_file: Path): |
| 29 | self.results_file = results_file |
| 30 | self.results: list[ProfileResult] = [] |
| 31 | self.variants: dict[str, list[ProfileResult]] = {} |
| 32 | |
| 33 | def load_results(self) -> None: |
| 34 | """Load and parse JSON results""" |
| 35 | with open(self.results_file) as f: |
| 36 | data = json.load(f) |
| 37 | |
| 38 | for entry in data: |
| 39 | result = ProfileResult(**entry) |
| 40 | self.results.append(result) |
| 41 | # Group by variant for comparison tests |
| 42 | if result.variant not in self.variants: |
| 43 | self.variants[result.variant] = [] |
| 44 | self.variants[result.variant].append(result) |
| 45 | |
| 46 | def compute_statistics( |
| 47 | self, results: list[ProfileResult] | None = None |
| 48 | ) -> dict[str, float]: |
| 49 | """Compute best/median/worst/stdev for a set of results""" |
| 50 | if results is None: |
| 51 | results = self.results |
| 52 | |
| 53 | if not results: |
| 54 | return { |
| 55 | "best": 0, |
| 56 | "median": 0, |
| 57 | "worst": 0, |
| 58 | "stdev": 0, |
| 59 | "count": 0, |
| 60 | } |
| 61 | |
| 62 | ns_per_call = [r.ns_per_call for r in results] |
| 63 | |
| 64 | return { |
| 65 | "best": min(ns_per_call), |
| 66 | "median": statistics.median(ns_per_call), |
| 67 | "worst": max(ns_per_call), |
| 68 | "stdev": statistics.stdev(ns_per_call) if len(ns_per_call) > 1 else 0, |
| 69 | "count": len(ns_per_call), |
| 70 | } |
| 71 | |
| 72 | def generate_report(self) -> str: |
| 73 | """Generate markdown report for AI consumption""" |
| 74 | target = self.results[0].target if self.results else "unknown" |
| 75 | |
| 76 | # Check if this is a comparison test (multiple variants) |
| 77 | if len(self.variants) > 1: |
| 78 | return self._generate_comparison_report(target) |
| 79 | else: |
| 80 | return self._generate_single_variant_report(target) |
| 81 | |
| 82 | def _generate_single_variant_report(self, target: str) -> str: |
| 83 | """Generate report for single-variant tests""" |
| 84 | stats = self.compute_statistics() |