ONE WORKLOAD. FOUR ARCHITECTURES.

Measure the trade-off.

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 →
Preparing this demo…

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.

Shared snapshots

One owner. Two readers attach shared columns. The UI reads visible rows directly.

Immutable.js Lists

Two workers keep persistent Lists. Batch updates with withMutations. Clone only new column values and rebuild Lists in each reader.

Native replicas

Two workers keep native arrays. Copy the initial columns once; send only appended events on update.

One data owner

A single worker owns native arrays, performs both calculations, and returns the first page of rows.

What each phase means

Initial sharing

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.

Query an attached dataset

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, publish, query

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.

Boundaries and fairness

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.

RECORDED MEMORY · NOT A LIVE BROWSER METER

Count the memory, too.

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.

Less data memory across two readersUnique messages · 100,000 events · after queriesRecorded Node.js · MiB · lower is better

Retained data memory

zerocopy9.10 MiB
Immutable.js44.46 MiB
Native replicas33.36 MiB
One native owner14.04 MiB

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.

Exact values and trial range

Median and observed min–max of three fresh processes. These ranges are not confidence intervals.

Design · readersMedian (MiB)Trial range (MiB)
zerocopy · 2 readers9.109.09–9.10
Immutable.js · 2 readers44.4644.27–44.55
Native replicas · 2 readers33.3633.36–33.36
One native owner · 0 readers14.0414.04–14.05

10 October 2026 · Node v22.23.3 · linux x64 · 3 trials per case. Not browser RAM.
Open SVG · Download chart data

The whole process tells a different storyUnique messages · 100,000 events · after queriesRecorded Node.js · MiB · lower is better

Total process RAM (RSS)

zerocopy122.06 MiB
Immutable.js212.99 MiB
Native replicas164.17 MiB
One native owner116.21 MiB

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.

Exact values and trial range

Median and observed min–max of three fresh processes. These ranges are not confidence intervals.

Design · readersMedian (MiB)Trial range (MiB)
zerocopy · 2 readers122.06119.30–122.42
Immutable.js · 2 readers212.99206.97–216.69
Native replicas · 2 readers164.17163.95–164.23
One native owner · 0 readers116.21114.78–117.30

10 October 2026 · Node v22.23.3 · linux x64 · 3 trials per case. Not browser RAM.
Open SVG · Download chart data

Node.js worker measurements · median of three fresh processes · 10 October 2026
InputSharedImmutable.jsNative replicasOne native owner
Repeated messages4.7033.7723.356.06
Unique messages9.1044.4633.3614.04
20% Unicode prefix9.7946.6535.8614.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 →

Type a topic to find a guide.

↓ ↑ to move · Enter to open · Esc to close

Browse documentation →