Users abandon mobile apps that feel slow. Research consistently shows that even 100 milliseconds of additional latency reduces conversion rates measurably. Achieving consistent 60fps rendering and sub-second load times requires deliberate optimization across rendering, memory, network, and asset management layers. This guide covers practical techniques applicable to both React Native and Flutter projects.

Rendering Performance

Maintaining 60fps means each frame must be computed and painted within 16.67 milliseconds. In React Native, unnecessary re-renders are the most common performance killer. Use React.memo for functional components, implement shouldComponentUpdate for class components, and leverage useMemo and useCallback hooks to prevent expensive recalculations on every render cycle.

FlatList (or FlashList for better performance) should replace ScrollView for any list exceeding a handful of items. Configure getItemLayout to skip dynamic measurement, set windowSize to control how many off-screen items remain rendered, and use keyExtractor to enable efficient reconciliation. For Flutter, ListView.builder provides equivalent virtualization—never use Column with SingleChildScrollView for long lists.

In Flutter, the const constructor is your primary weapon against unnecessary rebuilds. Mark widgets as const wherever possible, and use the RepaintBoundary widget to isolate frequently updating sections from the rest of the widget tree. The Flutter DevTools performance overlay visually identifies frames that exceed the 16ms budget.

Memory Management

Memory leaks in mobile apps lead to crashes and degraded performance over time. In React Native, common sources include uncleared timers, event listeners not removed in cleanup functions, and closures that retain references to large objects. Always return cleanup functions from useEffect hooks that set up subscriptions or timers.

Image memory is often the largest contributor to overall memory consumption. Resize images server-side to match display dimensions rather than relying on client-side scaling. Use progressive JPEG or WebP formats to reduce memory footprint. In React Native, the Image component's cache property and libraries like react-native-fast-image provide fine-grained control over image caching behavior.

Network Optimization

Reduce API payload sizes by implementing field selection (GraphQL) or sparse fieldsets (JSON:API). Compress responses with gzip or Brotli on the server. For applications serving users across Bangladesh, where network conditions vary dramatically between Dhaka and rural areas, implement adaptive loading—serve lower-resolution assets and fewer initial data points on slower connections.

Batch API requests where possible to reduce round trips. Use HTTP/2 multiplexing to parallelize requests over a single connection. Implement request deduplication to prevent identical concurrent requests, and cache API responses locally with appropriate TTL strategies to minimize redundant network calls.

Lazy Loading and Code Splitting

Not every screen needs to load at startup. In React Native, use React.lazy with Suspense for component-level code splitting. Configure Metro bundler to generate async chunks for screens that are not part of the initial navigation flow. This reduces the JavaScript bundle that must be parsed and executed before the app becomes interactive.

Assets should also be loaded lazily. Defer loading images that are below the fold, load fonts asynchronously with fallback system fonts, and prefetch assets for screens the user is likely to navigate to next based on analytics data.

Profiling and Measurement

Optimization without measurement is guesswork. React Native's Performance Monitor (accessible via the dev menu) shows real-time JS and UI thread frame rates. Flipper provides network inspection, layout debugging, and performance profiling in a desktop application. For production monitoring, integrate tools like Sentry Performance or Firebase Performance Monitoring to capture real-user metrics.

Flutter DevTools includes a timeline view, memory profiler, and CPU profiler. The flutter run --profile command builds the app in profile mode, which uses AOT compilation like release builds but enables the performance overlay. Always profile on physical devices—emulators and simulators do not accurately represent real-world performance characteristics.

Performance as a Feature

At Nexis Limited, we treat performance as a core feature, not an afterthought. Our mobile development services include performance auditing and optimization for existing applications. Whether you are building a new app or improving an existing one, contact us to discuss how we can help you deliver a faster, smoother mobile experience.