Performance Lessons from an App with 10M+ Users
At small scale, a 200ms regression in cold start time is a rounding error. At 10 million users, it’s measurable churn. Here’s what we learned optimizing for that scale.
Cold start is a budget, not a metric
We stopped treating cold start as a single number to chase and started treating it as a budget split across app init, first-frame render, and data hydration. Each had its own owner and its own regression alerts in CI.
Compose recomposition is the new leak
Most of our regressions in the last year came from unnecessary recompositions cascading through poorly scoped state, not from anything exotic. A @Stable annotation and tighter state hoisting fixed more perf bugs than any low-level optimization we tried.
Profile on real devices, not emulators
Emulator profiling consistently understated jank on mid-tier devices, which is where most of our user base actually sits. Moving our perf CI to a small fleet of real low/mid-tier devices caught regressions that emulator runs missed entirely.