React Native Performance Monitoring Guide 2026
React Native performance monitoring tracks how fast your app starts, responds and renders on real devices. It covers both the JavaScript thread and the native UI thread. Key metrics are startup time, JS thread stalls, dropped frames, navigation latency and memory. Use the Performance Monitor and React Native DevTools in development, native profilers for UI-thread problems, and tools like Firebase Performance, Sentry or UXCam in production.
| Tool | What it shows | When to use it |
|---|---|---|
| Performance Monitor (Dev Menu) | Live JS and UI thread frame rates | Spot checks during development |
| React Native DevTools | Component renders, profiling and performance traces | JavaScript profiling during development |
| Android Studio and Xcode Instruments | Native CPU, memory and rendering traces | Diagnosing UI-thread problems |
| Firebase Performance Monitoring | Startup time, screen rendering and network latency | Production performance metrics |
| Sentry | Transactions, spans and slow operations | Production tracing with error context |
| UXCam | UI freezes, ANRs and crashes linked to session replays | Seeing how users experience lag |
React Native work runs on two main threads, so a slow screen can start in JavaScript or in native rendering. To find the real bottleneck, you need to see JS thread stalls, dropped frames, startup time and navigation latency, and connect them to what users were doing.
This guide explains why performance monitoring is different in React Native. It then shows how to track it with built-in tools, native profilers and production SDKs such as Firebase Performance Monitoring, Sentry and UXCam. For related guides, see React Native crash reporting and React Native analytics.
What is React Native performance monitoring?
React Native performance monitoring means tracking JavaScript execution and native UI rendering at the same time. Your app's logic runs on the JavaScript thread and its views are drawn on the native UI thread, so a slowdown can start in either place.
When users report lag, the cause isn't always obvious. Heavy JavaScript work can block the JS thread, complex native views can slow the UI thread, or calls between the two can pile up. Monitoring tells you which part is struggling and when.
Good monitoring also ties technical signals to real user behavior. Instead of an abstract metric like "JS thread dropped to 30 FPS", you see that it happened when a user with a large cart tapped Checkout on a mid-range Android phone.
By capturing JS thread stalls, dropped frames, slow native calls and slow navigation, performance monitoring shows how bottlenecks in the architecture turn into a poor user experience.
Why performance monitoring is unique in React Native
React Native apps don't run in a single execution environment. They work across several layers that must stay in sync for the app to feel smooth, which makes monitoring more complex than in a fully native app.
React Native runs across multiple execution layers
React Native runs your JavaScript and React code on one thread and draws native views on another. Since React Native 0.76, the New Architecture has been the default, and React Native 0.82 runs entirely on it. It replaces the asynchronous Bridge with the JavaScript Interface (JSI), which lets JavaScript and native code call each other directly.
Two parts of the New Architecture build on JSI. Fabric, the new renderer, speeds up rendering for smoother lists and gestures. Turbo Modules, the new native modules, load lazily and can be called directly. This removes many old bottlenecks, but long JavaScript work and heavy native rendering still slow apps down, so you still need to watch both threads.
The Bridge adds overhead in older apps
Apps still on the legacy architecture talk to native code through the Bridge. React Native 0.81 and Expo SDK 54 are the last versions that allow it. Bridge calls are asynchronous and serialized, which adds overhead.
When JavaScript asks native code for something, such as location, storage or camera access, the request crosses the Bridge, runs on a native thread and returns before the UI can update. Frequent calls add latency and cause visible delays.
How can performance problems start on either thread?
Performance problems in React Native can start on the JavaScript thread, on the UI thread or, in older apps, on the Bridge between them. To users, they all look the same: the app feels slow. Here's how each one shows up.
JavaScript thread bottlenecks
The JavaScript thread is where React components render, state updates run and logic such as reducers and effects executes. When this thread is blocked, React can't finish its work.
Effects don't run, state updates queue up and layout changes can't reach the native side, even if the UI thread is idle. Users see delayed taps, frozen screens or navigation that feels stuck.
UI thread bottlenecks
The UI thread draws native views and handles gestures, using UIKit on iOS and Android Views on Android. It can be overloaded even when the JS thread is healthy.
Complex FlatList setups with custom native components, decoding large images or heavy native-driven animations can all drop frames. In these cases, JavaScript may report a steady 60 FPS while the screen visibly stutters.
Bridge serialization delays
In apps on the legacy architecture, every prop update, event callback and native module call is serialized to JSON and sent asynchronously between threads.
That hurts when events fire often. A fast-scrolling ScrollView can generate hundreds of scroll events per second, and each one must be serialized, queued, deserialized and handled in JavaScript. Over time, this creates a visible lag between the user's finger and what appears on screen.
Navigation-related thread conflicts
Navigation exposes thread bottlenecks quickly. React Navigation mounts and unmounts screens on the JS thread, while native navigators create views on the UI thread.
When transitions feel slow, monitoring shows whether the delay comes from JavaScript, such as mounting complex components, or from native work, such as building a large view hierarchy.
Why this matters for monitoring
Because these problems look alike to users, you can't diagnose a "slow screen" without knowing which layer is blocked. That's why React Native monitoring has to cover the JavaScript thread, native rendering and native calls at the same time. Without that view, teams treat the symptom and miss the cause.
You don't have to start by guessing, either. You can ask Tara, UXCam's AI analyst, questions like "Why did the JS thread stall during checkout?" Tara goes through the sessions for you and points to the screens and actions where users hit freezes.
What to monitor in a React Native app
Track these React Native-specific indicators to diagnose performance problems:
JS thread frame rate: How quickly the JavaScript thread processes work. It should stay at 60 FPS for smooth interaction. Drops point to heavy computation or too many re-renders.
UI thread frame rate: How smoothly native views render. Drops point to complex view hierarchies, expensive native animations or image and video decoding.
Bridge traffic (legacy architecture only): How much data crosses between JavaScript and native code. Heavy traffic goes hand in hand with scroll lag, animation stutter and input delay.
Long tasks on the JS thread: Any JavaScript work longer than about 16 ms, the frame budget at 60 FPS, risks dropping frames. Find the functions that block the thread.
App startup time (TTI): How long users wait before the app responds to input. It includes native module setup, loading the JS bundle and the first render.
Memory usage and leaks: JS heap size, native memory and how memory grows over time. React Native apps can leak on both sides.
Navigation latency: The time between starting a navigation and the new screen becoming interactive. Users notice slow navigation more than a slow first load.
Network requests: Slow or sequential API calls delay data-driven screens, even when the app itself renders smoothly.
Native monitoring tools see the native threads but not your JavaScript, and web tools see neither. React Native monitoring needs a view of JavaScript execution and native rendering together.
How to monitor performance in React Native
Monitor performance in two stages: use built-in tools and native profilers during development, then add a production SDK to see what real users experience.
Development monitoring with built-in tools: React Native's Performance Monitor, "Perf Monitor" in the Dev Menu, shows live JS and UI thread frame rates. It's useful for spot checks, but it only shows current values, so it's hard to tie a drop to a specific action. The React Native docs call it a guide and recommend native tooling for accurate measurements.
Profiling with React Native DevTools: Older guides recommend Flipper, but React Native removed its Flipper integration in version 0.74, and the plugin is now unsupported. Today, React Native DevTools is the built-in debugger. Its React profiler shows which components render, how long each render takes and why, so you can find excessive re-renders that block the JS thread. Recent versions also record performance traces. Like the Performance Monitor, it only works in development.
Native profilers for deep diagnosis: When the Performance Monitor or DevTools point to a UI thread problem, profile the native code. Android Studio's System Trace and CPU Profiler show which native methods consume time. Xcode Instruments' Time Profiler reveals iOS bottlenecks such as Core Animation rendering or memory allocation spikes. These tools need the app running from Android Studio or Xcode while you trace the slow interaction, so they don't work for monitoring production apps.
Production monitoring with specialized SDKs: In production, add lightweight SDKs that collect performance data from real users with low overhead.
Options include:
UXCam: Captures UI freezes, ANRs and native crashes automatically and ties each one to the session replay. A UI freeze means the main thread was blocked for 2 seconds or more. You see how users experience lag on specific screens. UXCam doesn't chart frame rates or network timing, so pair it with a metrics tool for those.
Firebase Performance Monitoring: Collects app startup time, screen rendering and network request latency automatically, and supports custom traces for specific code paths.
Sentry Performance: Tracks transactions and spans and connects performance with errors. It captures slow operations and network requests, and integrates with React Navigation to track screen changes automatically.
UXCam for React Native performance insights
UXCam shows how users actually experience lag and slow screens. When your monitoring dashboard reports a spike in slow screen loads, UXCam's session replay shows what users were doing when it happened. You can watch the gestures, screen transitions and interactions around each delay.
Instead of an abstract metric like "the checkout screen took 4.2 seconds", you find patterns you can act on, such as:
Lag that only happens on Android 11 devices
Slowdowns once users add more than 20 items to their cart
Delays after tapping "Place Order" during peak hours
Filtering is how you find those patterns. Look at every session with a UI freeze on the checkout screen, or at sessions from one app version or device model. You can also log a custom event when navigation takes longer than 2 seconds and filter on that event.
Tara, UXCam's AI analyst, does that search across your sessions for you. It surfaces recurring friction, such as UI freezes that only happen on certain Android versions, and suggests where to look first, so you don't have to review every recording yourself.
Each session plays back as a video, showing exactly where delays hit user flows, whether that's onboarding, checkout or feed scrolling. Add the UXCam React Native SDK to connect your performance metrics with real user behavior.
How to improve React Native app performance with UXCam
Prioritize by business impact and user experience Focus first on the performance problems that hurt key flows, such as the ones that stop users from converting. UXCam shows you where those flows break.
To get there, log the critical events in the flow as custom events. In a food delivery app, for example, that could be the delivery request, the location permission, the app's online status and a completed order.
When you analyze that funnel in UXCam, you can see the step where users drop off and open those sessions. You'll see whether an action or request didn't complete, and how the delay felt to the user.
Shorten error analysis and debugging time
The main thing UXCam adds is context. You see your logs next to real session recordings with gestures, actions, screen transitions and device properties.
The operating system helps too. When code on Android's main thread takes too long, Logcat prints a warning such as "Skipped 55 frames! The application may be doing too much work on its main thread." Find that screen in UXCam's session replays and you can see how the lag affected users, then prioritize the fix accordingly.
Prioritize fixes by impact with Tara. When Android logs skipped frames, the question is which users felt it. Tara surfaces the flows where UI freezes, rage taps and drop-offs cluster, which tells you which performance fixes matter most.
Analyze login failures
Login problems often look like performance problems to users. Log authentication events, such as the login method, failed attempts and the reason for each failure, as custom events.
You can then filter sessions by those events and watch what happened. That helps you separate slow or broken login flows from other issues.
An unusual pattern, such as many failed attempts followed by a success, can also be worth a closer look. Combine the session with device and location details to investigate.
Analyze handled exceptions to see their impact on users UXCam's React Native SDK has no handled-exception API, so log caught exceptions as custom events. Call RNUxcam.logEvent() with the error name and message in your catch block or Error Boundary. Each one then appears on the session timeline and works as a session filter.
Pair the stack trace from your error logs with the session where the exception was logged. That points your developers to the root cause. For example, if a third-party library receives incorrect input from your app, the stack trace shows where.
With logs and session replay together, you can see which interaction caused the exception and how much it affects your app. Your team can then handle these exceptions more gracefully.
Best practices for using UXCam for React Native app monitoring
Pick your key KPIs: Decide which metrics show whether your app performs well before you start.
Set up custom events: Log the user actions that matter for those KPIs.
Use session replay: Watch replays to find issues that affect how your app performs for users.
Improve user flows: Use funnel data to find and fix the slow or confusing steps in key flows.
Resolve issues quickly: Use UXCam's issue analytics to find crashes, ANRs and UI freezes and fix them fast.
Common React Native performance monitoring use cases
These examples are illustrative. They show common patterns teams run into, with typical numbers.
Identifying lag in gesture-heavy screens
A social app gets complaints about choppy scrolling in the feed. Frame rate monitoring shows the UI thread drops from 60 to 40 FPS during fast scrolls. Session replay shows the lag starts when videos auto-play. The cause is video decoding on the UI thread. The team moves decoding off that thread, and monitoring confirms a stable 60 FPS.
Validating performance after a release
After adding a new analytics library, the team checks cold start time. Production data shows startup grew from 1.8 s to 2.5 s on Android. The library initializes synchronously during launch. Moving its setup to after the first render brings startup back to 1.9 s.
Detecting slow onboarding flows
Users abandon sign-up at 40% completion. Screen transition monitoring shows the phone verification screen takes 4 seconds to become interactive in 15% of sessions. It only happens on poor networks, because the screen waits for the SMS code before rendering. Adding a loading state and verifying in the background cuts abandonment to 25%.
Diagnosing issues on lower-end Android devices
An app runs well on iPhones and high-end Android phones but lags on budget devices. Monitoring by device shows JS thread stalls over 500 ms on devices with less than 3 GB of RAM. The cause is large JSON responses parsed on the JS thread. Parsing them in smaller pieces cuts stalls to under 100 ms.
Monitor real React Native performance issues with UXCam
React Native performance problems are rarely obvious. A slow screen, dropped frames or delayed navigation can come from the JS thread, the UI thread or the communication between them. Without seeing where delays happen and when users feel them, teams chase symptoms instead of causes.
Use development tools like the Performance Monitor and React Native DevTools to catch issues early. Then add production tools such as Firebase Performance Monitoring, Sentry or UXCam to see how real users experience the app. Metrics matter, but context makes them useful: knowing where, when and who is affected turns performance data into clear fixes.
UXCam connects performance signals to real user sessions, and Tara points you to the issues that matter most. Get started with UXCam's React Native SDK and monitor performance in the context of what users actually experience.
FAQ
How do I detect JS thread stalls in React Native?
During development, watch the JS frame rate in the Performance Monitor and record a trace in React Native DevTools. In production, use an SDK that tracks long-running JavaScript work, such as Sentry. A JS frame rate near 0 FPS means the thread is blocked, so match those stalls to user actions to find the expensive interaction.
How can I see dropped frames in my app?
The React Native Performance Monitor shows real-time frame rates for both threads. For deeper traces, use the native profilers in Android Studio and Xcode, and for production data use SDKs that report FPS metrics. Frame drops appear below 60 FPS, or 120 on ProMotion displays. UXCam doesn't chart frame rates, but it flags UI freezes and rage taps on the session timeline. That shows you where users felt the lag.
How does monitoring differ on Android vs. iOS in React Native?
The JavaScript side works the same on both platforms, but the native side differs. On Android, profile with Android Studio's CPU Profiler and System Trace, and watch for garbage collection pauses. On iOS, use Xcode Instruments' Time Profiler and Core Animation tools. Budget Android devices usually show problems first, so include them in your tests.
Does monitoring impact app performance?
Debug builds and development tools add overhead, so profile a release build for accurate numbers. Production SDKs keep their overhead low by sampling and reporting asynchronously. Track the flows that matter instead of logging every event, and compare key metrics with and without the SDK to confirm the impact. UXCam's autocapture records flows and issues without tagging every event.
Related Articles
AUTHOR
Tope Longe
Product Analytics Expert
Ardent technophile exploring the world of mobile app product management at UXCam.

Related articles
Conversion Analysis
Conversion Rate Optimization Audit: A 6-Step Guide for 2026
A step-by-step guide to running a conversion rate optimization audit: the warning signs, the six steps, and the data and tools to...

Product Analytics Expert
Conversion Analysis
Conversion Funnel Analysis: A Complete Guide for 2026
Conversion funnel analysis is how product teams find where users drop off in critical flows like signup, checkout, and activation, and fix the specific...

Founder & CEO | UXCam
Conversion Analysis
What Is Mobile App Analytics? Definition, Metrics & Best Practices
Mobile app analytics takes the guesswork out of understanding how users interact with your app. Learn what mobile app analytics is, why it's important, and how it differs from web...

Product Analytics Expert


