feat(studio): enable timeline virtualization by default (#2926)

* feat(studio): enable timeline virtualization by default

* fix(ci): measure timeline performance in production React
This commit is contained in:
Miguel Ángel
2026-07-31 19:43:47 +02:00
committed by GitHub
parent 723d3381c4
commit c6925e471a
13 changed files with 202 additions and 68 deletions
@@ -23,6 +23,7 @@ describe("timeline viewport budgets", () => {
constrainedLongTaskLimitMs: 300,
posterCoverageRatio: 0.9,
supportedFixtureFallbackRatio: 0.02,
scrollSamplesPerRun: 21,
warmupRuns: 3,
measuredRuns: 5,
requiredPassingRuns: 4,
@@ -51,6 +52,7 @@ describe("timeline viewport budgets", () => {
[{ requiredPassingRuns: 0 }, "requiredPassingRuns"],
[{ measuredRuns: 1.5, requiredPassingRuns: 1 }, "measuredRuns"],
[{ measuredRuns: 4, requiredPassingRuns: 5 }, "requiredPassingRuns"],
[{ scrollSamplesPerRun: 19 }, "scrollSamplesPerRun"],
[{ posterCoverageRatio: 1.1 }, "posterCoverageRatio"],
] as const)("rejects an invalid override %#", (overrides, message) => {
expect(() => resolveTimelineViewportBudgets(overrides)).toThrow(message);
@@ -40,6 +40,7 @@ export interface TimelineViewportBudgets {
richPreviewP95Ms: number;
constrainedRichPreviewP95Ms: number;
supportedFixtureFallbackRatio: number;
scrollSamplesPerRun: number;
warmupRuns: number;
measuredRuns: number;
requiredPassingRuns: number;
@@ -95,6 +96,7 @@ export const TIMELINE_VIEWPORT_BUDGETS: Readonly<TimelineViewportBudgets> = Obje
richPreviewP95Ms: 750,
constrainedRichPreviewP95Ms: 1_200,
supportedFixtureFallbackRatio: 0.02,
scrollSamplesPerRun: 21,
warmupRuns: 3,
measuredRuns: 5,
requiredPassingRuns: 4,
@@ -113,11 +115,21 @@ export function resolveTimelineViewportBudgets(
assertValidBudget(name as keyof TimelineViewportBudgets, value);
}
const resolved = { ...TIMELINE_VIEWPORT_BUDGETS, ...overrides };
for (const name of ["warmupRuns", "measuredRuns", "requiredPassingRuns"] as const) {
for (const name of [
"scrollSamplesPerRun",
"warmupRuns",
"measuredRuns",
"requiredPassingRuns",
] as const) {
if (!Number.isInteger(resolved[name])) {
throw new RangeError(`Timeline viewport budget ${name} must be an integer`);
}
}
if (resolved.scrollSamplesPerRun < 20) {
throw new RangeError(
"Timeline viewport budget scrollSamplesPerRun must be at least 20 for p95",
);
}
if (resolved.measuredRuns === 0 || resolved.requiredPassingRuns === 0) {
throw new RangeError(
"Timeline viewport budget measuredRuns and requiredPassingRuns must be greater than zero",