Skip to content

[aw][perf] render_detail: _render_shutdown_cycles iterates sd.modelMetrics.values() twice per cycle #903

@microsasa

Description

@microsasa

_render_shutdown_cycles in src/copilot_usage/render_detail.py (lines 243–244) makes two separate generator passes over sd.modelMetrics.values() per shutdown cycle to compute total_requests and total_output. Each pass walks all model-metrics entries again, so the function does 2 × M × C iterations instead of M × C (where M = number of distinct models, C = number of shutdown cycles).

Location

File: src/copilot_usage/render_detail.py
Function: _render_shutdown_cycles
Lines: 243–244

for ts, sd in summary.shutdown_cycles:
    date_str = ts.strftime("%Y-%m-%d %H:%M") if ts else "—"
    total_requests = sum(mm.requests.count for mm in sd.modelMetrics.values())   # pass 1
    total_output = sum(mm.usage.outputTokens for mm in sd.modelMetrics.values()) # pass 2
    table.add_row(...)

Fix

Merge both sums into a single pass:

for ts, sd in summary.shutdown_cycles:
    date_str = ts.strftime("%Y-%m-%d %H:%M") if ts else "—"
    total_requests = 0
    total_output = 0
    for mm in sd.modelMetrics.values():
        total_requests += mm.requests.count
        total_output += mm.usage.outputTokens
    table.add_row(
        date_str,
        str(sd.totalPremiumRequests),
        str(total_requests),
        format_tokens(total_output),
        format_duration(sd.totalApiDurationMs),
    )

Expected improvement: Halves the number of dict-value iterations per cycle. For a session with C cycles and M models per cycle, iteration count drops from 2 × M × C to M × C.

Testing requirement

Add a unit test for _render_shutdown_cycles (or the public render_session_detail) with a session containing multiple shutdown cycles each having at least two models. Assert:

  1. The rendered table shows the correct total_requests and total_output values for each cycle (correctness).
  2. Optionally: spy on sd.modelMetrics.values to confirm iteration count equals M per cycle (not 2M) as a regression guard.

Generated by Performance Analysis · ● 3.8M ·

Metadata

Metadata

Assignees

No one assigned

    Labels

    awCreated by agentic workflowaw-dispatchedIssue has been dispatched to implementerperfPerformance improvement

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions