Users judge a mobile app in the first few seconds, and they judge it harshly. A slow launch, stuttering scroll, or a device that runs hot will sink an otherwise good app faster than a missing feature. Performance isn't one metric — it's four distinct areas, each with its own causes and fixes. Here's how to keep all of them healthy.
Startup time — the first impression
Time from tap to usable screen is the metric users feel most. Every extra second measurably increases abandonment. The usual culprits are doing too much before the first frame: heavy synchronous work at launch, loading data you don't yet need, and oversized bundles.
Fixes:
- Defer non-essential initialization until after the first screen renders
- Lazy-load features and screens instead of loading everything upfront
- Show a real first screen fast, then hydrate data — don't block on the network
- Trim your dependency footprint; every library adds to startup cost
Rendering — kill the jank
Smooth means hitting the device's frame budget (about 16ms per frame for 60fps). Dropped frames show up as stutter during scrolling and animation. The main causes are doing heavy work on the UI thread and rendering more than you need.
- Virtualize long lists so only visible rows render (FlatList, RecyclerView equivalents)
- Move expensive work off the main thread
- Avoid unnecessary re-renders — in React Native, memoize and keep render functions cheap
- Optimize images: right-sized, cached, and in efficient formats
Memory — don't get killed
The OS terminates apps that use too much memory, and users read that crash as your bug. Leaks and oversized assets are the main offenders. Watch for retained references, unbounded caches, and full-resolution images held in memory. Load and decode images at display size, release resources when screens unmount, and cap in-memory caches.
Battery and network — the invisible costs
Users blame the app that drains their battery even if they can't name why. The big drains are aggressive polling, chatty networking, wakelocks, and constant location or sensor use.
- Batch network requests and cache aggressively instead of polling
- Back off background work when the app isn't foregrounded
- Use push instead of polling for updates where possible
- Request location and sensors only when actually needed
Build a profiling habit
You can't fix what you don't measure, and you can't measure on the wrong device:
- Profile on real, mid-range and older devices, not just the latest flagship or a simulator — your users aren't all on new hardware
- Use the platform tools: Xcode Instruments for iOS, Android Studio Profiler for Android, and the React Native profiler if applicable
- Track key metrics (startup time, frame rate, crash-free rate) in production with monitoring, not just in the lab
Keep it fast over time
Performance decays quietly. Each new feature, dependency, and screen adds a little weight until the app that launched fast is sluggish a year later. Guard against it: set budgets (startup time, bundle size), watch production metrics for regressions, and treat a performance drop as a bug, not a nice-to-have. Fast at launch is easy; fast a year later is a discipline.
If your app has gotten slow and you want a profiling pass that finds the real bottlenecks — not guesswork — talk to us.
Originally published on the Doktouri Agency blog. We build web, mobile, SaaS, and AI products — let's talk.
Top comments (0)