Benchmarks
Read reproducible Master CSS benchmarks for the runtime/CSSOM tradeoff: small runtime, fewer CSS rules, browser cost, and lifecycle behavior.
Overview
Benchmarks make Master CSS output, build, delivery, browser, and interaction costs inspectable. They are scoped evidence, not universal guarantees for every application.
This page collects the public benchmark snapshots used to explain Master CSS performance tradeoffs. Each result stays tied to the fixture, command, package versions, browser, machine, sample count, and limits that produced it.
Core hypothesis
The central performance question is not whether a runtime is faster than no runtime in isolation. It is whether small Runtime plus very few CSS rules can produce lower whole-browser cost than zero Runtime plus many CSS rules over the page lifecycle.
For Master CSS, runtime and progressive rendering trade a small amount of JavaScript work for lower delivered CSS, smaller CSSOM/rule volume, and fewer rules for the browser to consider during style recalculation. Tailwind CSS is useful here as a zero-runtime static CSS control: it does not provide a runtime-equivalent implementation, but it does represent the large static CSS side of the tradeoff.
The current evidence should be read as directional. It can support the hypothesis in measured fixtures when runtime/progressive modes reduce CSSOM/rule volume and style recalculation enough to offset runtime bootstrap, observe, and mutation work. It does not establish that every application will be faster.
Selector matching is not directly measured as a stable Chromium metric in these suites. It is inferred from delivered selectors, CSSOM rule count, runtime-generated rule count, and trace-derived style recalculation.
How to read these results
Benchmarks are useful when they answer a narrow question. This page builds the runtime/CSSOM hypothesis in a validation ladder:
- Static CSS output and structure show how many bytes, selectors, declarations, and rules each static setup delivers.
- Browser CSS cost calibrates how Chromium responds when CSS rule volume grows while DOM is fixed.
- Delivery modes show what Master static, runtime, progressive, and Tailwind static send and do on initial load.
- Interaction cost measures post-load DOM and class changes, including runtime rule work.
- Browser lifecycle evidence combines long-session browser work, CSSOM/rule volume, and runtime instrumentation.
Read each chart as evidence for the measured fixture and command, then compare it with the complete table and committed snapshot before applying the result to another app.
| Question | Primary evidence |
|---|---|
| How much CSS does the documentation site transfer? | Page CSS size snapshot |
| How large is generated static CSS? | Static CSS output and CSS structure snapshots |
| Where does Master CSS build time go? | Build path diagnostics |
| What does CSS rule volume cost in Chromium? | Browser CSS cost calibration |
| What does each delivery mode send and do on first load? | Master CSS delivery modes |
| What happens after load when classes and DOM change? | Interaction cost |
| Does runtime work change long-session browser cost? | Browser lifecycle evidence |
Tailwind CSS is not a runtime-equivalent comparison. In runtime-oriented suites, it is the static browser-control baseline for the zero-runtime, larger-static-CSS side of the hypothesis.
Lower numbers are not automatically better in every context. A smaller CSS artifact can shift work into runtime, a faster cold command can hide less useful output, and a local Chromium trace does not replace real production telemetry.
Before publishing or acting on a number, the fixture must first pass correctness checks: rendered output should match the intended UI, computed-style assertions should pass, generated output should be attributable to the fixture, and missing-rule checks should fail loudly.
No benchmark result is permission to change CSS output, cascade order, hydration behavior, runtime behavior, extraction behavior, or public APIs. If a result exposes a real hot path, the fix still needs the owning package tests and compatibility review.
Current results
Page CSS size
Question answered: how much inline and external CSS do popular documentation pages transfer in the initial HTML response?
This snapshot counts inline style tags and external stylesheets discovered from each page's initial HTML. Master CSS stays near 6 kB brotli on this documentation site because progressive rendering emits the page rules first, then lets runtime rendering handle later dynamic classes.
Limits: this is a page transfer measurement, not a browser timing metric. Browser cache state, CDN behavior, JavaScript-loaded styles, fonts, images, and application runtime work are outside the snapshot.
Static CSS output, structure, and production build
Question answered: how do equivalent static Master CSS and Tailwind CSS v4 fixtures compare for generated CSS bytes, CSS AST structure, and full production command timing?
The curated snapshot combines css-output-size, build-performance, and css-structure results. The headline charts use the docs fixture and CLI variants so the first view stays focused on static artifact output.
| Metric | Value | Detail |
|---|---|---|
| Fixtures | 4 | |
| CSS output | 4/4 | fixtures where Master CSS is smaller than Tailwind CSS by brotli bytes in the CLI setup |
| Build command | 4/4 | fixtures where Tailwind CSS has the lower cold production command median in the CLI setup |
| Build samples | 3 | measured command rounds per variant |
| CSS structure | AST | rules, selectors, declarations, layers, at-rules, and selector scores are parsed from generated CSS |
Representative fixture
The docs fixture represents a dense article and documentation layout with navigation, code blocks, and tables.
docs fixture using the CLI setup.docs fixture using the CLI setup.docs fixture from a CSS AST parse.Complete data
The complete tables keep every measured fixture and both CLI/Vite setup variants.
| Fixture | Variant | Raw | Gzip | Brotli | Files |
|---|---|---|---|---|---|
| Minimal | Master CSS static CLI | 5.1 kB | 1.9 kB | 1.6 kB | 1 |
| Minimal | Master CSS static Vite | 5.1 kB | 1.9 kB | 1.6 kB | 1 |
| Minimal | Tailwind CSS CLI | 9.2 kB | 2.6 kB | 2.2 kB | 1 |
| Minimal | Tailwind CSS Vite | 7.7 kB | 2.4 kB | 2.1 kB | 1 |
| Docs | Master CSS static CLI | 5.8 kB | 2.2 kB | 1.8 kB | 1 |
| Docs | Master CSS static Vite | 5.8 kB | 2.2 kB | 1.8 kB | 1 |
| Docs | Tailwind CSS CLI | 12.0 kB | 3.0 kB | 2.6 kB | 1 |
| Docs | Tailwind CSS Vite | 10.0 kB | 2.8 kB | 2.4 kB | 1 |
| Dashboard | Master CSS static CLI | 6.0 kB | 2.1 kB | 1.8 kB | 1 |
| Dashboard | Master CSS static Vite | 6.0 kB | 2.1 kB | 1.8 kB | 1 |
| Dashboard | Tailwind CSS CLI | 10.5 kB | 2.8 kB | 2.4 kB | 1 |
| Dashboard | Tailwind CSS Vite | 8.7 kB | 2.6 kB | 2.3 kB | 1 |
| Stress CSS | Master CSS static CLI | 11.7 kB | 3.1 kB | 2.0 kB | 1 |
| Stress CSS | Master CSS static Vite | 11.7 kB | 3.1 kB | 2.1 kB | 1 |
| Stress CSS | Tailwind CSS CLI | 17.1 kB | 3.7 kB | 2.5 kB | 1 |
| Stress CSS | Tailwind CSS Vite | 12.7 kB | 3.4 kB | 2.3 kB | 1 |
| Fixture | Variant | Cold median | Repeat median | Samples |
|---|---|---|---|---|
| Minimal | Master CSS static CLI | 190 ms | 186 ms | 3 |
| Minimal | Master CSS static Vite | 263 ms | 260 ms | 3 |
| Minimal | Tailwind CSS CLI | 95.2 ms | 98.0 ms | 3 |
| Minimal | Tailwind CSS Vite | 160 ms | 160 ms | 3 |
| Docs | Master CSS static CLI | 196 ms | 188 ms | 3 |
| Docs | Master CSS static Vite | 284 ms | 267 ms | 3 |
| Docs | Tailwind CSS CLI | 99.5 ms | 95.7 ms | 3 |
| Docs | Tailwind CSS Vite | 164 ms | 162 ms | 3 |
| Dashboard | Master CSS static CLI | 200 ms | 189 ms | 3 |
| Dashboard | Master CSS static Vite | 274 ms | 268 ms | 3 |
| Dashboard | Tailwind CSS CLI | 99.7 ms | 95.4 ms | 3 |
| Dashboard | Tailwind CSS Vite | 165 ms | 170 ms | 3 |
| Stress CSS | Master CSS static CLI | 218 ms | 207 ms | 3 |
| Stress CSS | Master CSS static Vite | 282 ms | 279 ms | 3 |
| Stress CSS | Tailwind CSS CLI | 101 ms | 103 ms | 3 |
| Stress CSS | Tailwind CSS Vite | 174 ms | 168 ms | 3 |
| Fixture | Variant | Rules | Selectors | Declarations | Custom properties | At-rules | Layer blocks | Unlayered rules | Combinators | Max specificity | Max complexity |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Minimal | Master CSS static CLI | 84 | 135 | 124 | 11 | 5 | 3 | 1 | 0 | 11 | 2 |
| Minimal | Master CSS static Vite | 84 | 135 | 124 | 11 | 5 | 3 | 1 | 0 | 11 | 2 |
| Minimal | Tailwind CSS CLI | 86 | 131 | 174 | 41 | 13 | 4 | 1 | 3 | 10 | 9 |
| Minimal | Tailwind CSS Vite | 99 | 132 | 199 | 41 | 12 | 4 | 1 | 3 | 10 | 9 |
| Docs | Master CSS static CLI | 98 | 149 | 142 | 14 | 6 | 3 | 1 | 0 | 11 | 2 |
| Docs | Master CSS static Vite | 98 | 149 | 142 | 14 | 6 | 3 | 1 | 0 | 11 | 2 |
| Docs | Tailwind CSS CLI | 102 | 147 | 226 | 56 | 25 | 4 | 1 | 3 | 10 | 9 |
| Docs | Tailwind CSS Vite | 116 | 149 | 251 | 56 | 23 | 4 | 1 | 3 | 10 | 9 |
| Dashboard | Master CSS static CLI | 103 | 154 | 147 | 15 | 5 | 3 | 1 | 0 | 20 | 2 |
| Dashboard | Master CSS static Vite | 103 | 154 | 147 | 15 | 5 | 3 | 1 | 0 | 20 | 2 |
| Dashboard | Tailwind CSS CLI | 106 | 151 | 195 | 42 | 13 | 4 | 1 | 3 | 10 | 9 |
| Dashboard | Tailwind CSS Vite | 118 | 151 | 220 | 42 | 12 | 4 | 1 | 3 | 20 | 9 |
| Stress CSS | Master CSS static CLI | 316 | 367 | 364 | 20 | 5 | 3 | 1 | 0 | 11 | 2 |
| Stress CSS | Master CSS static Vite | 316 | 367 | 364 | 20 | 5 | 3 | 1 | 0 | 11 | 2 |
| Stress CSS | Tailwind CSS CLI | 300 | 345 | 369 | 28 | 11 | 4 | 1 | 3 | 10 | 9 |
| Stress CSS | Tailwind CSS Vite | 312 | 346 | 393 | 28 | 10 | 4 | 1 | 3 | 10 | 9 |
Interpretation: CSS structure metrics explain why byte counts differ before browser-cost claims are introduced. Tailwind CSS and Master CSS fixtures target equivalent rendered UI intent, not identical class strings.
Limits: these numbers do not measure browser parsing, style recalculation, layout, paint, interaction cost, watch mode, or HMR.
Build path diagnostics
Question answered: which Master CSS startup, integration, extraction, and compiler substeps explain full command cost?
This snapshot combines startup-diagnostics, build-diagnostics, compiler-diagnostics, and extraction-diagnostics. It explains the Master CSS build path; it is not a cross-framework production benchmark.
| Metric | Value | Detail |
|---|---|---|
| Fixtures | 4 | minimal, docs, dashboard, and stress-css diagnostic fixtures |
| Source reports | 4 | startup, build, compiler, and extraction diagnostics |
| Environment | Apple M3 Max, v24.15.0 | darwin 25.5.0 arm64, 16 CPUs |
| CLI command vs extraction | 198.3 ms / 16 ms | `docs` fixture full command envelope versus CLI CSS extraction |
| Vite overhead vs scanner init | 145.8 ms / 5.33 ms | `docs` fixture Master Vite command overhead versus scanner init |
| Compiler and extraction | 13.5 ms / 12.9 ms | `docs` fixture diagnostic compiler total and diagnostic extraction total |
CLI path
Docs fixture mediansVite path
Docs fixture mediansCompiler and extraction
Docs fixture mediansdocs fixture. Startup probes are directional and are not additive flamegraphs.| Fixture | CLI command | CLI extraction | Vite overhead | Vite import | Vite scanner | Compiler total | Extraction total | Final CSS |
|---|---|---|---|---|---|---|---|---|
| Minimal | 190.3 ms | 15 ms | 145.8 ms | 72.5 ms | 5.69 ms | 11.8 ms | 12 ms | 5.1 kB |
| Docs | 198.3 ms | 16 ms | 145.8 ms | 76 ms | 5.33 ms | 13.5 ms | 12.9 ms | 5.8 kB |
| Dashboard | 193.1 ms | 17.3 ms | 150.6 ms | 71.7 ms | 5.11 ms | 13.5 ms | 13 ms | 6 kB |
| Stress CSS | 215.5 ms | 21.2 ms | 163.7 ms | 79.5 ms | 6.11 ms | 17.4 ms | 18.3 ms | 11.7 kB |
Interpretation: ordinary fixture command cost is currently dominated by cold process/module startup and integration startup overhead, while normal-fixture compiler and extraction medians are smaller.
Limits: diagnostic probes explain envelopes and substeps. They do not justify changing generated CSS, cascade order, extraction correctness, runtime behavior, or public APIs.
Browser CSS cost
Question answered: how does CSS rule volume affect Chromium style recalculation, layout, and paint when DOM is fixed, and how does DOM scaling behave when CSS is fixed?
This suite uses local fixture pages, deterministic external CSS, Playwright, and Chromium tracing. It is a browser-only calibration suite, not a Master CSS versus Tailwind CSS comparison.
| Metric | Value | Detail |
|---|---|---|
| CSS levels | 4 | fixed visible DOM while deterministic external CSS grows |
| Largest CSS | 45.6 kB | 90,042 declarations in the warm-cache xlarge-css variant |
| DOM controls | 3 | fixed CSS while repeated DOM items grow |
| Largest DOM | 21,012 | measured DOM nodes in the warm-cache large-dom variant |
| Browser | Chromium 149.0.7827.55 | headless browser used for the committed trace snapshot |
| Trace samples | 3 | measured browser rounds per warm-cache variant |
Style recalculation
Warm-cache medianLayout
Warm-cache medianPaint
Warm-cache medianStyle recalculation
Warm-cache medianLayout
Warm-cache medianPaint
Warm-cache median| Axis | Variant | Cache | CSS brotli | Rules | Declarations | DOM nodes | Style recalc | Layout | Paint | Samples |
|---|---|---|---|---|---|---|---|---|---|---|
| CSS volume | Small CSS | Cold cache | 1.6 kB | 263 | 792 | 205 | 0.6 ms | 4.5 ms | 1.2 ms | 3 |
| CSS volume | Small CSS | Warm cache | 1.6 kB | 263 | 792 | 205 | 0.5 ms | 1 ms | 0.6 ms | 3 |
| CSS volume | Medium CSS | Cold cache | 5.4 kB | 2,513 | 7,542 | 205 | 1 ms | 4.3 ms | 1.2 ms | 3 |
| CSS volume | Medium CSS | Warm cache | 5.4 kB | 2,513 | 7,542 | 205 | 0.5 ms | 1.1 ms | 0.8 ms | 3 |
| CSS volume | Large CSS | Cold cache | 16.4 kB | 10,013 | 30,042 | 205 | 2 ms | 4.1 ms | 1.2 ms | 3 |
| CSS volume | Large CSS | Warm cache | 16.4 kB | 10,013 | 30,042 | 205 | 0.5 ms | 1 ms | 0.6 ms | 3 |
| CSS volume | XLarge CSS | Cold cache | 45.6 kB | 30,013 | 90,042 | 205 | 4.1 ms | 4.2 ms | 1.2 ms | 3 |
| CSS volume | XLarge CSS | Warm cache | 45.6 kB | 30,013 | 90,042 | 205 | 0.5 ms | 1 ms | 0.6 ms | 3 |
| DOM scaling | Small DOM | Cold cache | 0.5 kB | 15 | 50 | 712 | 1.2 ms | 5.4 ms | 2 ms | 3 |
| DOM scaling | Small DOM | Warm cache | 0.5 kB | 15 | 50 | 712 | 1.1 ms | 2.2 ms | 1.8 ms | 3 |
| DOM scaling | Medium DOM | Cold cache | 0.5 kB | 15 | 50 | 7,012 | 8.2 ms | 24.9 ms | 5.9 ms | 3 |
| DOM scaling | Medium DOM | Warm cache | 0.5 kB | 15 | 50 | 7,012 | 8.3 ms | 20.4 ms | 5.8 ms | 3 |
| DOM scaling | Large DOM | Cold cache | 0.5 kB | 15 | 50 | 21,012 | 24.2 ms | 70.9 ms | 14.9 ms | 3 |
| DOM scaling | Large DOM | Warm cache | 0.5 kB | 15 | 50 | 21,012 | 23.8 ms | 64.6 ms | 14.5 ms | 3 |
Interpretation: the CSS volume curve is the main input for judging how much upfront CSS a delivery mode asks Chromium to load before interaction. The DOM scaling control helps separate DOM, style, and layout scaling from CSS payload size.
Limits: these numbers do not measure runtime rule generation, real application JavaScript, Firefox, WebKit, CDN behavior, or public real-world page variance. Chromium trace event names can change across browser versions.
Master CSS delivery modes
Question answered: what initial payload, local Chromium load cost, runtime bootstrap cost, manifest loading, and progressive adoption behavior does each delivery mode produce?
The suite compares Master CSS static, runtime, progressive, and Tailwind CSS static browser-control variants across the static fixture set.
| Metric | Value | Detail |
|---|---|---|
| Fixtures | 4 | static fixture set measured across every delivery mode |
| Modes | 4 | Master static, runtime, progressive, and Tailwind static |
| Browser | Chromium 149.0.7827.55 | headless browser used for local trace measurements |
| Trace samples | 3 | measured browser rounds per variant |
| Progressive adoption | 4/4 | fixtures where progressive runtime adopted server-rendered CSS |
Representative fixture
The primary charts show the docs fixture.
docs fixture.Navigation to ready
MedianStyle recalculation
MedianLayout
MedianPaint
Mediandocs fixture.Runtime bootstrap
MedianRuntime observe
Median| Fixture | Mode | Payload | HTML | External CSS | Inline CSS | Runtime JS | Manifest JSON | Hydration manifest | Rules | Declarations | Navigation ready | Style recalc | Layout | Paint | Runtime bootstrap | Runtime observe | Progressive adopted |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Minimal | Master CSS static | 2.3 kB | 0.7 kB | 1.6 kB | 0 kB | 0 kB | 0 kB | 0 kB | 84 | 124 | 21.9 ms | 0.6 ms | 5.9 ms | 0.8 ms | 0 ms | 0 ms | 0 |
| Minimal | Master CSS runtime | 33.6 kB | 1.1 kB | 0 kB | 0 kB | 22.8 kB | 9.8 kB | 0 kB | 0 | 0 | 39.1 ms | 0.7 ms | 3.7 ms | 0.5 ms | 14 ms | 5.6 ms | 0 |
| Minimal | Master CSS progressive | 36.9 kB | 2.6 kB | 0 kB | 0.6 kB | 22.8 kB | 9.8 kB | 1.1 kB | 46 | 56 | 31.4 ms | 0.5 ms | 3.6 ms | 0.6 ms | 15.3 ms | 1.4 ms | 1 |
| Minimal | Tailwind CSS static | 2.9 kB | 0.7 kB | 2.2 kB | 0 kB | 0 kB | 0 kB | 0 kB | 86 | 174 | 19.5 ms | 0.9 ms | 6 ms | 0.7 ms | 0 ms | 0 ms | 0 |
| Docs | Master CSS static | 3 kB | 1.2 kB | 1.8 kB | 0 kB | 0 kB | 0 kB | 0 kB | 98 | 142 | 22.8 ms | 1.1 ms | 8.7 ms | 1.5 ms | 0 ms | 0 ms | 0 |
| Docs | Master CSS runtime | 34.2 kB | 1.6 kB | 0 kB | 0 kB | 22.8 kB | 9.8 kB | 0 kB | 0 | 0 | 38.7 ms | 0.9 ms | 5.1 ms | 1 ms | 13.9 ms | 6.5 ms | 0 |
| Docs | Master CSS progressive | 38.6 kB | 3.6 kB | 0 kB | 0.9 kB | 22.8 kB | 9.8 kB | 1.6 kB | 60 | 74 | 37.5 ms | 0.7 ms | 4.5 ms | 1 ms | 17.7 ms | 2.6 ms | 1 |
| Docs | Tailwind CSS static | 3.7 kB | 1.1 kB | 2.6 kB | 0 kB | 0 kB | 0 kB | 0 kB | 102 | 226 | 22.9 ms | 1.1 ms | 8 ms | 1.3 ms | 0 ms | 0 ms | 0 |
| Dashboard | Master CSS static | 2.9 kB | 1.1 kB | 1.8 kB | 0 kB | 0 kB | 0 kB | 0 kB | 103 | 147 | 21.8 ms | 9.3 ms | 2.8 ms | 1.7 ms | 0 ms | 0 ms | 0 |
| Dashboard | Master CSS runtime | 34.1 kB | 1.6 kB | 0 kB | 0 kB | 22.8 kB | 9.8 kB | 0 kB | 0 | 0 | 39.1 ms | 7.3 ms | 2.5 ms | 1 ms | 13.2 ms | 6.2 ms | 0 |
| Dashboard | Master CSS progressive | 38.4 kB | 3.5 kB | 0 kB | 0.8 kB | 22.8 kB | 9.8 kB | 1.5 kB | 66 | 80 | 35.2 ms | 6.7 ms | 2.4 ms | 1.1 ms | 16.9 ms | 2.9 ms | 1 |
| Dashboard | Tailwind CSS static | 3.5 kB | 1.1 kB | 2.4 kB | 0 kB | 0 kB | 0 kB | 0 kB | 106 | 195 | 23.3 ms | 10.2 ms | 2.7 ms | 1.4 ms | 0 ms | 0 ms | 0 |
| Stress CSS | Master CSS static | 3.5 kB | 1.5 kB | 2 kB | 0 kB | 0 kB | 0 kB | 0 kB | 316 | 364 | 21.8 ms | 1.7 ms | 6.9 ms | 1.3 ms | 0 ms | 0 ms | 0 |
| Stress CSS | Master CSS runtime | 34.4 kB | 1.9 kB | 0 kB | 0 kB | 22.8 kB | 9.8 kB | 0 kB | 0 | 0 | 42.8 ms | 1.6 ms | 4 ms | 0.9 ms | 17.6 ms | 10.3 ms | 0 |
| Stress CSS | Master CSS progressive | 41.3 kB | 5.3 kB | 0 kB | 1.1 kB | 22.8 kB | 9.8 kB | 2.4 kB | 279 | 297 | 34.5 ms | 1.4 ms | 4 ms | 0.9 ms | 18.7 ms | 2 ms | 1 |
| Stress CSS | Tailwind CSS static | 4 kB | 1.5 kB | 2.5 kB | 0 kB | 0 kB | 0 kB | 0 kB | 300 | 369 | 22.5 ms | 2.5 ms | 7.2 ms | 1.2 ms | 0 ms | 0 ms | 0 |
Interpretation: progressive begins with server/build-time CSS in the HTML and adds a runtime handoff. Runtime mode starts smaller on CSS output but pays browser runtime and manifest costs when classes are discovered in the DOM.
Limits: these numbers measure initial local fixture loads only. Post-load mutation belongs to the interaction suite. Master static and Tailwind static use CLI-generated CSS from equivalent fixture intent, not identical class strings.
Interaction cost
Question answered: how expensive are post-load class toggles, first-time runtime rule generation, DOM append/remove, theme switches, viewport resize, and cleanup cycles?
The suite measures local Chromium interactions across dynamic, dashboard, and stress-dom fixtures. Tailwind CSS static variants act as browser controls for style/layout/paint work; they do not have a client-side runtime rule-generation equivalent.
| Metric | Value | Detail |
|---|---|---|
| Fixtures | 3 | dynamic, dashboard, and stress-dom interaction fixtures |
| Variants | 54 | supported fixture, mode, and scenario combinations |
| Browser | Chromium 149.0.7827.55 | headless browser used for local trace measurements |
| Samples | 1 | measured rounds per default interaction variant |
| Progressive adoption | 3/3 | fixtures with at least one adopted progressive interaction variant |
Existing class toggle
Mutation-ready medianNew class toggle
Mutation-ready medianDOM append/remove
Mutation-ready mediandynamic fixture scenarios.Existing class runtime update
Runtime mutation medianNew class runtime update
Runtime mutation medianCleanup-cycle runtime update
Runtime mutation mediandynamic fixture scenarios.| Fixture | Scenario | Mode | Ready | Runtime update | Rule delta | Style byte delta | Style recalc | Layout | Paint | DOM nodes | Affected | Computed style | Cleanup | Progressive adopted | Samples |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Dynamic | Existing class toggle | Master CSS static | 27.4 ms | 0 ms | 0 | 0 kB | 0.3 ms | 0 ms | 0.4 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Existing class toggle | Master CSS runtime | 23.9 ms | 0 ms | 0 | 0 kB | 0.3 ms | 0 ms | 0.4 ms | 309 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Existing class toggle | Master CSS progressive | 22.8 ms | 0 ms | 0 | 0 kB | 0.3 ms | 0 ms | 0.4 ms | 310 | 64 | 1 | 1 | 1 | 1 |
| Dynamic | Existing class toggle | Tailwind CSS static | 29.4 ms | 0 ms | 0 | 0 kB | 0.5 ms | 0 ms | 0.5 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | New class toggle | Master CSS runtime | 24 ms | 0.1 ms | 1 | 0.1 kB | 1.3 ms | 0 ms | 1.3 ms | 309 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | New class toggle | Master CSS progressive | 23.9 ms | 0.8 ms | 1 | 0 kB | 0.8 ms | 0 ms | 0.6 ms | 310 | 64 | 1 | 1 | 1 | 1 |
| Dynamic | DOM append/remove | Master CSS static | 27.8 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 308 | 48 | 1 | 1 | 0 | 1 |
| Dynamic | DOM append/remove | Master CSS runtime | 22.2 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 309 | 48 | 1 | 1 | 0 | 1 |
| Dynamic | DOM append/remove | Master CSS progressive | 24.1 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 310 | 48 | 1 | 1 | 1 | 1 |
| Dynamic | DOM append/remove | Tailwind CSS static | 28.1 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 308 | 48 | 1 | 1 | 0 | 1 |
| Dynamic | Theme switch | Master CSS static | 28.5 ms | 0 ms | 0 | 0 kB | 0.3 ms | 0 ms | 0.4 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Theme switch | Master CSS runtime | 28 ms | 0.2 ms | 1 | 0.1 kB | 0.6 ms | 0 ms | 0.4 ms | 309 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Theme switch | Master CSS progressive | 21.2 ms | 0.5 ms | 1 | 0 kB | 0.5 ms | 0 ms | 0.5 ms | 310 | 64 | 1 | 1 | 1 | 1 |
| Dynamic | Theme switch | Tailwind CSS static | 29.3 ms | 0 ms | 0 | 0 kB | 0.4 ms | 0 ms | 0.4 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Viewport resize | Master CSS static | 58.5 ms | 0 ms | 0 | 0 kB | 0.5 ms | 0.8 ms | 1.3 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Viewport resize | Master CSS runtime | 59.6 ms | 0 ms | 0 | 0 kB | 0.2 ms | 0.8 ms | 0.9 ms | 309 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Viewport resize | Master CSS progressive | 57.7 ms | 0 ms | 0 | 0 kB | 0.2 ms | 0.9 ms | 0.9 ms | 310 | 64 | 1 | 1 | 1 | 1 |
| Dynamic | Viewport resize | Tailwind CSS static | 51.8 ms | 0 ms | 0 | 0 kB | 0.2 ms | 0.8 ms | 0.9 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Mutation cleanup cycle | Master CSS static | 161.1 ms | 0 ms | 0 | 0 kB | 1.1 ms | 1.4 ms | 3.4 ms | 308 | 192 | 1 | 1 | 0 | 1 |
| Dynamic | Mutation cleanup cycle | Master CSS runtime | 155.5 ms | 0.5 ms | 2 | 0.1 kB | 1.8 ms | 1.5 ms | 3.6 ms | 309 | 192 | 1 | 1 | 0 | 1 |
| Dynamic | Mutation cleanup cycle | Master CSS progressive | 160.5 ms | 1.1 ms | 2 | 0 kB | 1.8 ms | 1.6 ms | 3.9 ms | 310 | 192 | 1 | 1 | 1 | 1 |
| Dynamic | Mutation cleanup cycle | Tailwind CSS static | 167.3 ms | 0 ms | 0 | 0 kB | 1.4 ms | 1.5 ms | 4.1 ms | 308 | 192 | 1 | 1 | 0 | 1 |
| Dashboard | Existing class toggle | Master CSS static | 26.9 ms | 0 ms | 0 | 0 kB | 0.7 ms | 0 ms | 0.9 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Existing class toggle | Master CSS runtime | 32 ms | 0 ms | 0 | 0 kB | 0.7 ms | 0 ms | 0.8 ms | 981 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Existing class toggle | Master CSS progressive | 26.6 ms | 0 ms | 0 | 0 kB | 0.7 ms | 0 ms | 0.8 ms | 982 | 160 | 1 | 1 | 1 | 1 |
| Dashboard | Existing class toggle | Tailwind CSS static | 25.1 ms | 0 ms | 0 | 0 kB | 1 ms | 0 ms | 1 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | DOM append/remove | Master CSS static | 25.2 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 980 | 80 | 1 | 1 | 0 | 1 |
| Dashboard | DOM append/remove | Master CSS runtime | 30 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 981 | 80 | 1 | 1 | 0 | 1 |
| Dashboard | DOM append/remove | Master CSS progressive | 21.9 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 982 | 80 | 1 | 1 | 1 | 1 |
| Dashboard | DOM append/remove | Tailwind CSS static | 32.8 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0.4 ms | 980 | 80 | 1 | 1 | 0 | 1 |
| Dashboard | Theme switch | Master CSS static | 27.2 ms | 0 ms | 0 | 0 kB | 0.6 ms | 0 ms | 0.8 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Theme switch | Master CSS runtime | 25.8 ms | 0.1 ms | 1 | 0.1 kB | 1 ms | 0 ms | 0.8 ms | 981 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Theme switch | Master CSS progressive | 27.2 ms | 0.5 ms | 1 | 0 kB | 1 ms | 0 ms | 0.8 ms | 982 | 160 | 1 | 1 | 1 | 1 |
| Dashboard | Theme switch | Tailwind CSS static | 26.1 ms | 0 ms | 0 | 0 kB | 0.8 ms | 0 ms | 1 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Viewport resize | Master CSS static | 54.6 ms | 0 ms | 0 | 0 kB | 0.2 ms | 2.2 ms | 1.7 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Viewport resize | Master CSS runtime | 55.3 ms | 0 ms | 0 | 0 kB | 0.2 ms | 2.2 ms | 1.7 ms | 981 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Viewport resize | Master CSS progressive | 58.9 ms | 0 ms | 0 | 0 kB | 0.3 ms | 2.4 ms | 1.7 ms | 982 | 160 | 1 | 1 | 1 | 1 |
| Dashboard | Viewport resize | Tailwind CSS static | 56.1 ms | 0 ms | 0 | 0 kB | 0.3 ms | 2.2 ms | 2 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Stress DOM | Existing class toggle | Master CSS static | 26.9 ms | 0 ms | 0 | 0 kB | 2.4 ms | 0 ms | 1.2 ms | 3,620 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | Existing class toggle | Master CSS runtime | 29.2 ms | 0 ms | 0 | 0 kB | 2.2 ms | 0 ms | 1.2 ms | 3,621 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | Existing class toggle | Master CSS progressive | 23.4 ms | 0 ms | 0 | 0 kB | 2.3 ms | 0 ms | 1.1 ms | 3,622 | 600 | 1 | 1 | 1 | 1 |
| Stress DOM | Existing class toggle | Tailwind CSS static | 29.9 ms | 0 ms | 0 | 0 kB | 3.3 ms | 0 ms | 1.3 ms | 3,620 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | DOM append/remove | Master CSS static | 28.7 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 3,620 | 160 | 1 | 1 | 0 | 1 |
| Stress DOM | DOM append/remove | Master CSS runtime | 24.2 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 3,621 | 160 | 1 | 1 | 0 | 1 |
| Stress DOM | DOM append/remove | Master CSS progressive | 24.4 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 3,622 | 160 | 1 | 1 | 1 | 1 |
| Stress DOM | DOM append/remove | Tailwind CSS static | 31.8 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 3,620 | 160 | 1 | 1 | 0 | 1 |
| Stress DOM | Viewport resize | Master CSS static | 58.2 ms | 0 ms | 0 | 0 kB | 0.4 ms | 7.6 ms | 3.5 ms | 3,620 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | Viewport resize | Master CSS runtime | 58.6 ms | 0 ms | 0 | 0 kB | 0.4 ms | 7.5 ms | 3.4 ms | 3,621 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | Viewport resize | Master CSS progressive | 56 ms | 0 ms | 0 | 0 kB | 0.4 ms | 7.6 ms | 3.6 ms | 3,622 | 600 | 1 | 1 | 1 | 1 |
| Stress DOM | Viewport resize | Tailwind CSS static | 57.7 ms | 0 ms | 0 | 0 kB | 0.5 ms | 7.4 ms | 3.9 ms | 3,620 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | Mutation cleanup cycle | Master CSS static | 128.1 ms | 0 ms | 0 | 0 kB | 2 ms | 2.8 ms | 9 ms | 3,620 | 480 | 1 | 1 | 0 | 1 |
| Stress DOM | Mutation cleanup cycle | Master CSS runtime | 126.6 ms | 0.3 ms | 2 | 0.1 kB | 6.8 ms | 2.7 ms | 8.8 ms | 3,621 | 480 | 1 | 1 | 0 | 1 |
| Stress DOM | Mutation cleanup cycle | Master CSS progressive | 132.8 ms | 1 ms | 2 | 0 kB | 7 ms | 2.8 ms | 8.9 ms | 3,622 | 480 | 1 | 1 | 1 | 1 |
| Stress DOM | Mutation cleanup cycle | Tailwind CSS static | 133 ms | 0 ms | 0 | 0 kB | 2.8 ms | 3.1 ms | 10.7 ms | 3,620 | 480 | 1 | 1 | 0 | 1 |
Interpretation: runtime and progressive modes should be read in two layers: user-visible mutation readiness, then runtime stylesheet work. Existing-rule toggles, first-time class generation, DOM changes, and cleanup cycles answer different performance questions.
Limits: these numbers do not measure route transitions, HMR, dev workflow, CDN behavior, Firefox, WebKit, or public real-world application variance.
Browser lifecycle and INP-style interactions
Question answered: can small runtime/progressive work plus low CSSOM/rule volume lower whole-browser lifecycle cost compared with zero-runtime static CSS?
The suite is the closest current test of the core hypothesis. It keeps Tailwind CSS as the zero-runtime static browser-control setup and compares it with Master CSS static, runtime, and progressive setups across lifecycle scenarios. The latency value is an INP-style local fixture measurement, not real Web Vitals INP.
| Metric | Value | Detail |
|---|---|---|
| Snapshot variants | 64 | 7 scenarios across 4 modes |
| Evidence modes | 4/4 | segmented five-minute long-session reports |
| Browser | Chromium 149.0.7827.55 | headless browser used for local trace measurements |
| Long-session samples | 1 | measured five-minute rounds per mode in committed evidence |
| Computed style checks | 4/4 | five-minute evidence variants with computed-style-valid = 1 |
| Progressive adoption | 1/1 | Master progressive long-session evidence variant |
Style recalculation
Five-minute medianLayout
Five-minute medianPaint
Five-minute medianLong tasks
Five-minute medianCSSOM rules
Five-minute medianRuntime mutation work
Five-minute median| Mode | INP-style latency | Style recalc | Layout | Paint | Long tasks | CSSOM rules | Runtime rules | Runtime mutation | JS heap | Computed style | Progressive adopted | Samples |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Master CSS static | 300,058.8 ms | 7,770 ms | 1,513.8 ms | 6,508.5 ms | 0 | 2 | 0 | 0 ms | 1,750.1 kB | 1 | 0 | 1 |
| Master CSS runtime | 300,062.5 ms | 6,205.9 ms | 1,443.3 ms | 5,861 ms | 0 | 0 | 47 | 70.7 ms | 6,119.4 kB | 1 | 0 | 1 |
| Master CSS progressive | 300,058.3 ms | 5,353.3 ms | 1,363.8 ms | 5,231 ms | 0 | 0 | 47 | 78.7 ms | 5,944.2 kB | 1 | 1 | 1 |
| Tailwind CSS static | 300,062.2 ms | 9,107.8 ms | 1,495.1 ms | 5,761.9 ms | 0 | 22 | 0 | 0 ms | 1,798.1 kB | 1 | 0 | 1 |
Interpretation: current five-minute local Chromium evidence directionally supports the hypothesis for style recalculation: Master runtime and progressive show lower style recalculation medians than the Tailwind static browser control while carrying measured runtime mutation work. Layout, paint, long-task, and INP-style latency medians remain measured data, not wins, because they do not establish the same directional advantage.
Limits: selector matching time remains an inference from CSSOM/rule volume plus style recalculation unless Chromium exposes a stable trace metric for it. CSSOM memory and GC pressure are reported only when the collection method is stable enough to reproduce on the same browser version.
Methodology and limits
Fixture matrix
Fixture-based suites compare equivalent UI output, not identical class strings.
| Fixture | Purpose | Stress area |
|---|---|---|
minimal | Small useful page or landing section | Framework overhead, cold-start cost, and minimum payload |
docs | Dense article, navigation, code blocks, tables | Documentation layout, typography, nested content, and CSS output shape |
dashboard | Repeated cards, tables, filters, charts, states | Rule reuse, duplicated utilities, and large DOM |
dynamic | Insert, remove, and toggle classes during interaction | Runtime mutation, extraction limits, and recalculation cost |
stress-css | Controlled small, medium, and large CSS outputs | Browser style calculation as CSS volume grows |
stress-dom | Large DOM with fixed CSS | DOM/style/layout scaling isolated from CSS output size |
Each fixture should publish source markup, Master CSS setup, Tailwind CSS setup when relevant, generated outputs, and exact commands.
Metric families
| Area | Examples |
|---|---|
| Transfer | Raw, gzip, and brotli bytes for CSS, HTML, runtime JavaScript, manifest JSON, hydration manifest, and request count |
| CSS structure | Rule count, selector count, declaration count, cascade layers, at-rules, custom properties, and selector complexity |
| Build | Cold command, repeat command, startup probes, scanner time, extraction time, and compiler time |
| Browser load | Navigation-ready time, stylesheet parse/attach, style recalculation, layout, paint, long tasks, and cache mode |
| Runtime | Bootstrap, observe/hydrate, rule generation, CSSOM insertion/deletion, MutationObserver delivery, retained generated rules, and cleanup cycles |
| Interaction | Existing-class toggles, new-rule generation, DOM append/remove, theme switch, viewport/container resize, and INP-style local latency |
| Correctness | Output hash, screenshot smoke, computed-style assertions, missing-rule checks, generated file inventory, cleanup validity, and progressive adoption |
Browser timings should be measured with fixed viewport, device scale, browser version, warmup rounds, measured rounds, and separated cold/warm cache modes when cache state changes interpretation.
Delivery modes
| Mode | Benchmark focus |
|---|---|
| Runtime | Runtime bundle size, manifest delivery, initial DOM scan, CSSOM insertion/deletion, mutation handling, and repeated mutation cleanup |
| Static | Generated stylesheet size, source scanning, source include/exclude behavior, safelist/blocklist, warm rebuild, and mixed authored CSS |
| Progressive | Inline first-page CSS, hydration manifest size, runtime adoption success/fallback, and post-hydration dynamic classes |
Runtime and progressive rendering optimize what CSS is delivered up front. They do not make browser style calculation free: when an interaction creates many first-time utility rules, the browser still needs to account for those new stylesheet rules before it can paint the updated DOM.
Tailwind CSS comparisons
Tailwind CSS comparisons use pinned Tailwind CSS v4 tooling and official entrypoints for static output, production build, and static browser-control measurements.
Runtime-equivalent claims should be avoided because Tailwind CSS does not perform the same client-side class observation work as Master CSS runtime rendering. In the runtime/CSSOM hypothesis, Tailwind CSS represents the zero-runtime static baseline, not a runtime competitor.
Publication rules
Curated snapshots are committed; raw reports are not. Raw reports, traces, diagnostics, screenshots, downloaded history, and temporary workspaces stay under benchmarks/.results/**.
Every public result should include the fixture, adapter or mode, package versions, command, machine, operating system, browser version when relevant, viewport/device scale, warmup rounds, measured rounds, cache mode, sample count, and known limits.
Allowed public claim language is intentionally narrow: use "directional evidence," "supports the hypothesis in this fixture," and "static browser-control baseline." Avoid "proves," "overall faster," and "runtime wins" unless future same-machine repeat evidence passes an explicit direction and threshold gate for the named metric.
Real Web Vitals and Lighthouse scores are outside the current benchmark source. The benchmark suite prefers direct output, build, trace, and interaction measurements that can be tied back to a specific fixture and command.
Data sources
Curated snapshots are committed under benchmarks/**/snapshot.json and benchmarks/browser-lifecycle/long-session-evidence.json.
| Result | Committed data | Snapshot command |
|---|---|---|
| Page CSS size | docs-page-css-size/snapshot.json | UPDATE_BENCHMARK_SNAPSHOT=true pnpm --filter ./benchmarks bench:docs-page-css-size |
| Static CSS output, structure, and production build | tailwind-static-comparison/snapshot.json | pnpm --filter ./benchmarks bench:css-output-size, pnpm --filter ./benchmarks bench:build-performance, pnpm --filter ./benchmarks bench:css-structure, then pnpm --filter ./benchmarks snapshot:tailwind-static-comparison |
| Build path diagnostics | build-path-diagnostics/snapshot.json | BENCHMARK_ROUNDS=3 pnpm --filter ./benchmarks bench:startup-diagnostics, BENCHMARK_ROUNDS=3 pnpm --filter ./benchmarks bench:build-diagnostics, BENCHMARK_ROUNDS=3 pnpm --filter ./benchmarks bench:compiler-diagnostics, BENCHMARK_ROUNDS=3 pnpm --filter ./benchmarks bench:extraction-diagnostics, then pnpm --filter ./benchmarks snapshot:build-path-diagnostics |
| Browser CSS cost | browser-css-cost/snapshot.json | pnpm --filter ./benchmarks bench:browser-css-cost, then pnpm --filter ./benchmarks snapshot:browser-css-cost |
| Master CSS delivery modes | master-delivery-modes/snapshot.json | pnpm --filter ./benchmarks bench:master-delivery-modes, then pnpm --filter ./benchmarks snapshot:master-delivery-modes |
| Interaction cost | interaction-cost/snapshot.json | INTERACTION_COST_ROUNDS=3 INTERACTION_COST_WARMUP_ROUNDS=1 pnpm --filter ./benchmarks bench:interaction-cost, then pnpm --filter ./benchmarks snapshot:interaction-cost |
| Browser lifecycle | browser-lifecycle/snapshot.json | BROWSER_LIFECYCLE_ROUNDS=3 BROWSER_LIFECYCLE_WARMUP_ROUNDS=1 BROWSER_LIFECYCLE_REPORT_LABEL=baseline-review-$(date +%F) BENCHMARK_COMMAND_TIMEOUT_MS=900000 pnpm --filter ./benchmarks bench:browser-lifecycle, then pnpm --filter ./benchmarks snapshot:browser-lifecycle |
| Five-minute lifecycle evidence | browser-lifecycle/long-session-evidence.json | Run bench:browser-lifecycle once per mode with BROWSER_LIFECYCLE_SCENARIOS=long-session, BROWSER_LIFECYCLE_MODES=<mode>, BROWSER_LIFECYCLE_ROUNDS=1, BROWSER_LIFECYCLE_WARMUP_ROUNDS=1, BROWSER_LIFECYCLE_LONG_SESSION_MS=300000, BROWSER_LIFECYCLE_MEASURE_TIMEOUT_MS=420000, BROWSER_LIFECYCLE_REPORT_LABEL=long-session-5m-<mode>, and BENCHMARK_COMMAND_TIMEOUT_MS=900000, then pnpm --filter ./benchmarks evidence:browser-lifecycle |
Lifecycle publication checks are pnpm --filter ./benchmarks check:browser-lifecycle, node benchmarks/browser-lifecycle/check-readiness.mjs --profile long-session-evidence browser-lifecycle/long-session-evidence.json, and node benchmarks/browser-lifecycle/compare-stability.mjs after same-machine repeat reports.