Shared snapshots
One owner. Two readers attach shared columns. The UI reads visible rows directly.
Search, summarize, and read a page of events. Then append a batch and do it again. Compare shared snapshots with real Immutable.js Lists and two native-data designs.
Try the log explorer first →Setup normally runs automatically. This host may need one page refresh to enable shared memory. If your browser blocks service workers or isolation, open this page in a full browser or use a host with COOP/COEP headers. Documentation stays available; there is no copy-mode fallback.
Uses CPU and memory. Keep this tab visible. Two warm-ups and seven measured samples per path. No data leaves this browser.
No stored scores. Run it to measure on this device.
One owner. Two readers attach shared columns. The UI reads visible rows directly.
Two workers keep persistent Lists. Batch updates with withMutations. Clone only new column values and rebuild Lists in each reader.
Two workers keep native arrays. Copy the initial columns once; send only appended events on update.
A single worker owns native arrays, performs both calculations, and returns the first page of rows.
Send the existing input and await attachment in all readers. Native data is structured-cloned. Immutable.js includes plain-column encoding, structured clone, and List construction in readers. Shared view creation is included. No query in this phase.
Run the same search and summary. Include worker messages and the first 50 materialized rows. Do not resend the dataset. All paths read collections directly; no List-to-array conversion is used for queries. Both scans yield periodically to keep cancellation possible.
Append 2,000 events, synchronize readers, and repeat the query. Both native and Immutable.js replicas receive only the delta—not another full copy. Immutable.js owner updates, delta encoding, and reader List updates are timed. Shared immutable appends and attachment are timed.
A coordinator stands in for the UI, so timings exclude DOM rendering, user input, startup, and module loading. Construction is separate. Paths rotate. Each answer is checked against an independent native-array reference outside timing.
No universal winner is expected. For append-only data, native readers can also retain an earlier view by length. This workload does not prove a unique snapshot benefit. It does not measure process memory, arbitrary edits, SQL, or end-to-end UI latency.
Use the snapshot transport lab for the existing Map comparison, or read all historical collection results.
100,000 events. One owner and two readers for Shared, Immutable.js and Native replicas. One native owner has no reader replicas. Compare retained data with total process RAM. Each graph has its own labelled, zero-based scale. The full table below shows post-query retained data memory, in MiB. Lower is better.
Retained data memory
Shared WASM capacity is counted once. Includes caches and spare capacity; excludes the empty-worker baseline. Replicated paths: one owner + two readers. One native owner: no reader replicas.
Median and observed min–max of three fresh processes. These ranges are not confidence intervals.
| Design · readers | Median (MiB) | Trial range (MiB) |
|---|---|---|
| zerocopy · 2 readers | 9.10 | 9.09–9.10 |
| Immutable.js · 2 readers | 44.46 | 44.27–44.55 |
| Native replicas · 2 readers | 33.36 | 33.36–33.36 |
| One native owner · 0 readers | 14.04 | 14.04–14.05 |
10 October 2026 · Node v22.23.3 · linux x64 · 3 trials per case. Not browser RAM.
Open SVG · Download chart data
Total process RAM (RSS)
Absolute resident set size (RSS), including workers and runtime overhead. One native owner uses the least RSS in this run. Replicated paths: one owner + two readers. One native owner: no reader replicas.
Median and observed min–max of three fresh processes. These ranges are not confidence intervals.
| Design · readers | Median (MiB) | Trial range (MiB) |
|---|---|---|
| zerocopy · 2 readers | 122.06 | 119.30–122.42 |
| Immutable.js · 2 readers | 212.99 | 206.97–216.69 |
| Native replicas · 2 readers | 164.17 | 163.95–164.23 |
| One native owner · 0 readers | 116.21 | 114.78–117.30 |
10 October 2026 · Node v22.23.3 · linux x64 · 3 trials per case. Not browser RAM.
Open SVG · Download chart data
| Input | Shared | Immutable.js | Native replicas | One native owner |
|---|---|---|---|---|
| Repeated messages | 4.70 | 33.77 | 23.35 | 6.06 |
| Unique messages | 9.10 | 44.46 | 33.36 | 14.04 |
| 20% Unicode prefix | 9.79 | 46.65 | 35.86 | 14.88 |
Includes every worker's JavaScript heap change, tracked buffers, caches, and current shared WASM capacity counted once. Excludes the empty-worker baseline. These are Node.js measurements, not measurements of this device or browser. The live event selector does not change this table.
Total process RAM gives a different result: the one-native-owner control uses the least RSS in this run. Read the full report for RSS, peak process RAM, reader scaling, old snapshots and limits.
Read the memory comparison and method →