Skip to content

Fix per-node memory regression caused by Grid styles - #2018

Closed
intergalacticspacehighway wants to merge 2 commits into
react:mainfrom
intergalacticspacehighway:grid-style-size
Closed

Fix per-node memory regression caused by Grid styles#2018
intergalacticspacehighway wants to merge 2 commits into
react:mainfrom
intergalacticspacehighway:grid-style-size

Conversation

@intergalacticspacehighway

@intergalacticspacehighway intergalacticspacehighway commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Why

Currently, grid style properties are stored in yoga style (gridTemplateRows_, gridAutoColumns_ etc). These properties increase the size of style object from 152 bytes to 280 bytes (84% increase). The cost is added even when a node is not a grid container or a grid item.

How

Move grid style properties behind a pointer that is lazily allocated, on the first grid property set. A node that doesn't use grid only adds the cost of this pointer (8 bytes). So style now costs 160 bytes (5% increase). The public API remains unchanged.

Tests

A test is added to catch the style size regression and tests/GridStyleTest.cpp includes additional cases to assert unset style, copy and move behaviour.

@meta-cla meta-cla Bot added the CLA Signed label Sep 2, 2026
Style is held by value in every node. An empty std::vector still costs its
three pointers, so the four grid track lists take 96 bytes even on a node
with no tracks. Grid style now sits behind one pointer which stays null
until a grid property is set.

sizeof(Style): 280 -> 160.
@intergalacticspacehighway
intergalacticspacehighway marked this pull request as ready for review September 2, 2026 03:47
@facebook-github-tools facebook-github-tools Bot added the Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. label Sep 2, 2026
@meta-codesync

meta-codesync Bot commented Sep 3, 2026

Copy link
Copy Markdown

@javache has imported this pull request. If you are a Meta employee, you can view this in D118628661.

javache pushed a commit to javache/react-native that referenced this pull request Sep 4, 2026
Summary:

# Why

Currently, grid style properties are stored in yoga style (`gridTemplateRows_`, `gridAutoColumns_` etc). These properties increase the size of style object from `152` bytes to `280` bytes (84% increase). The cost is added even when a node is not a grid container or a grid item.

# How

Move grid style properties behind a pointer that is lazily allocated, on the first grid property set. A node that doesn't use grid only adds the cost of this pointer (8 bytes). So style now costs 160 bytes (5% increase). The public API remains unchanged.

# Tests

A test is added to catch the style size regression and `tests/GridStyleTest.cpp` includes additional cases to assert unset style, copy and move behaviour.

X-link: react/yoga#2018

Reviewed By: rubennorte

Differential Revision: D118628661

Pulled By: javache
@meta-codesync meta-codesync Bot closed this in 9830084 Sep 4, 2026
@meta-codesync meta-codesync Bot added the Merged label Sep 4, 2026
@meta-codesync

meta-codesync Bot commented Sep 4, 2026

Copy link
Copy Markdown

@javache merged this pull request in 9830084.

meta-codesync Bot pushed a commit to react/react-native that referenced this pull request Sep 4, 2026
Summary:
Pull Request resolved: #58311

# Why

Currently, grid style properties are stored in yoga style (`gridTemplateRows_`, `gridAutoColumns_` etc). These properties increase the size of style object from `152` bytes to `280` bytes (84% increase). The cost is added even when a node is not a grid container or a grid item.

# How

Move grid style properties behind a pointer that is lazily allocated, on the first grid property set. A node that doesn't use grid only adds the cost of this pointer (8 bytes). So style now costs 160 bytes (5% increase). The public API remains unchanged.

# Tests

A test is added to catch the style size regression and `tests/GridStyleTest.cpp` includes additional cases to assert unset style, copy and move behaviour.

Changelog: [Internal]

X-link: react/yoga#2018

Reviewed By: rubennorte

Differential Revision: D118628661

Pulled By: javache

fbshipit-source-id: 185370e93bcf5b277b48c436ba3d06dada5a66fe
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed Merged Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant