The short answer
Most React Native slowness comes from a few causes: too much work on the JavaScript thread, long lists rendered inefficiently, animations computed in JavaScript, oversized images and unnecessary re-renders. Measure in a release build, since development mode is much slower, then fix the biggest cause first: use FlatList or a faster list library properly, run animations on the native side, resize images, and remove stray console.log calls from production.
Key points
- Always judge performance in a release build, never dev mode.
- Long lists need FlatList set up properly, or a faster list library.
- Run animations on the native side, not the JavaScript thread.
- Remove console.log calls from production bundles.
- Measure first; fix the biggest cause, then measure again.
Measure in a release build
The React Native documentation is blunt: JavaScript performance suffers greatly in development mode, so always test performance in release builds. Test on a mid-range Android phone, not only a new iPhone, because that is where problems show first. Use the React Native DevTools profiler and the platform tools to see what is slow before changing anything.
Common causes and fixes
| Symptom | Likely cause | Fix |
|---|---|---|
| Janky scrolling in long lists | Rendering every item, or slow items | FlatList with getItemLayout and stable keys, or FlashList or Legend List |
| Taps respond late | Heavy work on the JavaScript thread | Defer the work, move it off the interaction, memoize |
| Stuttering animations | Animations computed in JavaScript | useNativeDriver, LayoutAnimation, or Reanimated |
| Slow screens with photos | Full-size images | Serve resized images, cache them |
| Whole screen re-renders on small changes | State held too high, new props every render | Split components, memoize, move state down |
| Slowdown in production only | console.log calls in the bundle | Strip them with a Babel plugin |
Startup time
- Hermes, the JavaScript engine React Native uses by default, helps startup. Keep it on.
- Load only what the first screen needs, and defer the rest.
- Avoid large synchronous work at launch, such as reading big files from storage.
- Audit dependencies: each library adds to the bundle.
Keeping it fast
Performance drifts as features are added. Keep a slow Android test phone in the team, check key flows before each release, and watch the app stores’ vitals dashboards for crashes and slow rendering. Framework choice matters less than these habits. See React Native vs Flutter and Expo vs React Native CLI. We build apps in React Native in mobile app development.
Sources
Checked when this guide was written.