Skip to content

[Perf Tracks]: Clear potentially large measures - #34803

Merged
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures
Oct 13, 2025
Merged

[Perf Tracks]: Clear potentially large measures#34803
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures

Conversation

@hoxyq

@hoxyqhoxyq commented Oct 10, 2025

Copy link
Copy Markdown
Collaborator

Fixes#34770.

We need to clear measures at some point, otherwise all these copies of props that we end up recording will allocate too much memory in Chromium. This adds performance.clearMeasures(...) calls to such cases in DEV.

Validated that entries are still shown on Performance panel timeline.

};

const resuableChangedPropsEntry = ['Changed Props', ''];
const reusableChangedPropsEntry = ['Changed Props', ''];

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

drive-by typo fix

@react-sizebot

react-sizebot commented Oct 10, 2025

Copy link
Copy Markdown

Comparing: 47905a7...b42f3b2

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.38 kB=117.09 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.25 kB=121.13 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.67 kB=119.48 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.41%171.73 kB172.43 kB+0.31%29.92 kB30.02 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.41%171.75 kB172.45 kB+0.31%29.94 kB30.04 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.40%172.63 kB173.33 kB+0.32%30.09 kB30.18 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.32 kB177.02 kB+0.32%30.97 kB31.07 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.37 kB177.07 kB+0.31%31.00 kB31.09 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.39%177.25 kB177.95 kB+0.29%31.14 kB31.23 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%177.82 kB178.51 kB+0.30%31.54 kB31.64 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.28 kB178.98 kB+0.28%31.42 kB31.50 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.33 kB179.03 kB+0.27%31.44 kB31.53 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%179.22 kB179.91 kB+0.30%31.58 kB31.67 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.86 kB181.56 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.91 kB181.61 kB+0.29%31.92 kB32.02 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%181.03 kB181.72 kB+0.29%32.04 kB32.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.38%181.05 kB181.75 kB+0.30%32.05 kB32.15 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.48 kB182.18 kB+0.31%32.06 kB32.16 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.53 kB182.23 kB+0.31%32.09 kB32.19 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.38%181.79 kB182.49 kB+0.29%32.07 kB32.16 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%182.25 kB182.95 kB+0.30%32.20 kB32.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%182.41 kB183.11 kB+0.30%32.23 kB32.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.93 kB184.62 kB+0.29%32.25 kB32.34 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%185.63 kB186.33 kB+0.29%32.52 kB32.61 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%187.04 kB187.74 kB+0.30%32.77 kB32.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%187.06 kB187.76 kB+0.29%32.78 kB32.88 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.30 kB222.83 kB+0.11%49.15 kB49.20 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.32 kB222.85 kB+0.12%49.17 kB49.23 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%223.46 kB223.99 kB+0.11%49.38 kB49.44 kB

Generated by 🚫 dangerJS against b42f3b2

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only drawback I can think of right now is that they won't be available in performance.getEntries() and PerformanceObserver, but that doesn't really make any sense for DEV envs.

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

It is technically feasible, I am just not sure why would someone do it via User Timings in DEV.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

I am not sure, but it looks like so. Having an Observer doesn't imply clearing buffered entries, so I guess we need to do it manually.

I think we should do it after every .mark() or .measure() calls, unfortunately.

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 0d9a0b5 to 41bc2deCompareOctober 13, 2025 17:27
@eps1lon

Copy link
Copy Markdown
Collaborator

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Though I don't see how the linked spec text confirms that.

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Sorry, summary was not up to date, actually PerformanceObserver should not be affected at all.

Though I don't see how the linked spec text confirms that.

The value is pushed to the observed entries list as part of the measure() call. Then, the PerformanceObserver task is scheduled, but it has a lower priority. Even if the .clearMeasures() will end up executing first, it should not clear the value from the internal PerformanceObserver's buffer.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 41bc2de to 11a58a3CompareOctober 13, 2025 21:26
@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 11a58a3 to b42f3b2CompareOctober 13, 2025 21:34
@hoxyq
hoxyq merged commit b9ec735 into react:mainOct 13, 2025
240 of 241 checks passed
@hoxyq
hoxyq deleted the perf-tracks/clear-expensive-measures branch October 13, 2025 21:42
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
meta-codesyncBot pushed a commit to react/react-native that referenced this pull request Oct 21, 2025
)
Summary:
Pull Request resolved: #54214
# Changelog: [Internal]
React started using `clearMeasures` in react/react#34803. It only does it if `performance.measure()` is defined. This should be enough for a feature check of User Timings API presence, but out stub doesn't follow the same spec.
Adding `clearMarks()` and `clearMeasures()` stubs to the object.
Reviewed By: rubennorte
Differential Revision: D85082720
fbshipit-source-id: 3b117a6545e131cdbb2d5efb73d500a928469864
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Massive memory allocations using React dev build under frequent updates (prod build unaffected)

3 participants

@hoxyq@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[Perf Tracks]: Clear potentially large measures by hoxyq · Pull Request #34803 · react/react · GitHub
Skip to content

[Perf Tracks]: Clear potentially large measures - #34803

Merged
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures
Oct 13, 2025
Merged

[Perf Tracks]: Clear potentially large measures#34803
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures

Conversation

@hoxyq

@hoxyqhoxyq commented Oct 10, 2025

Copy link
Copy Markdown
Collaborator

Fixes#34770.

We need to clear measures at some point, otherwise all these copies of props that we end up recording will allocate too much memory in Chromium. This adds performance.clearMeasures(...) calls to such cases in DEV.

Validated that entries are still shown on Performance panel timeline.

};

const resuableChangedPropsEntry = ['Changed Props', ''];
const reusableChangedPropsEntry = ['Changed Props', ''];

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

drive-by typo fix

@react-sizebot

react-sizebot commented Oct 10, 2025

Copy link
Copy Markdown

Comparing: 47905a7...b42f3b2

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.38 kB=117.09 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.25 kB=121.13 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.67 kB=119.48 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.41%171.73 kB172.43 kB+0.31%29.92 kB30.02 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.41%171.75 kB172.45 kB+0.31%29.94 kB30.04 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.40%172.63 kB173.33 kB+0.32%30.09 kB30.18 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.32 kB177.02 kB+0.32%30.97 kB31.07 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.37 kB177.07 kB+0.31%31.00 kB31.09 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.39%177.25 kB177.95 kB+0.29%31.14 kB31.23 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%177.82 kB178.51 kB+0.30%31.54 kB31.64 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.28 kB178.98 kB+0.28%31.42 kB31.50 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.33 kB179.03 kB+0.27%31.44 kB31.53 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%179.22 kB179.91 kB+0.30%31.58 kB31.67 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.86 kB181.56 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.91 kB181.61 kB+0.29%31.92 kB32.02 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%181.03 kB181.72 kB+0.29%32.04 kB32.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.38%181.05 kB181.75 kB+0.30%32.05 kB32.15 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.48 kB182.18 kB+0.31%32.06 kB32.16 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.53 kB182.23 kB+0.31%32.09 kB32.19 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.38%181.79 kB182.49 kB+0.29%32.07 kB32.16 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%182.25 kB182.95 kB+0.30%32.20 kB32.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%182.41 kB183.11 kB+0.30%32.23 kB32.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.93 kB184.62 kB+0.29%32.25 kB32.34 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%185.63 kB186.33 kB+0.29%32.52 kB32.61 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%187.04 kB187.74 kB+0.30%32.77 kB32.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%187.06 kB187.76 kB+0.29%32.78 kB32.88 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.30 kB222.83 kB+0.11%49.15 kB49.20 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.32 kB222.85 kB+0.12%49.17 kB49.23 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%223.46 kB223.99 kB+0.11%49.38 kB49.44 kB

Generated by 🚫 dangerJS against b42f3b2

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only drawback I can think of right now is that they won't be available in performance.getEntries() and PerformanceObserver, but that doesn't really make any sense for DEV envs.

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

It is technically feasible, I am just not sure why would someone do it via User Timings in DEV.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

I am not sure, but it looks like so. Having an Observer doesn't imply clearing buffered entries, so I guess we need to do it manually.

I think we should do it after every .mark() or .measure() calls, unfortunately.

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 0d9a0b5 to 41bc2deCompareOctober 13, 2025 17:27
@eps1lon

Copy link
Copy Markdown
Collaborator

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Though I don't see how the linked spec text confirms that.

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Sorry, summary was not up to date, actually PerformanceObserver should not be affected at all.

Though I don't see how the linked spec text confirms that.

The value is pushed to the observed entries list as part of the measure() call. Then, the PerformanceObserver task is scheduled, but it has a lower priority. Even if the .clearMeasures() will end up executing first, it should not clear the value from the internal PerformanceObserver's buffer.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 41bc2de to 11a58a3CompareOctober 13, 2025 21:26
@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 11a58a3 to b42f3b2CompareOctober 13, 2025 21:34
@hoxyq
hoxyq merged commit b9ec735 into react:mainOct 13, 2025
240 of 241 checks passed
@hoxyq
hoxyq deleted the perf-tracks/clear-expensive-measures branch October 13, 2025 21:42
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
meta-codesyncBot pushed a commit to react/react-native that referenced this pull request Oct 21, 2025
)
Summary:
Pull Request resolved: #54214
# Changelog: [Internal]
React started using `clearMeasures` in react/react#34803. It only does it if `performance.measure()` is defined. This should be enough for a feature check of User Timings API presence, but out stub doesn't follow the same spec.
Adding `clearMarks()` and `clearMeasures()` stubs to the object.
Reviewed By: rubennorte
Differential Revision: D85082720
fbshipit-source-id: 3b117a6545e131cdbb2d5efb73d500a928469864
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Massive memory allocations using React dev build under frequent updates (prod build unaffected)

3 participants

@hoxyq@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [Perf Tracks]: Clear potentially large measures by hoxyq · Pull Request #34803 · react/react · GitHub
Skip to content

[Perf Tracks]: Clear potentially large measures - #34803

Merged
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures
Oct 13, 2025
Merged

[Perf Tracks]: Clear potentially large measures#34803
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures

Conversation

@hoxyq

@hoxyqhoxyq commented Oct 10, 2025

Copy link
Copy Markdown
Collaborator

Fixes#34770.

We need to clear measures at some point, otherwise all these copies of props that we end up recording will allocate too much memory in Chromium. This adds performance.clearMeasures(...) calls to such cases in DEV.

Validated that entries are still shown on Performance panel timeline.

};

const resuableChangedPropsEntry = ['Changed Props', ''];
const reusableChangedPropsEntry = ['Changed Props', ''];

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

drive-by typo fix

@react-sizebot

react-sizebot commented Oct 10, 2025

Copy link
Copy Markdown

Comparing: 47905a7...b42f3b2

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.38 kB=117.09 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.25 kB=121.13 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.67 kB=119.48 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.41%171.73 kB172.43 kB+0.31%29.92 kB30.02 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.41%171.75 kB172.45 kB+0.31%29.94 kB30.04 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.40%172.63 kB173.33 kB+0.32%30.09 kB30.18 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.32 kB177.02 kB+0.32%30.97 kB31.07 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.37 kB177.07 kB+0.31%31.00 kB31.09 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.39%177.25 kB177.95 kB+0.29%31.14 kB31.23 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%177.82 kB178.51 kB+0.30%31.54 kB31.64 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.28 kB178.98 kB+0.28%31.42 kB31.50 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.33 kB179.03 kB+0.27%31.44 kB31.53 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%179.22 kB179.91 kB+0.30%31.58 kB31.67 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.86 kB181.56 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.91 kB181.61 kB+0.29%31.92 kB32.02 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%181.03 kB181.72 kB+0.29%32.04 kB32.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.38%181.05 kB181.75 kB+0.30%32.05 kB32.15 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.48 kB182.18 kB+0.31%32.06 kB32.16 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.53 kB182.23 kB+0.31%32.09 kB32.19 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.38%181.79 kB182.49 kB+0.29%32.07 kB32.16 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%182.25 kB182.95 kB+0.30%32.20 kB32.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%182.41 kB183.11 kB+0.30%32.23 kB32.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.93 kB184.62 kB+0.29%32.25 kB32.34 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%185.63 kB186.33 kB+0.29%32.52 kB32.61 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%187.04 kB187.74 kB+0.30%32.77 kB32.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%187.06 kB187.76 kB+0.29%32.78 kB32.88 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.30 kB222.83 kB+0.11%49.15 kB49.20 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.32 kB222.85 kB+0.12%49.17 kB49.23 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%223.46 kB223.99 kB+0.11%49.38 kB49.44 kB

Generated by 🚫 dangerJS against b42f3b2

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only drawback I can think of right now is that they won't be available in performance.getEntries() and PerformanceObserver, but that doesn't really make any sense for DEV envs.

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

It is technically feasible, I am just not sure why would someone do it via User Timings in DEV.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

I am not sure, but it looks like so. Having an Observer doesn't imply clearing buffered entries, so I guess we need to do it manually.

I think we should do it after every .mark() or .measure() calls, unfortunately.

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 0d9a0b5 to 41bc2deCompareOctober 13, 2025 17:27
@eps1lon

Copy link
Copy Markdown
Collaborator

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Though I don't see how the linked spec text confirms that.

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Sorry, summary was not up to date, actually PerformanceObserver should not be affected at all.

Though I don't see how the linked spec text confirms that.

The value is pushed to the observed entries list as part of the measure() call. Then, the PerformanceObserver task is scheduled, but it has a lower priority. Even if the .clearMeasures() will end up executing first, it should not clear the value from the internal PerformanceObserver's buffer.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 41bc2de to 11a58a3CompareOctober 13, 2025 21:26
@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 11a58a3 to b42f3b2CompareOctober 13, 2025 21:34
@hoxyq
hoxyq merged commit b9ec735 into react:mainOct 13, 2025
240 of 241 checks passed
@hoxyq
hoxyq deleted the perf-tracks/clear-expensive-measures branch October 13, 2025 21:42
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
meta-codesyncBot pushed a commit to react/react-native that referenced this pull request Oct 21, 2025
)
Summary:
Pull Request resolved: #54214
# Changelog: [Internal]
React started using `clearMeasures` in react/react#34803. It only does it if `performance.measure()` is defined. This should be enough for a feature check of User Timings API presence, but out stub doesn't follow the same spec.
Adding `clearMarks()` and `clearMeasures()` stubs to the object.
Reviewed By: rubennorte
Differential Revision: D85082720
fbshipit-source-id: 3b117a6545e131cdbb2d5efb73d500a928469864
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Massive memory allocations using React dev build under frequent updates (prod build unaffected)

3 participants

@hoxyq@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [Perf Tracks]: Clear potentially large measures by hoxyq · Pull Request #34803 · react/react · GitHub
Skip to content

[Perf Tracks]: Clear potentially large measures - #34803

Merged
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures
Oct 13, 2025
Merged

[Perf Tracks]: Clear potentially large measures#34803
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures

Conversation

@hoxyq

@hoxyqhoxyq commented Oct 10, 2025

Copy link
Copy Markdown
Collaborator

Fixes#34770.

We need to clear measures at some point, otherwise all these copies of props that we end up recording will allocate too much memory in Chromium. This adds performance.clearMeasures(...) calls to such cases in DEV.

Validated that entries are still shown on Performance panel timeline.

};

const resuableChangedPropsEntry = ['Changed Props', ''];
const reusableChangedPropsEntry = ['Changed Props', ''];

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

drive-by typo fix

@react-sizebot

react-sizebot commented Oct 10, 2025

Copy link
Copy Markdown

Comparing: 47905a7...b42f3b2

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.38 kB=117.09 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.25 kB=121.13 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.67 kB=119.48 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.41%171.73 kB172.43 kB+0.31%29.92 kB30.02 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.41%171.75 kB172.45 kB+0.31%29.94 kB30.04 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.40%172.63 kB173.33 kB+0.32%30.09 kB30.18 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.32 kB177.02 kB+0.32%30.97 kB31.07 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.37 kB177.07 kB+0.31%31.00 kB31.09 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.39%177.25 kB177.95 kB+0.29%31.14 kB31.23 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%177.82 kB178.51 kB+0.30%31.54 kB31.64 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.28 kB178.98 kB+0.28%31.42 kB31.50 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.33 kB179.03 kB+0.27%31.44 kB31.53 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%179.22 kB179.91 kB+0.30%31.58 kB31.67 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.86 kB181.56 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.91 kB181.61 kB+0.29%31.92 kB32.02 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%181.03 kB181.72 kB+0.29%32.04 kB32.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.38%181.05 kB181.75 kB+0.30%32.05 kB32.15 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.48 kB182.18 kB+0.31%32.06 kB32.16 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.53 kB182.23 kB+0.31%32.09 kB32.19 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.38%181.79 kB182.49 kB+0.29%32.07 kB32.16 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%182.25 kB182.95 kB+0.30%32.20 kB32.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%182.41 kB183.11 kB+0.30%32.23 kB32.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.93 kB184.62 kB+0.29%32.25 kB32.34 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%185.63 kB186.33 kB+0.29%32.52 kB32.61 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%187.04 kB187.74 kB+0.30%32.77 kB32.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%187.06 kB187.76 kB+0.29%32.78 kB32.88 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.30 kB222.83 kB+0.11%49.15 kB49.20 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.32 kB222.85 kB+0.12%49.17 kB49.23 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%223.46 kB223.99 kB+0.11%49.38 kB49.44 kB

Generated by 🚫 dangerJS against b42f3b2

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only drawback I can think of right now is that they won't be available in performance.getEntries() and PerformanceObserver, but that doesn't really make any sense for DEV envs.

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

It is technically feasible, I am just not sure why would someone do it via User Timings in DEV.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

I am not sure, but it looks like so. Having an Observer doesn't imply clearing buffered entries, so I guess we need to do it manually.

I think we should do it after every .mark() or .measure() calls, unfortunately.

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 0d9a0b5 to 41bc2deCompareOctober 13, 2025 17:27
@eps1lon

Copy link
Copy Markdown
Collaborator

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Though I don't see how the linked spec text confirms that.

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Sorry, summary was not up to date, actually PerformanceObserver should not be affected at all.

Though I don't see how the linked spec text confirms that.

The value is pushed to the observed entries list as part of the measure() call. Then, the PerformanceObserver task is scheduled, but it has a lower priority. Even if the .clearMeasures() will end up executing first, it should not clear the value from the internal PerformanceObserver's buffer.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 41bc2de to 11a58a3CompareOctober 13, 2025 21:26
@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 11a58a3 to b42f3b2CompareOctober 13, 2025 21:34
@hoxyq
hoxyq merged commit b9ec735 into react:mainOct 13, 2025
240 of 241 checks passed
@hoxyq
hoxyq deleted the perf-tracks/clear-expensive-measures branch October 13, 2025 21:42
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
meta-codesyncBot pushed a commit to react/react-native that referenced this pull request Oct 21, 2025
)
Summary:
Pull Request resolved: #54214
# Changelog: [Internal]
React started using `clearMeasures` in react/react#34803. It only does it if `performance.measure()` is defined. This should be enough for a feature check of User Timings API presence, but out stub doesn't follow the same spec.
Adding `clearMarks()` and `clearMeasures()` stubs to the object.
Reviewed By: rubennorte
Differential Revision: D85082720
fbshipit-source-id: 3b117a6545e131cdbb2d5efb73d500a928469864
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Massive memory allocations using React dev build under frequent updates (prod build unaffected)

3 participants

@hoxyq@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [Perf Tracks]: Clear potentially large measures by hoxyq · Pull Request #34803 · react/react · GitHub
Skip to content

[Perf Tracks]: Clear potentially large measures - #34803

Merged
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures
Oct 13, 2025
Merged

[Perf Tracks]: Clear potentially large measures#34803
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures

Conversation

@hoxyq

@hoxyqhoxyq commented Oct 10, 2025

Copy link
Copy Markdown
Collaborator

Fixes#34770.

We need to clear measures at some point, otherwise all these copies of props that we end up recording will allocate too much memory in Chromium. This adds performance.clearMeasures(...) calls to such cases in DEV.

Validated that entries are still shown on Performance panel timeline.

};

const resuableChangedPropsEntry = ['Changed Props', ''];
const reusableChangedPropsEntry = ['Changed Props', ''];

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

drive-by typo fix

@react-sizebot

react-sizebot commented Oct 10, 2025

Copy link
Copy Markdown

Comparing: 47905a7...b42f3b2

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.38 kB=117.09 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.25 kB=121.13 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.67 kB=119.48 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.41%171.73 kB172.43 kB+0.31%29.92 kB30.02 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.41%171.75 kB172.45 kB+0.31%29.94 kB30.04 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.40%172.63 kB173.33 kB+0.32%30.09 kB30.18 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.32 kB177.02 kB+0.32%30.97 kB31.07 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.37 kB177.07 kB+0.31%31.00 kB31.09 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.39%177.25 kB177.95 kB+0.29%31.14 kB31.23 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%177.82 kB178.51 kB+0.30%31.54 kB31.64 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.28 kB178.98 kB+0.28%31.42 kB31.50 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.33 kB179.03 kB+0.27%31.44 kB31.53 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%179.22 kB179.91 kB+0.30%31.58 kB31.67 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.86 kB181.56 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.91 kB181.61 kB+0.29%31.92 kB32.02 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%181.03 kB181.72 kB+0.29%32.04 kB32.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.38%181.05 kB181.75 kB+0.30%32.05 kB32.15 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.48 kB182.18 kB+0.31%32.06 kB32.16 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.53 kB182.23 kB+0.31%32.09 kB32.19 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.38%181.79 kB182.49 kB+0.29%32.07 kB32.16 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%182.25 kB182.95 kB+0.30%32.20 kB32.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%182.41 kB183.11 kB+0.30%32.23 kB32.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.93 kB184.62 kB+0.29%32.25 kB32.34 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%185.63 kB186.33 kB+0.29%32.52 kB32.61 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%187.04 kB187.74 kB+0.30%32.77 kB32.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%187.06 kB187.76 kB+0.29%32.78 kB32.88 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.30 kB222.83 kB+0.11%49.15 kB49.20 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.32 kB222.85 kB+0.12%49.17 kB49.23 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%223.46 kB223.99 kB+0.11%49.38 kB49.44 kB

Generated by 🚫 dangerJS against b42f3b2

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only drawback I can think of right now is that they won't be available in performance.getEntries() and PerformanceObserver, but that doesn't really make any sense for DEV envs.

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

It is technically feasible, I am just not sure why would someone do it via User Timings in DEV.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

I am not sure, but it looks like so. Having an Observer doesn't imply clearing buffered entries, so I guess we need to do it manually.

I think we should do it after every .mark() or .measure() calls, unfortunately.

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 0d9a0b5 to 41bc2deCompareOctober 13, 2025 17:27
@eps1lon

Copy link
Copy Markdown
Collaborator

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Though I don't see how the linked spec text confirms that.

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Sorry, summary was not up to date, actually PerformanceObserver should not be affected at all.

Though I don't see how the linked spec text confirms that.

The value is pushed to the observed entries list as part of the measure() call. Then, the PerformanceObserver task is scheduled, but it has a lower priority. Even if the .clearMeasures() will end up executing first, it should not clear the value from the internal PerformanceObserver's buffer.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 41bc2de to 11a58a3CompareOctober 13, 2025 21:26
@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 11a58a3 to b42f3b2CompareOctober 13, 2025 21:34
@hoxyq
hoxyq merged commit b9ec735 into react:mainOct 13, 2025
240 of 241 checks passed
@hoxyq
hoxyq deleted the perf-tracks/clear-expensive-measures branch October 13, 2025 21:42
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
meta-codesyncBot pushed a commit to react/react-native that referenced this pull request Oct 21, 2025
)
Summary:
Pull Request resolved: #54214
# Changelog: [Internal]
React started using `clearMeasures` in react/react#34803. It only does it if `performance.measure()` is defined. This should be enough for a feature check of User Timings API presence, but out stub doesn't follow the same spec.
Adding `clearMarks()` and `clearMeasures()` stubs to the object.
Reviewed By: rubennorte
Differential Revision: D85082720
fbshipit-source-id: 3b117a6545e131cdbb2d5efb73d500a928469864
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Massive memory allocations using React dev build under frequent updates (prod build unaffected)

3 participants

@hoxyq@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [Perf Tracks]: Clear potentially large measures by hoxyq · Pull Request #34803 · react/react · GitHub
Skip to content

[Perf Tracks]: Clear potentially large measures - #34803

Merged
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures
Oct 13, 2025
Merged

[Perf Tracks]: Clear potentially large measures#34803
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures

Conversation

@hoxyq

@hoxyqhoxyq commented Oct 10, 2025

Copy link
Copy Markdown
Collaborator

Fixes#34770.

We need to clear measures at some point, otherwise all these copies of props that we end up recording will allocate too much memory in Chromium. This adds performance.clearMeasures(...) calls to such cases in DEV.

Validated that entries are still shown on Performance panel timeline.

};

const resuableChangedPropsEntry = ['Changed Props', ''];
const reusableChangedPropsEntry = ['Changed Props', ''];

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

drive-by typo fix

@react-sizebot

react-sizebot commented Oct 10, 2025

Copy link
Copy Markdown

Comparing: 47905a7...b42f3b2

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.38 kB=117.09 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.25 kB=121.13 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.67 kB=119.48 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.41%171.73 kB172.43 kB+0.31%29.92 kB30.02 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.41%171.75 kB172.45 kB+0.31%29.94 kB30.04 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.40%172.63 kB173.33 kB+0.32%30.09 kB30.18 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.32 kB177.02 kB+0.32%30.97 kB31.07 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.37 kB177.07 kB+0.31%31.00 kB31.09 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.39%177.25 kB177.95 kB+0.29%31.14 kB31.23 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%177.82 kB178.51 kB+0.30%31.54 kB31.64 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.28 kB178.98 kB+0.28%31.42 kB31.50 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.33 kB179.03 kB+0.27%31.44 kB31.53 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%179.22 kB179.91 kB+0.30%31.58 kB31.67 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.86 kB181.56 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.91 kB181.61 kB+0.29%31.92 kB32.02 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%181.03 kB181.72 kB+0.29%32.04 kB32.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.38%181.05 kB181.75 kB+0.30%32.05 kB32.15 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.48 kB182.18 kB+0.31%32.06 kB32.16 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.53 kB182.23 kB+0.31%32.09 kB32.19 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.38%181.79 kB182.49 kB+0.29%32.07 kB32.16 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%182.25 kB182.95 kB+0.30%32.20 kB32.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%182.41 kB183.11 kB+0.30%32.23 kB32.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.93 kB184.62 kB+0.29%32.25 kB32.34 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%185.63 kB186.33 kB+0.29%32.52 kB32.61 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%187.04 kB187.74 kB+0.30%32.77 kB32.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%187.06 kB187.76 kB+0.29%32.78 kB32.88 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.30 kB222.83 kB+0.11%49.15 kB49.20 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.32 kB222.85 kB+0.12%49.17 kB49.23 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%223.46 kB223.99 kB+0.11%49.38 kB49.44 kB

Generated by 🚫 dangerJS against b42f3b2

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only drawback I can think of right now is that they won't be available in performance.getEntries() and PerformanceObserver, but that doesn't really make any sense for DEV envs.

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

It is technically feasible, I am just not sure why would someone do it via User Timings in DEV.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

I am not sure, but it looks like so. Having an Observer doesn't imply clearing buffered entries, so I guess we need to do it manually.

I think we should do it after every .mark() or .measure() calls, unfortunately.

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 0d9a0b5 to 41bc2deCompareOctober 13, 2025 17:27
@eps1lon

Copy link
Copy Markdown
Collaborator

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Though I don't see how the linked spec text confirms that.

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Sorry, summary was not up to date, actually PerformanceObserver should not be affected at all.

Though I don't see how the linked spec text confirms that.

The value is pushed to the observed entries list as part of the measure() call. Then, the PerformanceObserver task is scheduled, but it has a lower priority. Even if the .clearMeasures() will end up executing first, it should not clear the value from the internal PerformanceObserver's buffer.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 41bc2de to 11a58a3CompareOctober 13, 2025 21:26
@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 11a58a3 to b42f3b2CompareOctober 13, 2025 21:34
@hoxyq
hoxyq merged commit b9ec735 into react:mainOct 13, 2025
240 of 241 checks passed
@hoxyq
hoxyq deleted the perf-tracks/clear-expensive-measures branch October 13, 2025 21:42
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
meta-codesyncBot pushed a commit to react/react-native that referenced this pull request Oct 21, 2025
)
Summary:
Pull Request resolved: #54214
# Changelog: [Internal]
React started using `clearMeasures` in react/react#34803. It only does it if `performance.measure()` is defined. This should be enough for a feature check of User Timings API presence, but out stub doesn't follow the same spec.
Adding `clearMarks()` and `clearMeasures()` stubs to the object.
Reviewed By: rubennorte
Differential Revision: D85082720
fbshipit-source-id: 3b117a6545e131cdbb2d5efb73d500a928469864
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Massive memory allocations using React dev build under frequent updates (prod build unaffected)

3 participants

@hoxyq@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [Perf Tracks]: Clear potentially large measures by hoxyq · Pull Request #34803 · react/react · GitHub
Skip to content

[Perf Tracks]: Clear potentially large measures - #34803

Merged
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures
Oct 13, 2025
Merged

[Perf Tracks]: Clear potentially large measures#34803
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures

Conversation

@hoxyq

@hoxyqhoxyq commented Oct 10, 2025

Copy link
Copy Markdown
Collaborator

Fixes#34770.

We need to clear measures at some point, otherwise all these copies of props that we end up recording will allocate too much memory in Chromium. This adds performance.clearMeasures(...) calls to such cases in DEV.

Validated that entries are still shown on Performance panel timeline.

};

const resuableChangedPropsEntry = ['Changed Props', ''];
const reusableChangedPropsEntry = ['Changed Props', ''];

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

drive-by typo fix

@react-sizebot

react-sizebot commented Oct 10, 2025

Copy link
Copy Markdown

Comparing: 47905a7...b42f3b2

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.38 kB=117.09 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.25 kB=121.13 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.67 kB=119.48 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.41%171.73 kB172.43 kB+0.31%29.92 kB30.02 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.41%171.75 kB172.45 kB+0.31%29.94 kB30.04 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.40%172.63 kB173.33 kB+0.32%30.09 kB30.18 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.32 kB177.02 kB+0.32%30.97 kB31.07 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.37 kB177.07 kB+0.31%31.00 kB31.09 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.39%177.25 kB177.95 kB+0.29%31.14 kB31.23 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%177.82 kB178.51 kB+0.30%31.54 kB31.64 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.28 kB178.98 kB+0.28%31.42 kB31.50 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.33 kB179.03 kB+0.27%31.44 kB31.53 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%179.22 kB179.91 kB+0.30%31.58 kB31.67 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.86 kB181.56 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.91 kB181.61 kB+0.29%31.92 kB32.02 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%181.03 kB181.72 kB+0.29%32.04 kB32.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.38%181.05 kB181.75 kB+0.30%32.05 kB32.15 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.48 kB182.18 kB+0.31%32.06 kB32.16 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.53 kB182.23 kB+0.31%32.09 kB32.19 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.38%181.79 kB182.49 kB+0.29%32.07 kB32.16 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%182.25 kB182.95 kB+0.30%32.20 kB32.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%182.41 kB183.11 kB+0.30%32.23 kB32.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.93 kB184.62 kB+0.29%32.25 kB32.34 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%185.63 kB186.33 kB+0.29%32.52 kB32.61 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%187.04 kB187.74 kB+0.30%32.77 kB32.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%187.06 kB187.76 kB+0.29%32.78 kB32.88 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.30 kB222.83 kB+0.11%49.15 kB49.20 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.32 kB222.85 kB+0.12%49.17 kB49.23 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%223.46 kB223.99 kB+0.11%49.38 kB49.44 kB

Generated by 🚫 dangerJS against b42f3b2

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only drawback I can think of right now is that they won't be available in performance.getEntries() and PerformanceObserver, but that doesn't really make any sense for DEV envs.

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

It is technically feasible, I am just not sure why would someone do it via User Timings in DEV.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

I am not sure, but it looks like so. Having an Observer doesn't imply clearing buffered entries, so I guess we need to do it manually.

I think we should do it after every .mark() or .measure() calls, unfortunately.

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 0d9a0b5 to 41bc2deCompareOctober 13, 2025 17:27
@eps1lon

Copy link
Copy Markdown
Collaborator

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Though I don't see how the linked spec text confirms that.

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Sorry, summary was not up to date, actually PerformanceObserver should not be affected at all.

Though I don't see how the linked spec text confirms that.

The value is pushed to the observed entries list as part of the measure() call. Then, the PerformanceObserver task is scheduled, but it has a lower priority. Even if the .clearMeasures() will end up executing first, it should not clear the value from the internal PerformanceObserver's buffer.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 41bc2de to 11a58a3CompareOctober 13, 2025 21:26
@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 11a58a3 to b42f3b2CompareOctober 13, 2025 21:34
@hoxyq
hoxyq merged commit b9ec735 into react:mainOct 13, 2025
240 of 241 checks passed
@hoxyq
hoxyq deleted the perf-tracks/clear-expensive-measures branch October 13, 2025 21:42
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
meta-codesyncBot pushed a commit to react/react-native that referenced this pull request Oct 21, 2025
)
Summary:
Pull Request resolved: #54214
# Changelog: [Internal]
React started using `clearMeasures` in react/react#34803. It only does it if `performance.measure()` is defined. This should be enough for a feature check of User Timings API presence, but out stub doesn't follow the same spec.
Adding `clearMarks()` and `clearMeasures()` stubs to the object.
Reviewed By: rubennorte
Differential Revision: D85082720
fbshipit-source-id: 3b117a6545e131cdbb2d5efb73d500a928469864
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Massive memory allocations using React dev build under frequent updates (prod build unaffected)

3 participants

@hoxyq@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); [Perf Tracks]: Clear potentially large measures by hoxyq · Pull Request #34803 · react/react · GitHub
Skip to content

[Perf Tracks]: Clear potentially large measures - #34803

Merged
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures
Oct 13, 2025
Merged

[Perf Tracks]: Clear potentially large measures#34803
hoxyq merged 1 commit into
react:mainfrom
hoxyq:perf-tracks/clear-expensive-measures

Conversation

@hoxyq

@hoxyqhoxyq commented Oct 10, 2025

Copy link
Copy Markdown
Collaborator

Fixes#34770.

We need to clear measures at some point, otherwise all these copies of props that we end up recording will allocate too much memory in Chromium. This adds performance.clearMeasures(...) calls to such cases in DEV.

Validated that entries are still shown on Performance panel timeline.

};

const resuableChangedPropsEntry = ['Changed Props', ''];
const reusableChangedPropsEntry = ['Changed Props', ''];

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

drive-by typo fix

@react-sizebot

react-sizebot commented Oct 10, 2025

Copy link
Copy Markdown

Comparing: 47905a7...b42f3b2

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.38 kB=117.09 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.25 kB=121.13 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.67 kB=119.48 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.41%171.73 kB172.43 kB+0.31%29.92 kB30.02 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.41%171.75 kB172.45 kB+0.31%29.94 kB30.04 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.40%172.63 kB173.33 kB+0.32%30.09 kB30.18 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.32 kB177.02 kB+0.32%30.97 kB31.07 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.40%176.37 kB177.07 kB+0.31%31.00 kB31.09 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%176.92 kB177.61 kB+0.30%31.41 kB31.50 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.39%177.25 kB177.95 kB+0.29%31.14 kB31.23 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.39%177.82 kB178.51 kB+0.30%31.54 kB31.64 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.28 kB178.98 kB+0.28%31.42 kB31.50 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%178.33 kB179.03 kB+0.27%31.44 kB31.53 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.39%179.22 kB179.91 kB+0.30%31.58 kB31.67 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%180.12 kB180.82 kB+0.29%31.90 kB31.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.39%180.15 kB180.84 kB+0.29%31.92 kB32.01 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.86 kB181.56 kB+0.29%31.90 kB31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.39%180.91 kB181.61 kB+0.29%31.92 kB32.02 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.39%181.03 kB181.72 kB+0.29%32.04 kB32.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.38%181.05 kB181.75 kB+0.30%32.05 kB32.15 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%181.38 kB182.08 kB+0.29%32.06 kB32.15 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.48 kB182.18 kB+0.31%32.06 kB32.16 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%181.53 kB182.23 kB+0.31%32.09 kB32.19 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.38%181.79 kB182.49 kB+0.29%32.07 kB32.16 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.38%182.25 kB182.95 kB+0.30%32.20 kB32.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.38%182.41 kB183.11 kB+0.30%32.23 kB32.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.06 kB183.76 kB+0.30%32.11 kB32.20 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.38%183.93 kB184.62 kB+0.29%32.25 kB32.34 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%184.76 kB185.46 kB+0.30%32.37 kB32.47 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.38%185.63 kB186.33 kB+0.29%32.52 kB32.61 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%186.17 kB186.87 kB+0.30%32.63 kB32.72 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%186.19 kB186.89 kB+0.29%32.64 kB32.74 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.37%187.04 kB187.74 kB+0.30%32.77 kB32.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.37%187.06 kB187.76 kB+0.29%32.78 kB32.88 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.30 kB222.83 kB+0.11%49.15 kB49.20 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%222.32 kB222.85 kB+0.12%49.17 kB49.23 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.24%223.46 kB223.99 kB+0.11%49.38 kB49.44 kB

Generated by 🚫 dangerJS against b42f3b2

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only drawback I can think of right now is that they won't be available in performance.getEntries() and PerformanceObserver, but that doesn't really make any sense for DEV envs.

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

It is technically feasible, I am just not sure why would someone do it via User Timings in DEV.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

I am not sure, but it looks like so. Having an Observer doesn't imply clearing buffered entries, so I guess we need to do it manually.

I think we should do it after every .mark() or .measure() calls, unfortunately.

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 0d9a0b5 to 41bc2deCompareOctober 13, 2025 17:27
@eps1lon

Copy link
Copy Markdown
Collaborator

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Though I don't see how the linked spec text confirms that.

@hoxyq

Copy link
Copy Markdown
CollaboratorAuthor

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Sorry, summary was not up to date, actually PerformanceObserver should not be affected at all.

Though I don't see how the linked spec text confirms that.

The value is pushed to the observed entries list as part of the measure() call. Then, the PerformanceObserver task is scheduled, but it has a lower priority. Even if the .clearMeasures() will end up executing first, it should not clear the value from the internal PerformanceObserver's buffer.

@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 41bc2de to 11a58a3CompareOctober 13, 2025 21:26
@hoxyq
hoxyqforce-pushed the perf-tracks/clear-expensive-measures branch from 11a58a3 to b42f3b2CompareOctober 13, 2025 21:34
@hoxyq
hoxyq merged commit b9ec735 into react:mainOct 13, 2025
240 of 241 checks passed
@hoxyq
hoxyq deleted the perf-tracks/clear-expensive-measures branch October 13, 2025 21:42
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit that referenced this pull request Oct 13, 2025
Fixes#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Oct 18, 2025
Fixesreact#34770.
We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.
Validated that entries are still shown on Performance panel timeline.
DiffTrain build for [b9ec735](react@b9ec735)
meta-codesyncBot pushed a commit to react/react-native that referenced this pull request Oct 21, 2025
)
Summary:
Pull Request resolved: #54214
# Changelog: [Internal]
React started using `clearMeasures` in react/react#34803. It only does it if `performance.measure()` is defined. This should be enough for a feature check of User Timings API presence, but out stub doesn't follow the same spec.
Adding `clearMarks()` and `clearMeasures()` stubs to the object.
Reviewed By: rubennorte
Differential Revision: D85082720
fbshipit-source-id: 3b117a6545e131cdbb2d5efb73d500a928469864
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Massive memory allocations using React dev build under frequent updates (prod build unaffected)

3 participants

@hoxyq@react-sizebot@eps1lon