React Native · Mobile UI at native speed

How do you profile and fix performance problems?

HardperformanceprofilingrenderingUpdated Oct 2026
Quiz this track

Short answer

Measure first on a representative low-end device, separate JS-thread work from UI-thread work, and use the React Profiler, native profilers and frame timing to find the actual bottleneck before optimising.

Performance work starts with a reproducible scenario and a measurement. A screen that feels slow may be doing too much JavaScript, dropping frames on the UI thread, waiting on the network, or mounting too many views. Each has a different fix.

Tools by layer

  • React DevTools Profiler: which components rendered, why, and how long they took
  • React Native performance monitor: JS and UI frame rates
  • Android Studio profiler and Xcode Instruments: CPU, memory and native traces
  • Systrace or Perfetto: thread scheduling and frame deadlines
  • Custom marks with performance.now or console.time for specific flows
tsx
import { memo, useCallback } from "react";
import { Pressable, Text } from "react-native";

type Props = { id: string; label: string; onSelect: (id: string) => void };

export const Row = memo(function Row({ id, label, onSelect }: Props) {
  const handlePress = useCallback(() => onSelect(id), [id, onSelect]);
  return (
    <Pressable onPress={handlePress}>
      <Text>{label}</Text>
    </Pressable>
  );
});
Memoisation helps only when props are stable and rendering is actually the bottleneck.

A useful diagnostic is whether frames drop when JavaScript is busy. If the UI stutters during an animation while the JS thread is idle, the problem is on the UI thread or in layout. If it stutters when state updates, look at render cost and unnecessary re-renders. Do not memoise blindly; wrapping everything adds comparison cost and complexity without fixing layout or native work.

Simulators and high-end phones hide real problems. Profile on a mid-range Android device, which is usually the closest to your user base and the least forgiving.

Follow-ups you should expect

Interviewers use these to check whether the first answer was understanding or memorisation.

  1. 1How do you tell a JS-thread problem from a UI-thread problem?
  2. 2When does React.memo not help?
  3. 3What does the React Profiler show?
  4. 4How do you measure a specific screen transition?

Say it in the interview

I start with a reproducible scenario and measure on a mid-range Android device, then separate JS work from UI work. The React Profiler shows unnecessary renders, while Instruments, the Android profiler and frame timing show layout and native cost. I only memoise once I have evidence that render cost is the bottleneck, because otherwise I add complexity without fixing the actual problem.

Use this as a model, not a script. Saying it in your own words is what makes it survive follow-up pressure.

Related questions

Reading is step one

Now say it out loud.

Understanding an answer and delivering it under pressure are different skills. Rehearse this topic in a live React Native mock interview and get scored feedback on depth, clarity and confidence.