Generate human-readable report.
(
self, format_type: str = "text", threshold_ms: float = 50.0
)
| 317 | return tree |
| 318 | |
| 319 | def generate_report( |
| 320 | self, format_type: str = "text", threshold_ms: float = 50.0 |
| 321 | ) -> str: |
| 322 | """Generate human-readable report.""" |
| 323 | if format_type == "json": |
| 324 | return json.dumps(self.generate_json(), indent=2) |
| 325 | |
| 326 | # Text report |
| 327 | lines: list[str] = [] |
| 328 | |
| 329 | total_time = self.get_total_time() |
| 330 | phases = self.get_phase_times() |
| 331 | fastled_headers = self.get_fastled_headers() |
| 332 | top_ops = self.get_top_operations(20) |
| 333 | |
| 334 | # Header |
| 335 | lines.append("=" * 80) |
| 336 | lines.append("FASTLED COMPILATION PERFORMANCE REPORT") |
| 337 | lines.append("=" * 80) |
| 338 | lines.append(f"Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") |
| 339 | lines.append(f"Compiler: {os.environ.get('COMPILER', 'clang++')}") |
| 340 | lines.append("File: ci/perf/test_compile.cpp") |
| 341 | lines.append("") |
| 342 | |
| 343 | # Summary |
| 344 | lines.append("SUMMARY") |
| 345 | lines.append("-" * 80) |
| 346 | lines.append(f"Total Compilation Time: {total_time:,.2f} ms") |
| 347 | frontend_time = phases.get("Frontend", 0) |
| 348 | backend_time = phases.get("Backend", 0) |
| 349 | if total_time > 0: |
| 350 | lines.append( |
| 351 | f"Frontend Time: {frontend_time:,.2f} ms ({frontend_time / total_time * 100:.1f}%)" |
| 352 | ) |
| 353 | lines.append( |
| 354 | f"Backend Time: {backend_time:,.2f} ms ({backend_time / total_time * 100:.1f}%)" |
| 355 | ) |
| 356 | lines.append("") |
| 357 | |
| 358 | # Compilation Phases |
| 359 | lines.append("COMPILATION PHASES") |
| 360 | lines.append("-" * 80) |
| 361 | for phase_name in ["Source", "Templates", "Lexing", "Preprocessing"]: |
| 362 | phase_time = phases.get(phase_name, 0) |
| 363 | if phase_time > 0 and total_time > 0: |
| 364 | lines.append( |
| 365 | f"{phase_name:25s} {phase_time:8.2f} ms ({phase_time / total_time * 100:5.1f}%)" |
| 366 | ) |
| 367 | lines.append("") |
| 368 | |
| 369 | # FastLED Headers (Level 1) |
| 370 | lines.append("FASTLED HEADERS (Level 1 - Direct Includes)") |
| 371 | lines.append("-" * 80) |
| 372 | for name, time_ms in fastled_headers[:20]: |
| 373 | flag = " (SLOW)" if time_ms > threshold_ms else "" |
| 374 | lines.append(f" {time_ms:6.1f} ms - {name}{flag}") |
| 375 | lines.append("") |
| 376 |
no test coverage detected