Canvas app performance: find what's slow and fix it at the source
The documented causes behind slow canvas app performance — OnStart bloat, N+1 queries, cross-screen references, collection abuse — how to find each with Monitor and App Checker, and the fix Microsoft recommends.
Power AppsFix a problem3 min read
Slow canvas apps are rarely slow for mysterious reasons — Microsoft's performance documentation names the same handful of patterns again and again. This guide maps symptom to cause to documented fix.
Measure first
Two built-in tools turn "it feels slow" into a diagnosis:
- Monitor logs every data call and key activity as the app runs — including a session attached to a phone, so field-reported slowness can be seen rather than imagined.
- Performance insights and App Checker in Studio flag known anti-patterns; cross-screen references surface under "Inefficient Delay Loading".
Fix what the trace shows, not what a checklist guesses — and when a fix lands, re-measure the same journey so the claim "it's faster now" belongs to evidence someone actually gathered.
Fix the start
App.OnStart is imperative: everything in it must finish, in order, before the first screen appears. Microsoft's guidance:
- Move variable setup to named formulas, which load lazily and don't block the first paint.
- Replace
Navigateinside OnStart withApp.StartScreen— declarative, and it lets the first screen show before OnStart completes. - Defer heavy data loading to a non-blocking step after the screen is visible.
// Instead of:
App.OnStart = Collect(OrdersCache, Orders);
If(Param("AdminMode") = "1", Navigate(AdminScreen), Navigate(HomeScreen))
// Declare the start screen and let it paint:
App.StartScreen = If(Param("AdminMode") = "1", AdminScreen, HomeScreen)
Hunt the data patterns
The three documented heavyweights:
- Select N+1: a gallery whose rows each fire a
LookUpturns one screen into dozens of calls. Watch Monitor for repeated calls to the same source; fix by batching into one query, using a view that already includes the related columns, or reshaping the data so the join happens at the source. Microsoft's example case cut a five-minute load to under ten seconds by fixing the join at the source. - Collections as a crutch:
ClearCollectof a large table blocks the UI until every row lands. Collections are for small data you compute against repeatedly (a basket, not a backlog); read-only data belongs directly in the gallery'sItems, delegated to the source. Delegation itself is its own discipline — our delegation cheat sheet covers which functions push work to the server. - Power Automate as a data loader: each flow call costs roughly 0.6 seconds just to start, before any work happens. Microsoft is blunt that the worst-performing apps overuse this; query the source directly, or move server-side logic into Dataverse views or low-code plugins that return finished results.
Remove cross-screen references
A label on Screen A reading a control on Screen B forces Power Apps to load both screens before A appears — multiplied across an app, that's the "every screen is slow" signature. The documented cure: hold shared state in variables or collections, pass values through navigation parameters, and keep each screen self-contained. On phones this also fights memory-driven app restarts, which Microsoft ties directly to how the app is authored.
- Trace with Monitor
- Fix the top pattern
- Re-measure the same journey
- Repeat until the trace is boring
Don't
- Don't
Patchrows one by one in a loop — bulk-patch a collection of changes. - Don't ship media-heavy screens untested on the oldest device your users carry.
Sources
- Identify and mitigate canvas app performance issues — Microsoft Learn
- Troubleshoot Power Apps canvas app performance issues — Microsoft Learn
- Optimize app or page load for peak performance — Microsoft Learn
- Power Apps coding guidelines: code optimization — Microsoft Learn
- Prevent canvas app restarts in the Power Apps mobile app — Microsoft Learn
Did this fix it?
Comments
No comments yet. Share what worked for you.
Sign in to comment. Comments show under a display name you choose, never your email.