We migrated a consumer fintech app from React Native 0.68 to 0.73 with the New Architecture enabled, while simultaneously reducing cold start time by 62% and achieving consistent 60fps scrolling across 2,000+ device models. This case study documents the performance engineering decisions, measured results, and honest lessons over 8 months of production operation.
Context
The app — a personal finance management tool — had 180K monthly active users with a 4.2 App Store rating dragged down by performance complaints. The primary issues:
- Cold start: 4.8 seconds on iPhone 12, 7.2 seconds on mid-range Android devices
- List scroll jank: Feed of 500+ transactions dropped to 28fps during fast scrolling
- Memory crashes: 12% of Android sessions experienced OOM kills
- Navigation lag: Tab switches took 400-600ms with visible blank frames
Our team: 3 React Native developers, 1 iOS native developer, 1 Android native developer.
Phase 1: Foundation (Weeks 1-4)
Hermes and New Architecture Migration
The first month focused on upgrading React Native and enabling performance foundations:
Measured impact:
- Cold start: 4.8s → 2.9s (40% reduction)
- Memory usage at idle: 145MB → 98MB (32% reduction)
- Bundle parse time: 1.2s → 180ms (Hermes bytecode precompilation)
Bundle Size Optimization
Phase 2: List Performance (Weeks 5-8)
FlatList to FlashList Migration
The transaction feed was the most-used screen, displaying 500+ items with pull-to-refresh and infinite scroll:
Measured results:
- Scroll FPS: 28 → 58 (107% improvement)
- Memory during scroll: 280MB → 120MB (57% reduction)
- Cell blank rate: 15% → 0.3%
Transaction Row Optimization
Key changes:
- Pre-computed
formattedDateandformattedAmounton the data layer, not in the render function - Replaced
ImagewithFastImagefor disk caching - Used
React.memoto prevent re-renders when parent state changes - Used
StyleSheet.createfor static styles (already was, but worth noting)
Phase 3: Navigation and Startup (Weeks 9-12)
Navigation Optimization
Startup Sequence Optimization
Startup sequence results:
- Cold start (iPhone 12): 2.9s → 1.8s
- Cold start (mid-range Android): 5.1s → 2.8s
- Time to interactive: 3.2s → 1.4s
Need a second opinion on your mobile/frontend architecture?
I run free 30-minute strategy calls for engineering teams tackling this exact problem.
Book a Free CallPhase 4: Memory Optimization (Weeks 13-16)
Image Cache Management
Memory Monitoring in Production
Memory results:
- Average session memory: 145MB → 88MB
- OOM crash rate: 12% → 0.8%
- Background memory: 95MB → 42MB
Production Results (8-Month Summary)
| Metric | Before | After | Improvement |
|---|---|---|---|
| Cold start (iOS) | 4.8s | 1.8s | 62% faster |
| Cold start (Android) | 7.2s | 2.8s | 61% faster |
| Transaction list FPS | 28 | 58 | 107% |
| Memory usage (avg) | 145MB | 88MB | 39% less |
| OOM crash rate | 12% | 0.8% | 93% reduction |
| App Store rating | 4.2 | 4.6 | +0.4 stars |
| 1-star reviews (perf) | 23/month | 3/month | 87% reduction |
What We Would Do Differently
-
Start with FlashList: We spent 3 weeks tuning FlatList before switching to FlashList, which solved most issues immediately. Start with FlashList from day one.
-
Measure before optimizing: Our first month included "optimizations" based on intuition that profiling later showed had zero impact. Use React DevTools Profiler and Flipper from the start.
-
Test on low-end devices earlier: Our initial testing was on iPhone 13 and Pixel 6. The worst performance issues only appeared on devices with 3GB RAM, which represent 40% of our Android user base.
-
Pre-compute formatted data: Moving date and currency formatting from render functions to the data transformation layer was the highest-ROI change. Every formatter call was executing on every render of every list cell.
Conclusion
The 62% cold start improvement and 107% scroll FPS improvement came from well-known techniques applied systematically: Hermes, FlashList, FastImage, screen freezing, and deferred initialization. No exotic optimizations were needed. The challenge was not knowing what to do — it was measuring correctly, prioritizing based on data, and resisting the urge to optimize prematurely.
The App Store rating increase from 4.2 to 4.6 translated directly to a 15% improvement in organic installs. Performance is a feature with measurable business impact.