feat(perf): Add headless baseline profiling script
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
import sys
|
||||
import os
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
# Add project root to sys.path
|
||||
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
||||
if project_root not in sys.path:
|
||||
sys.path.append(project_root)
|
||||
|
||||
from src.performance_monitor import get_monitor
|
||||
from src.aggregate import build_file_items
|
||||
from src.dag_engine import TrackDAG
|
||||
from src.models import Ticket
|
||||
|
||||
def run_aggregation_profile():
|
||||
monitor = get_monitor()
|
||||
base_dir = Path(project_root)
|
||||
# Get 30 python files for profiling
|
||||
files = [str(p.relative_to(base_dir)) for p in base_dir.glob("src/*.py")][:30]
|
||||
with monitor.scope("aggregation"):
|
||||
build_file_items(base_dir, files)
|
||||
|
||||
def run_dag_profile():
|
||||
monitor = get_monitor()
|
||||
tickets = []
|
||||
# Create 60 tickets with multiple dependencies to simulate complexity
|
||||
for i in range(60):
|
||||
deps = []
|
||||
if i > 0: deps.append(f"ticket_{i-1}")
|
||||
if i > 5: deps.append(f"ticket_{i-5}")
|
||||
if i > 10: deps.append(f"ticket_{i-10}")
|
||||
tickets.append(Ticket(
|
||||
id=f"ticket_{i}",
|
||||
description=f"Ticket {i}",
|
||||
depends_on=deps
|
||||
))
|
||||
dag = TrackDAG(tickets)
|
||||
with monitor.scope("dag_operations"):
|
||||
# Run operations 50 times per profile call
|
||||
for _ in range(50):
|
||||
dag.topological_sort()
|
||||
dag.has_cycle()
|
||||
|
||||
def print_metrics():
|
||||
monitor = get_monitor()
|
||||
metrics = monitor.get_metrics()
|
||||
print(f"{'Component':<30} | {'Avg (ms)':<12} | {'Count':<8} | {'Max (ms)':<12} | {'Min (ms)':<12}")
|
||||
print("-" * 85)
|
||||
# Collect all base component names
|
||||
components = set()
|
||||
for key in metrics.keys():
|
||||
if key.startswith("time_") and key.endswith("_ms") and not key.endswith("_avg"):
|
||||
components.add(key[5:-3])
|
||||
|
||||
for comp in sorted(list(components)):
|
||||
avg = metrics.get(f"time_{comp}_ms_avg", 0.0)
|
||||
count = int(metrics.get(f"count_{comp}", 0))
|
||||
max_val = metrics.get(f"max_{comp}_ms", 0.0)
|
||||
min_val = metrics.get(f"min_{comp}_ms", 0.0)
|
||||
print(f"{comp:<30} | {avg:<12.4f} | {count:<8} | {max_val:<12.4f} | {min_val:<12.4f}")
|
||||
|
||||
def main():
|
||||
monitor = get_monitor()
|
||||
monitor.enabled = True
|
||||
print("Starting Profiling Baseline...")
|
||||
print("Running aggregation profile (5 iterations)...")
|
||||
for _ in range(5):
|
||||
run_aggregation_profile()
|
||||
print("Running DAG profile (5 iterations)...")
|
||||
for _ in range(5):
|
||||
run_dag_profile()
|
||||
print("\nBaseline Performance Metrics:")
|
||||
print_metrics()
|
||||
monitor.stop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user