Warm-run average (runs 2-5 of 5) via env-gated phase timers in run.go: after Fyne app + window + tray 193 ms (was 285 ms on Fyne 2.6.3) after newMainView 249 ms after SetContent 252 ms after w.Show() [TOTAL] ~414 ms (was ~644 ms, -230 ms / -36%) Instrumentation reverted before this commit; source is clean. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3.8 KiB
Performance Notes
Measured performance findings for GoSentry. Each entry records the method so the numbers can be reproduced and re-checked after relevant changes.
Startup Time
Finding (2026-06-22)
After the Phase 4 refactor, cold startup time (the History "Window shown in …" metric) increased by ~290 ms. The increase is caused entirely by the Fyne v2.5.3 → v2.6.3 upgrade (task T4.1), not by the Service / domain / UI restructuring.
Method
Env-gated phase timers (GOSENTRY_TIMING) were added across the startup path
(Run in src/ui/run.go and newMainView in src/ui/mainwindow.go) and the
equivalent points in the pre-refactor entry point (src/gui/app.go at commit
c5e0ef9, the last commit before T4.1). Both were built with the CGO / MSYS2
UCRT64 toolchain and run 5× each; the first run of each is a cold-disk outlier
and is excluded. The timed span (started → w.Show()) is identical in both
builds, so the comparison is fair.
Results (warm-run averages)
| Phase (cumulative from start) | Old (Fyne 2.5.3) | New (Fyne 2.6.3) | Δ |
|---|---|---|---|
| after single-instance check | ~0.5 ms | ~0.6 ms | — |
| after Fyne app + window + tray | ~277 ms | ~285 ms | +8 ms |
app.Open() done |
+3 ms | +3 ms | 0 |
views built + svc.Start() |
+42 ms | +43 ms | ~0 |
after SetContent |
~348 ms | ~353 ms | +5 ms |
after w.Show() (TOTAL) |
~348 ms | ~644 ms | +~290 ms |
Interpretation
- Everything up to and including
SetContentcosts the same in both versions (~350 ms). The refactor-specific code —app.Open()(~3 ms) and the newapp.Serviceplus view construction (~42 ms) — is unchanged, so the restructuring added no measurable startup cost. - The entire regression lands in
w.Show(): ~0 ms under Fyne 2.5.3, ~290 ms under 2.6.3. Fyne 2.6 reworked main-thread marshaling (the change that introducedfyne.Do) and front-loads first-window GL/driver realization into theShow()call. - The cost is a fixed, one-time Fyne expense, not a leak in GoSentry code, and
the upgrade cannot be reverted because
fyne.Dorequires Fyne ≥ 2.6. - The tray / autostart path (
--start-in-tray) skipsw.Show()until the user opens the window, so it is unaffected.
Finding (2026-06-23, Fyne 2.7.4)
Fyne upgraded from v2.6.3 → v2.7.4 as part of Phase 6 (P6.1).
Method
Same GOSENTRY_TIMING env-gated phase timers as the 2026-06-22 baseline:
fmt.Fprintf(os.Stderr, ...) checkpoints added to src/ui/run.go across the
startup path, built with the CGO / MSYS2 UCRT64 toolchain and run 5×; run 1
(cold disk) is excluded. Timers were reverted before committing.
Results (warm-run averages, runs 2–5)
| Phase (cumulative from start) | Fyne 2.6.3 | Fyne 2.7.4 | Δ |
|---|---|---|---|
| after single-instance check | ~0.5 ms | ~1 ms | — |
| after Fyne app + window + tray | ~285 ms | ~193 ms | −92 ms |
| after newMainView | ~328 ms | ~249 ms | −79 ms |
| after SetContent | ~353 ms | ~252 ms | −101 ms |
| after w.Show() [TOTAL] | ~644 ms | ~414 ms | −230 ms |
Interpretation
Fyne 2.7.4 is ~230 ms faster (~36%) than Fyne 2.6.3 end-to-end. The gain is
spread evenly: Fyne app + window + tray is 92 ms faster, w.Show() itself is
~161 ms faster. This confirms Fyne 2.7.0's "Massive performance increases on
rendering" and driver/threading improvements are real and material for GoSentry.
The upgrade is a net win: fyne.Do threading (required since 2.6) is retained
and the startup cost is substantially reduced.