Skip to content

Reduce e2e test flakiness#16061

Merged
vmoroz merged 3 commits intomicrosoft:mainfrom
vmoroz:PR/fix-e2e-test-flakiness
Apr 29, 2026
Merged

Reduce e2e test flakiness#16061
vmoroz merged 3 commits intomicrosoft:mainfrom
vmoroz:PR/fix-e2e-test-flakiness

Conversation

@vmoroz
Copy link
Copy Markdown
Member

@vmoroz vmoroz commented Apr 28, 2026

Description

Type of Change

  • Bug fix (non-breaking change which fixes an issue)

Why

PR validation flakes intermittently on the E2E Fabric job
(PR (Tests E2E Test App Fabric X64Hermes)), with no usable debugging signal —
when the step fails the artifacts contain no crash or hang dump. Re-runs
eventually go green without a code change, which masks any real underlying
regression. Additionally, X86 has historically been validated only post-merge
on Continuous, which means X86-specific regressions cause a revert cycle
rather than a clean PR rejection.

This PR addresses the problem on three tracks:

  1. Make E2E failures debuggable — register Windows Error Reporting
    LocalDumps for the test app and node, capture full-memory dumps from
    surviving processes after a failed step, install an in-process unhandled-
    exception filter as the primary crash mechanism (hosted CI agents route WER
    through a corporate-server policy that silently ignores per-exe LocalDumps),
    and bundle matching PDBs and a debugging README into the
    Crash dumps - <job> artifact.

  2. Fix the two known flake families that produced no dump (because there was
    no crash to dump)
    :

    • ±1 px height drift on text-rendered SpriteVisuals — Composition
      snaps a near-half-integer DWrite text measurement to either side of the
      integer boundary on different commits. Hardened the dumpVisualTree
      path to take multiple stable readings.
    • searchBox helper timeout ("Unable to enter correct search text into
      test searchbox") in 8 component-test files plus
      RNTesterNavigation.ts. WinAppDriver's setValue falls back to
      synthesized keystrokes for custom RN TextInputs, which append
      rather than replace — so waitUntil retries make the state worse, not
      better. Clearing the field before each setValue plus a faster retry
      cadence resolves it.
  3. Make transient install-step failures self-healyarn install /
    npx ... fetches occasionally die mid-flight on the hosted agent (on
    0.84-stable this surfaces as midgard-yarn-strict exiting 57005 /
    0xDEAD right after [2/2] Fetching packages…; PR build 630484 is the
    reference case). The fetch helper is killed by the OS before yarn's own
    limited retry path can engage, so a manual re-run is needed today. Wire
    ADO's built-in retryCountOnTaskFailure: 2 on every install / init /
    lage step so a single transient retries automatically before failing
    the build.

What

Crash-dump collection mechanism

  • .ado/scripts/SetupLocalDumps.cmd — made idempotent (reg add /f),
    parameterized on dump folder, registers the exe in AeDebug\AutoExclusionList
    so WER wins over the JIT path.
  • .ado/templates/prepare-build-env.yml — new opt-in localDumpsExeNames
    array parameter (default [] → no-op for existing callers); iterates and
    registers each name with SetupLocalDumps.cmd. Also grants
    SYSTEM:(OI)(CI)F and Users:(OI)(CI)F ACLs on CrashDumpRootPath so the
    WER service (LocalSystem) and packaged apps can write dumps there.
  • .ado/jobs/e2e-test.yml:
    • Passes [RNTesterApp-Fabric, node] to prepare-build-env.yml.
    • On test failure: a Capture dumps of surviving test processes step runs
      procdump64 -ma against any still-alive RNTesterApp-Fabric / node,
      writing into $(CrashDumpRootPath)\hang\ (subfolder is required — files
      written at the root were observed to disappear during the post-failure
      Update snapshots step on hosted agents).
    • A Collect in-process and fallback crash dumps step copies any
      in-process minidumps from %ProgramData%\RNW-E2E-Dumps\ into
      $(CrashDumpRootPath)\in-process\, and scans common WER fallback
      locations into $(CrashDumpRootPath)\recovered\.
    • A Bundle symbols and README with crash dumps step copies all *.pdb
      from the test app's Release output into $(CrashDumpRootPath)\symbols\
      (mirroring the deploy tree) and writes a README.md at the artifact
      root with WinDbg instructions and _NT_SYMBOL_PATH wiring. Gated on
      actual .dmp / .mdmp files existing — $(CrashDumpRootPath) doubles
      as MSBUILDDEBUGPATH, so build-time MSBuild failure logs land there
      too without needing symbols bundled.
    • Two opt-in pipeline parameters, both defaulted false, for re-validating
      the crash and hang capture paths when an agent image change forces a
      re-check: simulateCrashForTesting and simulateHangForTesting. The
      crash path uses a sentinel file at %ProgramData%\rnw-e2e-simulate-crash.flag;
      the hang path uses an env var RNW_SIMULATE_HANG=1 that gates a new
      HangSimulationTest.test.ts.
  • packages/e2e-test-app-fabric/windows/RNTesterApp-Fabric/RNTesterApp-Fabric.cpp:
    • InstallInProcessCrashDumpWriter() — top-level SetUnhandledExceptionFilter
      that writes MiniDumpWithFullMemory | WithHandleData | WithThreadInfo | WithUnloadedModules | WithProcessThreadData to
      %ProgramData%\RNW-E2E-Dumps\RNTesterApp-Fabric-<timestamp>-<pid>.dmp,
      then returns EXCEPTION_CONTINUE_SEARCH so the process still terminates
      and any downstream handlers run.
    • MaybeSimulateCrashForTesting() — flag-file-gated null-pointer write for
      crash-path validation.
    • HangForTesting automation command — Posts Sleep(INFINITE) onto the UI
      dispatcher, jamming the UI thread on the next work item (realistic
      deadlock shape).
  • packages/e2e-test-app-fabric/test/HangSimulationTest.test.ts — opt-in
    test (auto-skips unless RNW_SIMULATE_HANG=1) that drives HangForTesting
    and lets the test step time out so the post-failure ProcDump capture path
    has a hung packaged-app process to dump.

Snapshot dump stabilization

  • RNTesterApp-Fabric.cppDumpVisualTree now takes up to 3 dumps with
    50 ms gaps and returns the first dump that matches its successor (i.e. two
    consecutive dumps stringify identically). Targets composition's per-commit
    rounding non-determinism on text-derived Visual::Size values (~24.5 → 24
    vs 25 across commits). No client / test / snapshot changes; ~100 ms added
    per dumpVisualTree call.

searchBox helper flake

Same flake-prone pattern duplicated across 9 sites. Updated all of them with
a single fix:

  • Added await searchBox.clearValue(); before setValue() inside the poll
    callback. Without the clear, retries append to existing text and the
    getText() === input comparison never converges.
  • Bumped timeout: 5000 → 10000 and reduced interval: 1500 → 500 for more
    retries within a longer window.

Files: TextInputComponentTest.test.ts, AccessibilityTest.test.ts,
ButtonComponentTest.test.ts, FlatListComponentTest.test.ts (×2 helpers),
PointerButtonComponentTest.test.ts, SwitchComponentTest.test.ts,
TouchableComponentTest.test.ts, ViewComponentTest.test.ts,
RNTesterNavigation.ts (inline poll in goToExample).

Install / init / lage step retry

Yarn's own retry path (Yarn classic / Berry, and the midgard-yarn-strict
fork still in use on backport branches) only auto-retries on a small set
of network errors (ECONNRESET / ESOCKETTIMEDOUT / ETIMEDOUT /
ENOTFOUND). Other transient failures — including a fetch helper killed
mid-flight (the observed mode on 0.84-stable, exit code 57005 / 0xDEAD,
PR build 630484) — bypass that retry path entirely and propagate straight
up. ADO supports retryCountOnTaskFailure: 2 at the step level for
exactly this case.

Added to every step on main that fetches from the npm registry:

  • .ado/build-template.ymlStrict yarn install + Build prepare-release and beachball-config.
  • .ado/prepare-release-bot.ymlyarn install + Build prepare-release and dependencies.
  • .ado/templates/strict-yarn-install.yml and
    .ado/templates/yarn-install.yml (the canonical per-build install).
  • .ado/templates/react-native-init-windows.ymlcreaternwapp.cmd and
    creaternwlib.cmd init steps (each runs ~6 npm/yarn fetches
    internally).

Cost when the install passes first try: zero. When it flakes: ADO retries
the step up to twice before failing the build, visible in the pipeline UI
as explicit retry attempts so genuine deterministic failures still surface
clearly within ~1 minute instead of being masked by a manual re-run cycle.

Spell-check enforcement

  • .cspell.json"language": "en""language": "en-US". The broader
    en dictionary accepts both British and American spellings, which let
    inconsistencies (behaviour, synthesised) drift in via reviewer / AI
    contributions without surfacing as warnings. en-US flags those forms in
    the IDE so they get caught at edit time.

PR validation matrix — add X86Hermes

  • .ado/jobs/e2e-test.yml — added X86Hermes to the PullRequest
    buildMatrix so it now matches the Continuous matrix. Previously
    X86Hermes was deferred to post-merge (since PR Revert expansion of PR flavors #8957 in Oct 2021).
    Aligns the gating with what 0.84-stable and earlier release branches
    already enforce on PR, and means an X86-specific regression now blocks
    merge instead of triggering a revert cycle. Trade-off: roughly doubles
    E2E job wall time on PR runs and the agent capacity used per PR. We
    judge that worth it given how often E2E flakes have hidden real
    regressions; happy to discuss if reviewers disagree.

Screenshots

N/A — pipeline / native / test changes only.

Testing

The crash-dump mechanism, multi-dump, and searchBox fixes were validated
end-to-end on the equivalent 0.84-stable PR (#16045) which contains the same
code. Reproducing here for reviewer convenience:

  • Crash simulation (build 630442): simulateCrashForTesting=true
    MaybeSimulateCrashForTesting reads the sentinel flag and dereferences a
    null pointer at startup → InstallInProcessCrashDumpWriter's UEF writes
    full-memory .dmp files (~32 MB each) to
    %ProgramData%\RNW-E2E-Dumps\ → diagnostic step copies them into the
    artifact under in-process/.
  • Hang simulation (build 630470): simulateHangForTesting=true
    HangForTesting posts Sleep(INFINITE) onto the UI dispatcher → jest test
    step times out → post-failure ProcDump captures full-memory dumps of the
    still-alive packaged app (~250 MB each) under hang/. Confirmed dumps
    ride to the artifact intact for both X64Hermes and X86Hermes. With the
    matrix change in this PR, both architectures now run on this PR's own
    validation as well.
  • The snapshot multi-dump fix is observed in build 630476: all 828 snapshots
    passed across the suite. The searchBox fix targets the failure mode of
    that same build (TextInput triggers onPressIn and updates state text
    "Unable to enter correct search text into test searchbox" at 5095 ms);
    PR validation on this branch is the first run with the fix in place.

The crash-dump artifact format is documented inline in
$(CrashDumpRootPath)\README.md, written by the bundle step.

Changelog

Should this change be included in the release notes: no

This is internal CI / test infrastructure. No runtime impact for consumers
of react-native-windows. The only product-code change is the in-process
crash-dump writer in the E2E test app (RNTesterApp-Fabric), which is not
shipped.

Microsoft Reviewers: Open in CodeFlow

@vmoroz vmoroz requested review from a team as code owners April 28, 2026 22:37
@vmoroz vmoroz changed the title Collect dump files and improve snapshot taking for e2e tests Reduce e2e test flakiness Apr 28, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 28, 2026

Performance Test Results

Branch: PR/fix-e2e-test-flakiness
Commit: 0e4ea590
Time: 2026-04-29T00:35:49.179Z
Tests: 161/161 passed

✅ Passed

161 scenario(s) across 28 suite(s) — no regressions

SectionList

Scenario Mean Median StdDev Renders vs Baseline
SectionList mount 4.80ms 5.00ms ±0.63ms 1 +0.0%
SectionList unmount 0.10ms 0.00ms ±0.32ms 0 +0.0%
SectionList rerender 11.30ms 11.00ms ±1.64ms 2 +4.8%
SectionList with-3-sections-15-items 6.20ms 6.00ms ±1.62ms 1 +9.1%
SectionList with-5-sections-50-items 5.90ms 6.00ms ±1.29ms 1 +0.0%
SectionList with-10-sections-200-items 5.90ms 5.00ms ±2.23ms 1 -9.1%
SectionList with-20-sections-200-items 5.10ms 5.00ms ±2.02ms 1 +0.0%
SectionList with-section-separator 1.70ms 2.00ms ±0.67ms 1 +0.0%
SectionList with-item-separator 2.30ms 2.00ms ±0.48ms 1 +0.0%
SectionList with-header-footer 2.60ms 2.00ms ±2.27ms 1 +0.0%
SectionList with-section-footer 2.00ms 2.00ms ±0.67ms 1 +0.0%
SectionList with-sticky-section-headers 1.40ms 1.00ms ±0.52ms 1 -50.0%
SectionList with-empty-list 1.10ms 1.00ms ±1.79ms 1 +0.0%
SectionList with-50-sections-1000-items 1.30ms 1.00ms ±0.48ms 1 -50.0%

FlatList

Scenario Mean Median StdDev Renders vs Baseline
FlatList mount 4.40ms 4.00ms ±1.51ms 1 +0.0%
FlatList unmount 0.20ms 0.00ms ±0.42ms 0 +0.0%
FlatList rerender 9.20ms 9.00ms ±1.14ms 2 +0.0%
FlatList with-10-items 4.30ms 4.00ms ±0.48ms 1 +0.0%
FlatList with-100-items 4.60ms 4.00ms ±1.07ms 1 -20.0%
FlatList with-500-items 4.60ms 4.00ms ±1.90ms 1 +0.0%
FlatList with-1000-items 4.00ms 4.00ms ±0.47ms 1 +0.0%
FlatList horizontal 4.40ms 4.00ms ±2.07ms 1 -20.0%
FlatList with-separator 1.50ms 1.00ms ±0.71ms 1 -50.0%
FlatList with-header-footer 1.80ms 1.00ms ±1.87ms 1 -50.0%
FlatList with-empty-list 0.40ms 0.00ms ±0.52ms 1 -100.0%
FlatList with-get-item-layout 1.20ms 1.00ms ±0.42ms 1 +0.0%
FlatList inverted 1.10ms 1.00ms ±0.32ms 1 -33.3%
FlatList with-num-columns 3.10ms 3.00ms ±1.79ms 1 +0.0%

TouchableOpacity

Scenario Mean Median StdDev Renders vs Baseline
TouchableOpacity mount 0.60ms 1.00ms ±0.52ms 1 +0.0%
TouchableOpacity unmount 0.10ms 0.00ms ±0.32ms 0 +0.0%
TouchableOpacity rerender 1.30ms 1.00ms ±0.48ms 2 +0.0%
TouchableOpacity custom-active-opacity 0.80ms 1.00ms ±0.42ms 1 +0.0%
TouchableOpacity disabled 0.60ms 1.00ms ±0.52ms 1 +0.0%
TouchableOpacity with-all-handlers 0.50ms 0.50ms ±0.53ms 1 -50.0%
TouchableOpacity with-hit-slop 1.20ms 1.00ms ±1.40ms 1 +0.0%
TouchableOpacity with-delay 0.70ms 1.00ms ±0.48ms 1 +0.0%
TouchableOpacity nested 1.20ms 1.00ms ±0.42ms 1 +0.0%
TouchableOpacity multiple-10 4.93ms 5.00ms ±1.22ms 1 -16.7%
TouchableOpacity multiple-50 23.87ms 23.00ms ±3.29ms 1 -20.7%
TouchableOpacity multiple-100 26.40ms 21.00ms ±9.88ms 1 -58.0%

ScrollView

Scenario Mean Median StdDev Renders vs Baseline
ScrollView mount 0.30ms 0.00ms ±0.48ms 1 +0.0%
ScrollView unmount 0.10ms 0.00ms ±0.32ms 0 +0.0%
ScrollView rerender 0.40ms 0.00ms ±0.52ms 2 -100.0%
ScrollView children-20 2.93ms 3.00ms ±0.26ms 1 -25.0%
ScrollView children-100 16.00ms 15.00ms ±2.54ms 1 -6.3%
ScrollView horizontal 3.20ms 3.00ms ±0.63ms 1 -25.0%
ScrollView sticky-headers 2.50ms 3.00ms ±0.71ms 1 +0.0%
ScrollView scroll-indicators 1.00ms 1.00ms ±1.15ms 1 +0.0%
ScrollView nested 1.20ms 1.00ms ±0.42ms 1 +0.0%
ScrollView content-container-style 0.60ms 1.00ms ±0.52ms 1 +0.0%
ScrollView children-500 20.13ms 21.00ms ±4.34ms 1 +10.5%

TouchableHighlight

Scenario Mean Median StdDev Renders vs Baseline
TouchableHighlight mount 0.50ms 0.50ms ±0.53ms 1 +0.0%
TouchableHighlight unmount 0.00ms 0.00ms ±0.00ms 0 +0.0%
TouchableHighlight rerender 0.70ms 1.00ms ±0.48ms 2 +0.0%
TouchableHighlight custom-underlay-color 0.40ms 0.00ms ±0.52ms 1 +0.0%
TouchableHighlight custom-active-opacity 0.20ms 0.00ms ±0.42ms 1 +0.0%
TouchableHighlight disabled 0.30ms 0.00ms ±0.48ms 1 +0.0%
TouchableHighlight with-all-handlers 0.40ms 0.00ms ±0.52ms 1 +0.0%
TouchableHighlight with-hit-slop 0.80ms 0.00ms ±1.55ms 1 +0.0%
TouchableHighlight nested-touchables 0.90ms 1.00ms ±0.32ms 1 +0.0%
TouchableHighlight multiple-touchables-10 2.50ms 2.50ms ±0.53ms 1 -16.7%
TouchableHighlight multiple-touchables-50 13.00ms 12.00ms ±2.71ms 1 -4.0%
TouchableHighlight multiple-touchables-100 26.10ms 25.50ms ±5.78ms 1 +13.3%

Pressable

Scenario Mean Median StdDev Renders vs Baseline
Pressable mount 0.40ms 0.00ms ±0.52ms 1 +0.0%
Pressable unmount 0.00ms 0.00ms ±0.00ms 0 +0.0%
Pressable rerender 0.60ms 1.00ms ±0.52ms 2 +100.0%
Pressable with-all-handlers 0.20ms 0.00ms ±0.42ms 1 +0.0%
Pressable with-style-function 0.30ms 0.00ms ±0.48ms 1 +0.0%
Pressable disabled 0.20ms 0.00ms ±0.42ms 1 +0.0%
Pressable with-hit-slop 0.30ms 0.00ms ±0.48ms 1 +0.0%
Pressable nested 0.70ms 1.00ms ±0.48ms 1 +0.0%
Pressable multiple-10 2.67ms 3.00ms ±0.72ms 1 +0.0%
Pressable multiple-50 14.87ms 14.00ms ±1.92ms 1 +0.0%
Pressable multiple-100 15.60ms 11.00ms ±9.91ms 1 -8.3%

Modal

Scenario Mean Median StdDev Renders vs Baseline
Modal mount 0.30ms 0.00ms ±0.48ms 1 +0.0%
Modal unmount 0.00ms 0.00ms ±0.00ms 0 +0.0%
Modal rerender 0.30ms 0.00ms ±0.48ms 2 +0.0%
Modal slide-animation 0.40ms 0.00ms ±0.52ms 1 +0.0%
Modal fade-animation 0.10ms 0.00ms ±0.32ms 1 +0.0%
Modal transparent 0.40ms 0.00ms ±0.52ms 1 +0.0%
Modal with-callbacks 0.30ms 0.00ms ±0.48ms 1 +0.0%
Modal rich-content 1.60ms 2.00ms ±0.52ms 1 +0.0%
Modal with-accessibility 0.40ms 0.00ms ±0.52ms 1 +0.0%

Image

Scenario Mean Median StdDev Renders vs Baseline
Image mount 0.20ms 0.00ms ±0.42ms 1 +0.0%
Image unmount 0.00ms 0.00ms ±0.00ms 0 +0.0%
Image rerender 0.10ms 0.00ms ±0.32ms 2 +0.0%
Image with-resize-mode 0.10ms 0.00ms ±0.32ms 1 +0.0%
Image with-border-radius 0.10ms 0.00ms ±0.32ms 1 +0.0%
Image with-tint-color 0.10ms 0.00ms ±0.32ms 1 +0.0%
Image with-blur-radius 0.20ms 0.00ms ±0.42ms 1 +0.0%
Image with-accessibility 0.10ms 0.00ms ±0.32ms 1 +0.0%
Image multiple-10 1.20ms 1.00ms ±1.37ms 1 +0.0%
Image multiple-50 3.93ms 4.00ms ±0.26ms 1 +33.3%
Image multiple-100 8.20ms 8.00ms ±1.90ms 1 +0.0%

ActivityIndicator

Scenario Mean Median StdDev Renders vs Baseline
ActivityIndicator mount 0.20ms 0.00ms ±0.42ms 1 +0.0%
ActivityIndicator unmount 0.10ms 0.00ms ±0.32ms 0 +0.0%
ActivityIndicator rerender 0.40ms 0.00ms ±0.52ms 2 +0.0%
ActivityIndicator size-large 0.00ms 0.00ms ±0.00ms 1 +0.0%
ActivityIndicator size-small 0.20ms 0.00ms ±0.42ms 1 +0.0%
ActivityIndicator with-color 0.10ms 0.00ms ±0.32ms 1 +0.0%
ActivityIndicator not-animating 0.20ms 0.00ms ±0.42ms 1 +0.0%
ActivityIndicator with-accessibility 0.20ms 0.00ms ±0.42ms 1 +0.0%
ActivityIndicator multiple-10 1.27ms 1.00ms ±1.33ms 1 +0.0%
ActivityIndicator multiple-50 3.53ms 4.00ms ±0.52ms 1 +0.0%
ActivityIndicator multiple-100 7.67ms 8.00ms ±1.40ms 1 +14.3%

Switch

Scenario Mean Median StdDev Renders vs Baseline
Switch mount 0.30ms 0.00ms ±0.48ms 1 +0.0%
Switch unmount 0.00ms 0.00ms ±0.00ms 0 +0.0%
Switch rerender 0.40ms 0.00ms ±0.52ms 2 -100.0%
Switch value-true 0.20ms 0.00ms ±0.42ms 1 +0.0%
Switch disabled 0.10ms 0.00ms ±0.32ms 1 +0.0%
Switch custom-colors 0.20ms 0.00ms ±0.42ms 1 +0.0%
Switch on-value-change 0.10ms 0.00ms ±0.32ms 1 +0.0%
Switch with-accessibility 0.30ms 0.00ms ±0.48ms 1 +0.0%
Switch multiple-10 1.73ms 1.00ms ±1.28ms 1 -50.0%
Switch multiple-50 9.40ms 8.00ms ±2.61ms 1 -11.1%
Switch multiple-100 18.13ms 16.00ms ±4.24ms 1 +0.0%

Button

Scenario Mean Median StdDev Renders vs Baseline
Button mount 0.60ms 1.00ms ±0.52ms 1 +0.0%
Button unmount 0.10ms 0.00ms ±0.32ms 0 +0.0%
Button rerender 0.90ms 1.00ms ±0.32ms 2 +0.0%
Button disabled 0.60ms 1.00ms ±0.52ms 1 +0.0%
Button with-color 0.50ms 0.50ms ±0.53ms 1 +0.0%
Button with-accessibility 0.60ms 1.00ms ±0.52ms 1 +0.0%
Button multiple-10 5.33ms 5.00ms ±1.54ms 1 -16.7%
Button multiple-50 19.87ms 23.00ms ±8.03ms 1 -14.8%
Button multiple-100 13.87ms 12.00ms ±3.02ms 1 -36.8%

TextInput

Scenario Mean Median StdDev Renders vs Baseline
TextInput mount 0.10ms 0.00ms ±0.32ms 1 +0.0%
TextInput unmount 0.10ms 0.00ms ±0.32ms 0 +0.0%
TextInput rerender 0.20ms 0.00ms ±0.42ms 2 +0.0%
TextInput multiline 0.10ms 0.00ms ±0.32ms 1 +0.0%
TextInput with-value 0.20ms 0.00ms ±0.42ms 1 +0.0%
TextInput styled 0.10ms 0.00ms ±0.32ms 1 +0.0%
TextInput multiple-100 7.73ms 7.00ms ±1.39ms 1 +0.0%

View

Scenario Mean Median StdDev Renders vs Baseline
View mount 0.00ms 0.00ms ±0.00ms 1 +0.0%
View unmount 0.10ms 0.00ms ±0.32ms 0 +0.0%
View rerender 0.00ms 0.00ms ±0.00ms 2 +0.0%
View nested-50 3.20ms 3.00ms ±0.68ms 1 +0.0%
View nested-100 7.73ms 7.00ms ±1.10ms 1 +0.0%
View shadow 0.20ms 0.00ms ±0.42ms 1 +0.0%
View border-radius 0.10ms 0.00ms ±0.32ms 1 +0.0%
View nested-500 17.60ms 10.00ms ±13.30ms 1 +0.0%

Text

Scenario Mean Median StdDev Renders vs Baseline
Text mount 0.20ms 0.00ms ±0.42ms 1 +0.0%
Text unmount 0.00ms 0.00ms ±0.00ms 0 +0.0%
Text rerender 0.10ms 0.00ms ±0.32ms 2 +0.0%
Text long-1000 0.20ms 0.00ms ±0.42ms 1 +0.0%
Text nested 0.30ms 0.00ms ±0.48ms 1 +0.0%
Text styled 0.20ms 0.00ms ±0.42ms 1 +0.0%
Text multiple-100 9.13ms 8.00ms ±2.26ms 1 +14.3%

SectionList.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
SectionList native mount 5.60ms 5.36ms ±0.96ms 1 -17.7%

FlatList.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
FlatList native mount 4.74ms 4.56ms ±0.78ms 1 -50.5%

TouchableHighlight.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
TouchableHighlight native mount 1.51ms 1.54ms ±0.19ms 1 -26.5%

TouchableOpacity.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
TouchableOpacity native mount 1.77ms 1.50ms ±0.83ms 1 -52.3%

Pressable.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
Pressable native mount 1.58ms 1.55ms ±0.19ms 1 -38.2%

ScrollView.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
ScrollView native mount 3.52ms 3.25ms ±0.56ms 1 -19.8%

ActivityIndicator.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
ActivityIndicator native mount 1.38ms 1.34ms ±0.12ms 1 -45.9%

TextInput.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
TextInput native mount 1.84ms 1.78ms ±0.22ms 1 -56.5%

Switch.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
Switch native mount 1.35ms 1.30ms ±0.16ms 1 -24.8%

Button.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
Button native mount 1.56ms 1.47ms ±0.27ms 1 -43.3%

Modal.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
Modal native mount 0.86ms 0.81ms ±0.17ms 1 -33.8%

Image.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
Image native mount 1.60ms 1.53ms ±0.20ms 1 -32.2%

View.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
View native mount 0.89ms 0.87ms ±0.06ms 1 -39.4%

Text.native-perf-test.ts

Scenario Mean Median StdDev Renders vs Baseline
Text native mount 1.22ms 1.09ms ±0.46ms 1 -37.1%

@vmoroz vmoroz enabled auto-merge (squash) April 28, 2026 23:15
@vmoroz vmoroz merged commit 3d64f71 into microsoft:main Apr 29, 2026
33 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants