perf(gui): Resolve massive frametime bloat by throttling telemetry and optimizing UI updates

This commit is contained in:
2026-02-23 15:28:51 -05:00
parent 0535e436d5
commit b415e4ec19
10 changed files with 152 additions and 23 deletions

View File

@@ -0,0 +1,38 @@
import pytest
import time
from api_hook_client import ApiHookClient
def test_idle_performance_requirements():
"""
Requirement: GUI must maintain < 16.6ms frametime on idle.
This test will fail if the performance is regressed.
"""
client = ApiHookClient(base_url="http://127.0.0.1:8999")
try:
# Get multiple samples to be sure
samples = []
for _ in range(5):
perf_data = client.get_performance()
samples.append(perf_data)
time.sleep(0.1)
# Parse the JSON metrics
for sample in samples:
performance = sample.get('performance', {})
frame_time = performance.get('last_frame_time_ms', 0.0)
# If frame_time is 0.0, it might mean the app just started and hasn't finished a frame yet
# or it's not actually running the main loop.
assert frame_time < 16.6, f"Frame time {frame_time}ms exceeds 16.6ms threshold"
except Exception as e:
pytest.fail(f"Failed to verify performance requirements: {e}")
if __name__ == "__main__":
client = ApiHookClient(base_url="http://127.0.0.1:8999")
try:
perf = client.get_performance()
print(f"Current performance: {perf}")
except Exception as e:
print(f"App not running or error: {e}")

View File

@@ -0,0 +1,49 @@
import pytest
import time
from api_hook_client import ApiHookClient
def test_comms_volume_stress_performance():
"""
Stress test: Inject many comms entries and verify performance doesn't degrade.
"""
client = ApiHookClient(base_url="http://127.0.0.1:8999")
try:
# 1. Capture baseline
baseline = client.get_performance()['performance']
baseline_ft = baseline.get('last_frame_time_ms', 0.0)
# 2. Inject 50 "dummy" comms entries via the session hook
# Note: In a real app we might need a specific 'inject_comms' hook if we wanted
# to test the _flush_pending_comms logic specifically, but updating session
# often triggers similar UI updates or usage recalculations.
# Actually, let's use post_session to add a bunch of history entries.
large_session = []
for i in range(50):
large_session.append({"role": "user", "content": f"Stress test entry {i} " * 10})
client.post_session(large_session)
# Give it a moment to process UI updates if any
time.sleep(1.0)
# 3. Capture stress performance
stress = client.get_performance()['performance']
stress_ft = stress.get('last_frame_time_ms', 0.0)
print(f"Baseline FT: {baseline_ft:.2f}ms, Stress FT: {stress_ft:.2f}ms")
# Requirement: Still under 16.6ms even with 50 new entries
assert stress_ft < 16.6, f"Stress frame time {stress_ft:.2f}ms exceeds 16.6ms threshold"
except Exception as e:
pytest.fail(f"Stress test failed: {e}")
if __name__ == "__main__":
client = ApiHookClient(base_url="http://127.0.0.1:8999")
try:
perf = client.get_performance()
print(f"Current performance: {perf}")
except Exception as e:
print(f"App not running or error: {e}")