# Mixed CMS widget benchmark analysis

Generated 26 August 2026 on an Apple M4 with Node 22.20.0.

## Run shape

- 48 valid browser samples and zero invalid samples
- 50-block and 200-block mixed pages
- Rich-text sections, callouts, metrics, and three-item galleries
- Editable widget documents and the read-only `WidgetDocumentView`
- Three cold and three warm samples at native and 4x CPU rates

The mixed widget implementations live in an async benchmark-only chunk. They do
not increase the normal editor page's initial bundle.

## Warm-cache results

| Mode      | Blocks | CPU | Ready, ms | Selection sweep CPU, ms | Type 20 characters, input ms | Idle heap, MiB | Active heap, MiB |
| --------- | -----: | --: | --------: | ----------------------: | ---------------------------: | -------------: | ---------------: |
| Editor    |     50 |  1x |      50.6 |                     0.8 |                         42.7 |           1.93 |             3.72 |
| Editor    |    200 |  1x |      51.4 |                     1.2 |                         38.7 |           2.65 |             4.44 |
| Editor    |     50 |  4x |     125.3 |                     0.9 |                         69.8 |           1.93 |             3.71 |
| Editor    |    200 |  4x |     146.2 |                     2.1 |                         75.3 |           2.64 |             4.43 |
| Read only |     50 |  1x |      45.3 |                     n/a |                          n/a |           1.76 |             2.34 |
| Read only |    200 |  1x |      39.7 |                     n/a |                          n/a |           2.16 |             2.76 |
| Read only |     50 |  4x |     102.9 |                     n/a |                          n/a |           1.76 |             2.34 |
| Read only |    200 |  4x |     115.5 |                     n/a |                          n/a |           2.16 |             2.76 |

Selecting every block in sequence costs 1.2 ms of CPU for the 200-block native
case and 2.1 ms at 4x throttling. Input time stays nearly flat between 50 and
200 mixed blocks. Static widget bodies do not rerender during the selection
sweep.

The read-only path uses 0.48 MiB less idle heap than the editor at 200 blocks and
does not create history, selection, or editing state. Its initial payload is
64.7 KiB gzip, compared with 67.5 KiB for the editor shell. The optional Lexical
chunk is present in the build output but is not requested by the read-only page.

All warm cases recorded zero dropped frames and zero long tasks. Scroll p95 was
between 17.9 and 18.5 ms.

## Scope limit

The galleries use local placeholder elements so this run measures the document
engine, React rendering, and DOM cost. It does not measure image decoding,
third-party embeds, network latency, or application persistence. Those costs
belong to widget implementations and host applications.
