G2 32 x 32 White Circle

4.7 STARS ON G2

Try our product analytics for free. No card required.

UPDATED

11 MIN READ

SHARE THIS POST

React Native Performance Monitoring Guide 2026

BY Tope Longe
SHARE THIS POST
React Native Performance Monitoring

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.

ToolWhat it showsWhen to use it
Performance Monitor (Dev Menu)Live JS and UI thread frame ratesSpot checks during development
React Native DevToolsComponent renders, profiling and performance tracesJavaScript profiling during development
Android Studio and Xcode InstrumentsNative CPU, memory and rendering tracesDiagnosing UI-thread problems
Firebase Performance MonitoringStartup time, screen rendering and network latencyProduction performance metrics
SentryTransactions, spans and slow operationsProduction tracing with error context
UXCamUI freezes, ANRs and crashes linked to session replaysSeeing 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 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

AUTHOR

Tope Longe

Product Analytics Expert

Ardent technophile exploring the world of mobile app product management at UXCam.

Tope Longe
UPDATED

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...

Jonas Kurzweg

Jonas Kurzweg

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...

Dr. Silvanus Alt

Silvanus Alt, PhD

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...

Jonas Kurzweg

Jonas Kurzweg

Product Analytics Expert

What’s UXCam?

Autocapture Analytics icon
Autocapture Analytics
With autocapture and instant reports, you focus on insights instead of wasting time on setup.
Customizable Dashboards
Customizable Dashboards
Create easy-to-understand dashboards to track all your KPIs. Make decisions with confidence.
icon new revenue streams (16)
Session Replay & Heatmaps
Replay videos of users using your app and analyze their behavior with heatmaps.
icon new revenue streams (17)
Funnel Analytics
Optimize conversions across the entire customer journey.
icon new revenue streams (18)
Retention Analytics
Learn from users who love your app and detect churn patterns early on.
icon new revenue streams (19)
User Journey Analytics
Boost conversion and engagement with user journey flows.

Start Analyzing Smarter

Discover why teams across 50+ countries rely on UXCam. Try it free for 14 days, no credit card required.

Trusted by the largest brands worldwide

naviclassplushousingjulobigbasket