Goal
Steady 120 Hz without drops (and headroom for 144 Hz): every frame ≤ 8.3 ms build and ≤ 8.3 ms raster, no multi-frame hitches on common actions.
How it was measured
Profile builds on Linux (Hyprland, 120 Hz monitor, AMD iGPU, Impeller GLES), two harnesses added in this investigation:
benchmark/app_perf_bench.dart: the real shell driven through the Demo Playground with a throwaway data directory and in-memory secrets. Scenarios: idle, sidebar toggle, run a 5000-row query, grid vertical / horizontal scroll, hover, typing, tabs, connections tree with 1500 tables (expand / scroll / collapse). Reports FrameTiming, presented-frame intervals from the raster timeline, and optionally CPU profile, allocations and engine timeline per scenario.
benchmark/grid_perf_bench.dart: the grid alone (5000×120), modes scroll, edit, select, dialog, rerun.
Caveats found along the way: recording the Dart timeline stream allocates heavily inside the framework and inflates GC; the in-process VM service client itself costs CPU; FrameTiming.buildDuration does not include flushSemantics.
Results (real app, window 2056×2616)
| Scenario |
build p50 / max |
raster p50 |
Verdict |
| Idle |
nothing drawn |
— |
ok |
| Sidebar toggle |
4.0 / 7.1 ms |
0.8 ms |
too heavy for 144 Hz → #984 |
| Run 5000-row query |
— / 54–75 ms |
1.0 ms |
one big hitch → #982, #981 |
| Grid vertical scroll |
1.4 / 3.4 ms |
0.8 ms |
ok |
| Grid horizontal scroll |
0.1 / 12–20 ms |
0.8 ms |
window-shift hitches → #983 |
| Hover over grid |
0.1 / 0.3 ms |
0.8 ms |
ok |
| Typing in editor |
2.6 / 5.0 ms |
0.9 ms |
ok |
| Tab switch |
— / 6.8–7.9 ms |
0.9 ms |
tight → #985 |
| Tree 1500 tables: expand / scroll / collapse |
≤ 5.9 / ≤ 2.8 / ≤ 1.8 ms |
1.2–1.3 ms |
ok |
All scenarios present at exactly 60 fps on Linux regardless of cost → #980 (engine).
Children
Already fixed in this cycle: #875, #879, #885, #972 (grid rebuilds), #874, #876, #877, #878, #886.
Related
#723 (connections tree @ 120 Hz: measured within budget with 1500 tables), #739 (QA sign-off).
Goal
Steady 120 Hz without drops (and headroom for 144 Hz): every frame ≤ 8.3 ms build and ≤ 8.3 ms raster, no multi-frame hitches on common actions.
How it was measured
Profile builds on Linux (Hyprland, 120 Hz monitor, AMD iGPU, Impeller GLES), two harnesses added in this investigation:
benchmark/app_perf_bench.dart: the real shell driven through the Demo Playground with a throwaway data directory and in-memory secrets. Scenarios: idle, sidebar toggle, run a 5000-row query, grid vertical / horizontal scroll, hover, typing, tabs, connections tree with 1500 tables (expand / scroll / collapse). Reports FrameTiming, presented-frame intervals from the raster timeline, and optionally CPU profile, allocations and engine timeline per scenario.benchmark/grid_perf_bench.dart: the grid alone (5000×120), modesscroll,edit,select,dialog,rerun.Caveats found along the way: recording the
Darttimeline stream allocates heavily inside the framework and inflates GC; the in-process VM service client itself costs CPU;FrameTiming.buildDurationdoes not includeflushSemantics.Results (real app, window 2056×2616)
All scenarios present at exactly 60 fps on Linux regardless of cost → #980 (engine).
Children
Already fixed in this cycle: #875, #879, #885, #972 (grid rebuilds), #874, #876, #877, #878, #886.
Related
#723 (connections tree @ 120 Hz: measured within budget with 1500 tables), #739 (QA sign-off).