Journey to a Faster Everyday Super App: Where Every Millisecond Counts
Article Summary
Grab reduced their super app's startup time by 60% while shipping dozens of new features. Here's how they saved users 59,582 hours per day.
Grab's mobile engineering team spent 2019 systematically attacking app performance bottlenecks. They measured everything at scale (8-9 million users daily), focused on p95 metrics, and made tough architectural decisions that affected every team.
Key Takeaways
- Cut iOS dynamic frameworks from 107 to 12 using static linking and custom merge tool
- Tile caching and animation removal alone saved 4 seconds of startup time
- Built CI linters to block performance regressions before they hit production
- Replaced third-party analytics library, saving 2.5s on Android and 0.7s on iOS
- Used coroutines and parallel initialization to maximize computing resource utilization
By focusing on Time to Interactive and preventing regressions, Grab improved p95 startup performance by over 60%, saving users the equivalent of watching all Friends episodes 250+ times daily.
About This Article
Grab's iOS passenger app had 107 dynamically linked frameworks, which pushed pre-main startup time to 7.9 seconds. Apple recommends a maximum of six dynamic frameworks for good performance, so this was well over the limit.
The engineering team took several steps to fix this. They statically linked 75 frameworks and deleted 12 that weren't being used. They also merged 10 remaining dynamic frameworks into 2 using a custom Cocoapods Merge plugin they built and open-sourced. This brought the total down to 12 dynamic frameworks.
The static linking and framework merging cut iOS p90 pre-main time by 41%, saving about 0.8 seconds. This contributed to a 60% overall reduction in app startup time.