Performance report · 2026-10-04

dockview-vue 8.4 vs CustomLayout

A comparison of two window layout engines for a trading terminal: operation timings, scaling, memory, DOM, bundle size and features. Plus the results of the dockview 5.2 → 8.4 upgrade.

dockview 8.4.0CustomLayout Chromium 153.0.8010.12 headless · M3 Pro 3 passes × CPU ×1 and ×4 commit a143bbfa + uncommitted changes

01Summary

There is no clear winner. CustomLayout is several times faster at heavy lifecycle operations on large layouts (mount, restore, clear, splitter release). dockview is faster at small, frequent operations (splitter drag step, serialization, panel removal and moving light panels in large trees, first tab open) by 2–20× or more, but in absolute terms that is fractions of a millisecond to a few ms at ×1 (up to ~24 ms at ×4); moving heavy panels is only ×1.1–1.23. Under comparable load (flat-20 with heavy panels) the engines are equal; at size 4 the difference is a few ms.

Mounting 200 heavy panels, ×1
279 / 122 ms
CustomLayout is 2.3× faster, but keeps 20 live panels versus 200
Snapshot restore, 200 heavy, ×1
539 / 137 ms
CL / DV = 0.25×; both engines mount new ids
Splitter step, 200 heavy, ×1
0.42 / 1.99 ms
dockview is 4.7× faster; both are well under the 16.7 ms frame budget
Bundle, JS gzip
86.3 KB / 14.2 KB
CustomLayout is 6.1× smaller

CustomLayout is faster

  • Mount and restore with ≥ 20 heavy panels (except flat-20): from ×0.81–0.82 (mount, 20) to ×0.25–0.28 (restore, 200), the same at ×1 and ×4
  • Clear already wins at size 4 (×0.33–0.65)
  • Clear at ≥ 20: ×0.06–0.12 (240 → 13.3 ms at 200)
  • Splitter release, heavy panels: ×0.03–0.07 (46.9 → 2.5 ms at 200); with light panels, from parity to ×0.59–0.64 at 100–200 and ×4
  • Forced resize ×0.50–0.65 (heavy; the absolute gain is fractions of a ms, up to 1.9 ms at ×4); mount cycles ×0.61–0.67 (heavy; parity with light panels)
  • Tab click: visible latency is one frame lower (dockview defers activation to rAF)
  • At ×4 with 100–200 heavy panels, real drag is smoother: half as many dropped frames (84–89 vs 185); median frame 33 vs 50 ms, but it is quantized to frames and the difference does not pass the significance criterion

dockview is faster

  • Splitter drag step: 2–5.6×
  • Serialization: ~10× (11 vs 115 µs at 200), since getLayout makes a deep copy
  • Moving a panel in large trees: ×1.23 (heavy), ×4.3 (light, 200); in CustomLayout this is a full config reload
  • Removing a single panel with ≥ 50 panels: ~18–23× for heavy (0.27 vs 6 ms at 200), 3.4–7.8× for light; with 4–20 heavy panels the difference is not significant. The sharp drop in dockview's median from ~4.5 to ~0.25 ms at ≥ 50 has not been investigated (p95 is ~9–10 ms for both)
  • First tab open (tabs-20): in CustomLayout this is a lazy mount, 2.0–7.4 ms at ×1 (up to 23.6 ms at ×4) vs < 0.3 ms
  • Cold mount of 200 light panels: ×1.13
  • Real drag at ×4 with 20 heavy panels: half as many dropped frames (39 vs 80.5); at 50 the median frame is 16.7 vs 25 ms, but dropped frames are equal (88.5 vs 82), and the difference in median frame is not significant by the criterion

Parity

  • flat-20 mount (same number of mounted panels): 108.5 / 108.5 ms
  • Mount and restore at size 4, heavy panels: 4–7 % difference. With light panels CustomLayout is formally significantly faster by 14–28 %, but in absolute terms that is 0.7–4 ms
  • Tab switch via API, heavy panels: ×0.89–1.03
  • Moving heavy panels at 20–50: ×0.99–1.09 (with light panels dockview is faster from 20 already at ×4)
  • Real drag at ×1: both hold 60 fps at all sizes
Where CustomLayout's advantage comes from. Mostly architectural: CustomLayout mounts only tabs that have been visible at least once, while dockview creates a component for every panel. With 200 heavy panels, 20 stay live versus 200; on tabs-20, 2 versus 21. Where the number of mounted panels is the same (flat-20), heavy-panel mount time matches within 2 % (light: 4–10 % in CustomLayout's favor). For a real terminal with many hidden tabs this is a fair advantage, but it does not mean the layout code itself is faster.
Statistical significance. Out of 240 comparisons on ranked metrics (all sizes, both panel types, ×1 and ×4): 122 CustomLayout faster, 69 dockview faster, 28 parity (difference < 10 %), 21 not significant. "Significant" here means the faster engine won in each of the 3 passes and the interquartile ranges of the pooled samples do not overlap. This is a heuristic, not a formal test: with n = 6 samples per point (more for some metrics) and 3 passes, p-values were not computed. Multi-fold differences are robust; 10–25 % differences at small sizes are on the edge of noise.
What this means in practice. All of CustomLayout's losses in frequent operations (splitter step ≤ 2 ms at ×1, serialization ≤ 0.5 ms) fit within the frame budget even at ×4 with 200 panels (step 9.5 ms). The exception is opening a heavy tab for the first time at ×4 (lazy mount, 23.6 ms): roughly one dropped frame. The wins, meanwhile, fall on operations users notice: opening a workspace (hundreds of ms at ×4) and splitter release (185 → 12 ms at ×4/200). The decision should be based not on speed but on features (see section 09) and maintenance cost.

02Environment and methodology

MachineApple M3 Pro, 12 cores, 18 GB, AC power, battery 100%
OSmacOS 26.6.2 (25G83), Darwin 25.6.0
BrowserPlaywright Chromium 153.0.8010.12 (headless, channel chromium); Playwright 1.63.0; page isolation per pass (--isolate)
Flags--js-flags=--expose-gc --enable-precise-memory-info --disable-renderer-backgrounding --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-extensions
Node / npmv20.10.0 / 10.2.3
Librariesdockview-vue 8.4.0, dockview-core 8.4.0, Vue 3.5.17, Vite 2.9.15
Buildproduction: VITE_LAYOUT_BENCH=1 npm run build, served by vite preview :5050
Gitfeat/custom-layout @ a143bbfa, working tree with changes
Viewport1920x1200 @1x, stage 1600x1000; crossOriginIsolated, timer resolution 5 µs, gc() available
Run time2026-10-04T00:08:25Z — 2026-10-04T01:31:36Z (83 min), errors: 0
SafetyAll /api/* are mocked; only 6 x GET /user went out (mocked 401); non-GET requests: 0; external: 0

How it is measured. The route /layout-benchmark mounts both engines in a 1600×1000 stage and runs identical scenarios through adapters. For each operation it records:

  • syncMs — the synchronous part of the operation until control returns (including the Vue flush) — the primary cost metric;
  • readyMs — when the DOM reached the target state (polled in rAF and after a frame) — quantized to frames;
  • paintMs — until the next paint after readiness;
  • special: perRemoveSyncMs, stepMs/commitMs, serializeUs, cycleMs, heapDeltaBytes.

Two panel types: light (a nearly empty component) and heavy (substantial DOM and work on mount). CPU throttling via CDP: ×1 and ×4 (simulating a slow machine). 3 passes per throttling level, each in a fresh page; engine order alternates between passes.

Aggregation. The chart bar is the median of per-pass medians; the whisker is the p95 of the pooled samples. With n = 6, p95 is effectively the maximum. A CL / DV ratio < 1 means CustomLayout is faster.

Layout sizes

KeyPanelsGroupsTabs per groupDepthBranching
444122
202010233
flat-202020133
505010533
10010020533
200200201033
tabs-202122012

Iteration count reduced

With default settings one ×1 pass took ~30 min and ×4 about three times longer; the full run would have taken ~5 h. Iterations were reduced to fit in ~80 min. This widens confidence intervals, especially for small values at size 4.

ParameterDefaultUsed
lifecycleIterations102
operationIterations306
warmup31
blocks52
cycles208
dragIterations32
serializeCount1000300
trustedRepeats52

Data quality checks

03Caveats and fairness of the comparison

A methodology review found 9 issues; all were fixed before the final run. Below is what was fixed and what remains a limitation.

Fixed before the run

  1. restore did different work. CustomLayout stores panels by id, so reloading the same snapshot is nearly a no-op. Now restore-replace loads a snapshot with new ids (both engines mount N panels); the old variant was moved to restore-same-ids.
  2. readyMs lagged by a frame for work deferred to rAF (dockview's ResizeObserver). Added a recheck after the frame: dockview resize-observed 33.5 → 18.3 ms.
  3. readyMs was presented as engine cost. It is now explicitly marked as frame-quantized and is not ranked.
  4. remove-sequential compared batched work. Added a comparable metric perRemoveSyncMs.
  5. Fixed engine order in mount-cycles. Each engine now goes first once per pass.
  6. The CDP heap check mixed engines. Now done separately per engine, with alternating order.
  7. Long tasks / TBT ignored the operation's own task. They are now matched by overlap with the window.
  8. Real drag ignored the axis. The axis is now taken from prepare().

Remaining limitations

  1. Mount counts differ by design: dockview creates a component for every tab, CustomLayout mounts only active tabs, lazily. Compare flat-20 with 20 and read alivePanels next to the timings.
  2. CustomLayout has no fine-grained API for activate, move and add-to-group: those paths are getLayout → helper → loadLayout (a full reload), exactly as the app does it, and are not equivalent to dockview calls.
  3. CustomLayout removeComponent refuses to remove the last remaining panel; the adapter falls back to clearLayout for it.
  4. Headless frame times are indicative. Rank on syncMs, perRemoveSyncMs, stepMs, commitMs and serializeUs, not on readyMs or paintMs: both are quantized to display frames and mostly measure vsync wait.
  5. readyMs is polled at each rAF and again in a task after that frame, so rAF-deferred work is seen in the frame it runs in. Read it together with framesToSettle (the syncMs extra), never as engine cost.
  6. resize-observed: dockview lays out one frame later by design (ResizeObserver → rAF → layout), so its readyMs carries one extra frame of idle time; resize-forced isolates the layout cost. syncMs is only meaningful where readyInSync is 1.
  7. tab-switch-warm: dockview activates on pointerdown and defers it one rAF (HTML5 DnD on); CustomLayout activates on click. Both get the same pointerdown → pointerup → click sequence. Its readyMs is user-visible latency in frames, not work; compare engine cost on tab-switch-api syncMs.
  8. restore-replace loads a snapshot of the same shape with disjoint ids, so both engines unmount N and mount N panels. restore-same-ids reloads identical ids: CustomLayout keeps its id-keyed panels mounted and only diffs the tree, dockview fromJSON rebuilds every panel. Check the mounts extra before reading it as a speed difference.
  9. remove-sequential removes all N panels in one synchronous block: dockview updates the DOM on every removePanel, CustomLayout replaces a reactive config N times and renders once. It measures batched API cost; perRemoveSyncMs (each removal flushed on its own) is the like-for-like per-operation metric.
  10. mount-cycles runs each engine twice per pass in opposite order (each engine goes first once); heapDeltaBytes therefore has two samples per pass.
  11. add-k appends 20 root groups to a 4-group tree; past ~16 root groups dockview clamps groups at its 100 px minimum while CustomLayout keeps shrinking them.
  12. Reduced iterations (see above): only differences ≥ 1.5× are worth ranking; 10–25 % differences at size 4 are within noise.
  13. Headless Chromium without GPU compositing: absolute numbers are lower than on users' real hardware; the ratios are what matter.
  14. Synthetic panels are not real terminal widgets (TradingView charts, tables with data streams).

04Scenarios

Each metric has two charts (CPU ×1 and ×4) and a table. The bar is the median, the whisker is p95, and under each category is the CL / DV ratio (color marks the significant winner, gray means parity or noise). The toggle below switches the panel type in all charts.

dockviewCustomLayout
Scenario list

1Cold mount cold-mount · syncMs

Empty engine → loading a tree of N panels, synchronous part until control returns. flat-20 is 20 groups with one tab each (same number of mounted panels in both engines). ranked metric

CPU ×1
0100200300dockview · 4: median 23.9 ms, p95 25.924CustomLayout · 4: median 22.7 ms, p95 24.22340.95×dockview · 20: median 62.7 ms, p95 64.463CustomLayout · 20: median 51.6 ms, p95 53.152200.82×dockview · flat-20: median 108 ms, p95 111108CustomLayout · flat-20: median 109 ms, p95 111109flat-201.00×dockview · 50: median 88.5 ms, p95 89.488CustomLayout · 50: median 54.5 ms, p95 55.355500.62×dockview · 100: median 196 ms, p95 197196CustomLayout · 100: median 114 ms, p95 1181141000.58×dockview · 200: median 279 ms, p95 291279CustomLayout · 200: median 122 ms, p95 1261222000.44×ms
CPU ×4
05001,0001,500dockview · 4: median 85.5 ms, p95 86.886CustomLayout · 4: median 82.3 ms, p95 84.48240.96×dockview · 20: median 246 ms, p95 257246CustomLayout · 20: median 200 ms, p95 204200200.81×dockview · flat-20: median 420 ms, p95 437420CustomLayout · flat-20: median 410 ms, p95 429410flat-200.98×dockview · 50: median 355 ms, p95 358355CustomLayout · 50: median 208 ms, p95 212208500.58×dockview · 100: median 742 ms, p95 751742CustomLayout · 100: median 451 ms, p95 4544511000.61×dockview · 200: median 1.052 ms, p95 1.0861,052CustomLayout · 200: median 492 ms, p95 5004922000.47×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×123.925.923.21.0822.724.221.60.950.95×parity6
4×485.586.884.80.7482.384.481.31.290.96×parity6
20×162.764.461.11.2851.653.150.11.120.82×CL faster6
20×42462572358.632002041963.180.81×CL faster6
flat-20×11081111023.631091111013.541.00×parity6
flat-20×442043740413.841042939813.60.98×parity6
50×188.589.487.10.8954.555.353.60.740.62×CL faster6
50×43553583435.332082122062.370.58×CL faster6
100×11961971950.601141181093.950.58×CL faster6
100×474275169022.74514544356.790.61×CL faster6
200×12792912765.041221261183.280.44×CL faster6
200×41,0521,0861,04614.74925004788.390.47×CL faster6
CPU ×1
0102030dockview · 4: median 7.86 ms, p95 9.577.9CustomLayout · 4: median 5.92 ms, p95 7.855.940.75×dockview · 20: median 10.3 ms, p95 11.010CustomLayout · 20: median 8.22 ms, p95 8.848.2200.80×dockview · flat-20: median 10.8 ms, p95 12.111CustomLayout · flat-20: median 9.76 ms, p95 10.99.8flat-200.90×dockview · 50: median 11.0 ms, p95 11.911CustomLayout · 50: median 10.6 ms, p95 11.611500.96×dockview · 100: median 15.2 ms, p95 15.815CustomLayout · 100: median 15.9 ms, p95 17.3161001.05×dockview · 200: median 18.8 ms, p95 19.719CustomLayout · 200: median 21.2 ms, p95 22.2212001.13×ms
CPU ×4
0255075100dockview · 4: median 14.9 ms, p95 15.715CustomLayout · 4: median 10.8 ms, p95 11.91140.72×dockview · 20: median 20.4 ms, p95 21.720CustomLayout · 20: median 17.0 ms, p95 17.617200.83×dockview · flat-20: median 23.5 ms, p95 24.824CustomLayout · flat-20: median 22.5 ms, p95 23.423flat-200.96×dockview · 50: median 25.8 ms, p95 26.526CustomLayout · 50: median 25.0 ms, p95 25.425500.97×dockview · 100: median 41.9 ms, p95 42.942CustomLayout · 100: median 45.7 ms, p95 47.5461001.09×dockview · 200: median 60.3 ms, p95 68.360CustomLayout · 200: median 72.1 ms, p95 83.7722001.20×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×17.869.576.431.375.927.853.411.440.75×CL faster6
4×414.915.714.10.5310.811.910.00.820.72×CL faster6
20×110.311.05.832.008.228.844.391.620.80×not significant6
20×420.421.719.40.7917.017.616.50.450.83×CL faster6
flat-20×110.812.19.251.009.7610.99.000.730.90×parity6
flat-20×423.524.822.20.9922.523.421.90.510.96×parity6
50×111.011.910.40.5710.611.610.10.530.96×parity6
50×425.826.525.10.5425.025.423.70.590.97×parity6
100×115.215.813.70.8515.917.315.30.761.05×parity6
100×441.942.940.50.8945.747.543.91.391.09×parity6
200×118.819.717.90.7021.222.220.10.821.13×DV faster6
200×460.368.357.33.8272.183.767.95.321.20×DV faster6

2Restore: new snapshot restore-replace · syncMs

Loading a snapshot of the same shape with different ids into an engine that already has a tree: both engines unmount N and mount N panels (a fair comparison after fix #1). ranked metric

CPU ×1
0200400600dockview · 4: median 23.4 ms, p95 23.923CustomLayout · 4: median 22.4 ms, p95 23.12240.96×dockview · 20: median 149 ms, p95 156149CustomLayout · 20: median 55.6 ms, p95 59.556200.37×dockview · 50: median 181 ms, p95 191181CustomLayout · 50: median 59.9 ms, p95 61.360500.33×dockview · 100: median 403 ms, p95 417403CustomLayout · 100: median 129 ms, p95 1351291000.32×dockview · 200: median 539 ms, p95 556539CustomLayout · 200: median 137 ms, p95 1421372000.25×ms
CPU ×4
01,0002,0003,000dockview · 4: median 92.7 ms, p95 94.493CustomLayout · 4: median 86.5 ms, p95 87.78640.93×dockview · 20: median 553 ms, p95 570553CustomLayout · 20: median 241 ms, p95 246241200.44×dockview · 50: median 700 ms, p95 721700CustomLayout · 50: median 245 ms, p95 251245500.35×dockview · 100: median 1.553 ms, p95 1.5801,553CustomLayout · 100: median 505 ms, p95 5275051000.32×dockview · 200: median 2.008 ms, p95 2.1522,008CustomLayout · 200: median 556 ms, p95 5775562000.28×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×123.423.923.10.3022.423.121.90.410.96×parity6
4×492.794.491.41.2686.587.784.81.260.93×parity6
20×11491561434.3955.659.555.11.660.37×CL faster6
20×455357054210.62412462247.760.44×CL faster6
50×11811911688.2459.961.359.00.890.33×CL faster6
50×470072168912.52452512289.140.35×CL faster6
100×14034174006.541291351197.150.32×CL faster6
100×41,5531,5801,53515.450552747122.70.32×CL faster6
200×153955651414.51371421324.870.25×CL faster6
200×42,0082,1521,98277.755657754512.60.28×CL faster6
CPU ×1
010203040dockview · 4: median 4.68 ms, p95 5.194.7CustomLayout · 4: median 3.94 ms, p95 4.283.940.84×dockview · 20: median 12.6 ms, p95 13.013CustomLayout · 20: median 6.80 ms, p95 7.306.8200.54×dockview · 50: median 14.0 ms, p95 14.914CustomLayout · 50: median 9.21 ms, p95 10.89.2500.66×dockview · 100: median 23.2 ms, p95 24.423CustomLayout · 100: median 15.6 ms, p95 16.4161000.67×dockview · 200: median 34.3 ms, p95 35.834CustomLayout · 200: median 21.7 ms, p95 22.3222000.63×ms
CPU ×4
050100150200dockview · 4: median 7.95 ms, p95 11.27.9CustomLayout · 4: median 6.85 ms, p95 7.216.840.86×dockview · 20: median 28.1 ms, p95 30.228CustomLayout · 20: median 15.4 ms, p95 16.015200.55×dockview · 50: median 37.5 ms, p95 39.038CustomLayout · 50: median 24.6 ms, p95 25.325500.65×dockview · 100: median 82.6 ms, p95 86.183CustomLayout · 100: median 47.5 ms, p95 49.6471000.57×dockview · 200: median 136 ms, p95 156136CustomLayout · 200: median 79.4 ms, p95 88.8792000.58×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×14.685.194.160.503.944.283.640.270.84×CL faster6
4×47.9511.27.221.396.857.216.220.370.86×CL faster6
20×112.613.010.80.796.807.306.260.390.54×CL faster6
20×428.130.227.50.9415.416.014.80.390.55×CL faster6
50×114.014.913.30.629.2110.88.020.910.66×CL faster6
50×437.539.036.51.0524.625.323.80.510.65×CL faster6
100×123.224.421.81.1915.616.415.00.530.67×CL faster6
100×482.686.178.32.9647.549.646.41.220.57×CL faster6
200×134.335.833.21.0521.722.320.80.630.63×CL faster6
200×41361561328.7879.488.878.54.150.58×CL faster6

3Restore: same ids restore-same-ids · syncMs

Reloading the same snapshot. CustomLayout keeps panels with the same ids and only diffs the tree (mounts = 0), while dockview fromJSON recreates everything. This is different work: the gap reflects architecture, not "speed". ranked metric

CPU ×1
0200400600dockview · 4: median 24.3 ms, p95 27.124CustomLayout · 4: median 0.43 ms, p95 0.480.4340.02×dockview · 20: median 145 ms, p95 151145CustomLayout · 20: median 0.81 ms, p95 0.960.8120<0.01×dockview · 50: median 185 ms, p95 189185CustomLayout · 50: median 0.93 ms, p95 1.000.9350<0.01×dockview · 100: median 397 ms, p95 403397CustomLayout · 100: median 1.67 ms, p95 1.881.7100<0.01×dockview · 200: median 521 ms, p95 550521CustomLayout · 200: median 2.51 ms, p95 2.642.5200<0.01×ms
CPU ×4
01,0002,0003,000dockview · 4: median 91.6 ms, p95 92.692CustomLayout · 4: median 1.27 ms, p95 2.231.340.01×dockview · 20: median 557 ms, p95 581557CustomLayout · 20: median 3.24 ms, p95 3.553.220<0.01×dockview · 50: median 699 ms, p95 713699CustomLayout · 50: median 3.51 ms, p95 4.113.550<0.01×dockview · 100: median 1.553 ms, p95 1.5621,553CustomLayout · 100: median 7.40 ms, p95 1097.4100<0.01×dockview · 200: median 2.056 ms, p95 2.2872,056CustomLayout · 200: median 10.9 ms, p95 11.611200<0.01×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×124.327.123.21.410.430.480.390.030.02×CL faster6
4×491.692.690.20.951.272.230.960.500.01×CL faster6
20×11451511413.850.810.960.680.13<0.01×CL faster6
20×455758154812.43.243.552.490.41<0.01×CL faster6
50×11851891812.520.931.000.870.05<0.01×CL faster6
50×469971367515.63.514.112.910.41<0.01×CL faster6
100×13974033895.681.671.881.620.10<0.01×CL faster6
100×41,5531,5621,5437.287.401096.8141.5<0.01×CL faster6
200×152155050119.52.512.642.350.11<0.01×CL faster6
200×42,0562,2871,99611410.911.610.10.65<0.01×CL faster6
CPU ×1
010203040dockview · 4: median 4.66 ms, p95 6.324.7CustomLayout · 4: median 0.93 ms, p95 1.520.9340.20×dockview · 20: median 13.0 ms, p95 14.213CustomLayout · 20: median 1.26 ms, p95 1.521.3200.10×dockview · 50: median 13.8 ms, p95 15.914CustomLayout · 50: median 1.50 ms, p95 1.651.5500.11×dockview · 100: median 23.8 ms, p95 26.024CustomLayout · 100: median 2.01 ms, p95 2.222.01000.08×dockview · 200: median 33.2 ms, p95 35.933CustomLayout · 200: median 2.52 ms, p95 3.282.52000.08×ms
CPU ×4
050100150dockview · 4: median 7.74 ms, p95 8.317.7CustomLayout · 4: median 1.17 ms, p95 1.671.240.15×dockview · 20: median 27.1 ms, p95 28.027CustomLayout · 20: median 2.88 ms, p95 3.222.9200.11×dockview · 50: median 35.3 ms, p95 36.135CustomLayout · 50: median 3.44 ms, p95 4.183.4500.10×dockview · 100: median 79.1 ms, p95 79.779CustomLayout · 100: median 6.33 ms, p95 6.686.31000.08×dockview · 200: median 126 ms, p95 143126CustomLayout · 200: median 9.35 ms, p95 11.29.42000.07×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×14.666.323.750.850.931.520.630.320.20×CL faster6
4×47.748.317.140.491.171.670.640.430.15×CL faster6
20×113.014.211.70.961.261.521.010.200.10×CL faster6
20×427.128.026.50.492.883.222.380.320.11×CL faster6
50×113.815.912.71.211.501.651.340.120.11×CL faster6
50×435.336.134.70.523.444.183.140.350.10×CL faster6
100×123.826.020.61.992.012.221.860.150.08×CL faster6
100×479.179.777.90.736.336.685.330.500.08×CL faster6
200×133.235.931.61.582.523.282.440.320.08×CL faster6
200×41261431257.989.3511.28.920.820.07×CL faster6

4Clearing the layout clear · syncMs

clear() / clearLayout() on a tree of N panels. ranked metric

CPU ×1
0100200300dockview · 4: median 3.75 ms, p95 3.843.8CustomLayout · 4: median 2.41 ms, p95 2.482.440.64×dockview · 20: median 77.4 ms, p95 78.277CustomLayout · 20: median 5.59 ms, p95 6.195.6200.07×dockview · 50: median 93.5 ms, p95 97.293CustomLayout · 50: median 6.12 ms, p95 6.636.1500.07×dockview · 100: median 215 ms, p95 218215CustomLayout · 100: median 13.9 ms, p95 21.1141000.06×dockview · 200: median 240 ms, p95 242240CustomLayout · 200: median 13.3 ms, p95 14.9132000.06×ms
CPU ×4
05001,0001,500dockview · 4: median 14.2 ms, p95 15.814CustomLayout · 4: median 9.22 ms, p95 10.39.240.65×dockview · 20: median 345 ms, p95 383345CustomLayout · 20: median 23.2 ms, p95 24.423200.07×dockview · 50: median 362 ms, p95 403362CustomLayout · 50: median 23.7 ms, p95 26.624500.07×dockview · 100: median 874 ms, p95 943874CustomLayout · 100: median 62.4 ms, p95 71.1621000.07×dockview · 200: median 960 ms, p95 1.064960CustomLayout · 200: median 60.0 ms, p95 68.6602000.06×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×13.753.843.650.082.412.482.330.060.64×CL faster6
4×414.215.813.41.009.2210.38.770.610.65×CL faster6
20×177.478.276.20.825.596.195.360.280.07×CL faster6
20×434538331624.823.224.422.30.720.07×CL faster6
50×193.597.281.85.606.126.635.720.320.07×CL faster6
50×436240335319.523.726.623.31.450.07×CL faster6
100×12152182112.6713.921.111.93.480.06×CL faster6
100×487494386630.662.471.150.18.090.07×CL faster6
200×12402422391.5013.314.912.60.870.06×CL faster6
200×49601,06494750.160.068.650.18.270.06×CL faster6
CPU ×1
0102030dockview · 4: median 1.51 ms, p95 1.811.5CustomLayout · 4: median 0.50 ms, p95 0.980.5040.33×dockview · 20: median 7.20 ms, p95 8.057.2CustomLayout · 20: median 0.75 ms, p95 0.830.75200.10×dockview · 50: median 7.70 ms, p95 8.137.7CustomLayout · 50: median 0.93 ms, p95 1.400.93500.12×dockview · 100: median 15.8 ms, p95 16.516CustomLayout · 100: median 1.17 ms, p95 1.301.21000.07×dockview · 200: median 23.2 ms, p95 24.623CustomLayout · 200: median 1.49 ms, p95 1.651.52000.06×ms
CPU ×4
0255075100dockview · 4: median 2.98 ms, p95 4.293.0CustomLayout · 4: median 1.11 ms, p95 1.331.140.37×dockview · 20: median 17.0 ms, p95 19.617CustomLayout · 20: median 2.03 ms, p95 2.332.0200.12×dockview · 50: median 21.0 ms, p95 26.321CustomLayout · 50: median 2.61 ms, p95 3.692.6500.12×dockview · 100: median 50.6 ms, p95 64.451CustomLayout · 100: median 3.28 ms, p95 4.883.31000.06×dockview · 200: median 86.2 ms, p95 94.586CustomLayout · 200: median 4.85 ms, p95 6.804.82000.06×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×11.511.811.250.190.500.980.370.220.33×CL faster6
4×42.984.292.470.671.111.330.940.170.37×CL faster6
20×17.208.056.750.440.750.830.670.050.10×CL faster6
20×417.019.614.41.832.032.331.730.270.12×CL faster6
50×17.708.137.260.380.931.400.710.240.12×CL faster6
50×421.026.318.43.252.613.692.270.530.12×CL faster6
100×115.816.515.00.541.171.301.010.110.07×CL faster6
100×450.664.446.76.333.284.883.050.700.06×CL faster6
200×123.224.622.30.851.491.651.340.140.06×CL faster6
200×486.294.583.44.464.856.804.210.990.06×CL faster6

5Removal one at a time (per operation) remove-sequential · perRemoveSyncMs

Removing a panel with a forced render after each operation: a comparable per-removal metric. ranked metric

CPU ×1
05.01015dockview · 4: median 5.61 ms, p95 9.555.6CustomLayout · 4: median 1.03 ms, p95 1.981.040.18×dockview · 20: median 4.50 ms, p95 10.24.5CustomLayout · 20: median 3.82 ms, p95 6.033.8200.85×dockview · 50: median 0.24 ms, p95 10.10.24CustomLayout · 50: median 5.26 ms, p95 6.835.35021.7×dockview · 100: median 0.25 ms, p95 9.500.25CustomLayout · 100: median 5.65 ms, p95 9.075.710022.8×dockview · 200: median 0.27 ms, p95 8.870.27CustomLayout · 200: median 6.00 ms, p95 9.726.020022.4×ms
CPU ×4
0204060dockview · 4: median 21.6 ms, p95 39.922CustomLayout · 4: median 4.24 ms, p95 7.834.240.20×dockview · 20: median 19.1 ms, p95 41.419CustomLayout · 20: median 16.1 ms, p95 48.316200.85×dockview · 50: median 1.19 ms, p95 40.51.2CustomLayout · 50: median 21.1 ms, p95 27.7215017.7×dockview · 100: median 1.16 ms, p95 40.21.2CustomLayout · 100: median 22.3 ms, p95 41.32210019.1×dockview · 200: median 1.14 ms, p95 35.91.1CustomLayout · 200: median 23.8 ms, p95 36.82420020.8×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×15.619.550.654.051.031.980.150.770.18×not significant24
4×421.639.92.3415.84.247.830.453.200.20×not significant24
20×14.5010.20.643.063.826.030.442.850.85×not significant120
20×419.141.42.4113.516.148.31.5812.20.85×not significant120
50×10.2410.10.133.365.266.830.461.9921.7×DV faster300
50×41.1940.50.1313.221.127.71.568.2817.7×DV faster300
100×10.259.500.144.675.659.070.463.0722.8×DV faster600
100×41.1640.20.1419.122.341.31.7811.519.1×DV faster600
200×10.278.870.153.656.009.720.452.4222.4×DV faster1200
200×41.1435.90.1814.823.836.81.6910.320.8×DV faster1200
CPU ×1
01.02.03.0dockview · 4: median 0.70 ms, p95 1.390.70CustomLayout · 4: median 0.76 ms, p95 1.600.7641.09×dockview · 20: median 0.33 ms, p95 0.870.33CustomLayout · 20: median 0.62 ms, p95 1.730.62201.89×dockview · 50: median 0.13 ms, p95 0.770.13CustomLayout · 50: median 0.53 ms, p95 1.600.53504.08×dockview · 100: median 0.14 ms, p95 0.780.14CustomLayout · 100: median 0.81 ms, p95 2.460.811005.59×dockview · 200: median 0.15 ms, p95 0.640.15CustomLayout · 200: median 1.16 ms, p95 2.651.22007.77×ms
CPU ×4
05.01015dockview · 4: median 1.48 ms, p95 3.261.5CustomLayout · 4: median 1.59 ms, p95 4.351.641.07×dockview · 20: median 0.88 ms, p95 2.380.88CustomLayout · 20: median 1.55 ms, p95 4.371.6201.75×dockview · 50: median 0.52 ms, p95 2.410.52CustomLayout · 50: median 1.80 ms, p95 5.451.8503.44×dockview · 100: median 0.61 ms, p95 2.780.61CustomLayout · 100: median 3.25 ms, p95 8.503.31005.28×dockview · 200: median 0.61 ms, p95 2.600.61CustomLayout · 200: median 4.74 ms, p95 11.04.72007.80×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×10.701.390.380.360.761.600.110.551.09×parity24
4×41.483.260.550.971.594.350.051.401.07×parity24
20×10.330.870.140.270.621.730.080.461.89×not significant120
20×40.882.380.100.741.554.370.061.171.75×not significant120
50×10.130.770.050.220.531.600.050.494.08×DV faster300
50×40.522.410.040.751.805.450.051.453.44×DV faster300
100×10.140.780.040.240.812.460.050.675.59×DV faster600
100×40.612.780.030.913.258.500.052.485.28×DV faster600
200×10.150.640.040.211.162.650.050.757.77×DV faster1200
200×40.612.600.030.944.7411.00.063.197.80×DV faster1200

6Removing all N in one block remove-sequential · syncMs

All N removals in a single synchronous task. dockview updates the DOM on every removePanel, CustomLayout renders once at the end: this measures the batch cost of the API, not identical work. ranked metric

CPU ×1
0100200300dockview · 4: median 3.76 ms, p95 3.883.8CustomLayout · 4: median 2.39 ms, p95 2.532.440.64×dockview · 20: median 77.7 ms, p95 79.478CustomLayout · 20: median 5.83 ms, p95 6.275.8200.08×dockview · 50: median 87.8 ms, p95 93.188CustomLayout · 50: median 6.85 ms, p95 7.436.9500.08×dockview · 100: median 216 ms, p95 223216CustomLayout · 100: median 16.8 ms, p95 19.8171000.08×dockview · 200: median 242 ms, p95 245242CustomLayout · 200: median 26.0 ms, p95 30.4262000.11×ms
CPU ×4
05001,0001,500dockview · 4: median 15.6 ms, p95 16.116CustomLayout · 4: median 9.73 ms, p95 10.49.740.63×dockview · 20: median 325 ms, p95 364325CustomLayout · 20: median 24.7 ms, p95 27.125200.08×dockview · 50: median 361 ms, p95 400361CustomLayout · 50: median 28.2 ms, p95 29.428500.08×dockview · 100: median 887 ms, p95 982887CustomLayout · 100: median 78.4 ms, p95 89.4781000.09×dockview · 200: median 971 ms, p95 1.048971CustomLayout · 200: median 115 ms, p95 1241152000.12×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×13.763.883.670.082.392.532.240.100.64×CL faster6
4×415.616.114.40.689.7310.49.460.320.63×CL faster6
20×177.779.476.11.255.836.275.620.230.08×CL faster6
20×432536432018.124.727.124.21.120.08×CL faster6
50×187.893.182.34.746.857.436.590.350.08×CL faster6
50×436140034323.528.229.427.10.850.08×CL faster6
100×12162232133.9116.819.815.02.180.08×CL faster6
100×488798287250.978.489.462.310.60.09×CL faster6
200×12422452401.6226.030.423.72.930.11×CL faster6
200×49711,04895242.011512495.910.70.12×CL faster6
CPU ×1
0102030dockview · 4: median 1.60 ms, p95 2.021.6CustomLayout · 4: median 0.60 ms, p95 0.660.6040.38×dockview · 20: median 6.26 ms, p95 6.546.3CustomLayout · 20: median 1.13 ms, p95 1.281.1200.18×dockview · 50: median 7.32 ms, p95 7.527.3CustomLayout · 50: median 2.10 ms, p95 2.272.1500.29×dockview · 100: median 13.8 ms, p95 15.414CustomLayout · 100: median 5.22 ms, p95 5.495.21000.38×dockview · 200: median 23.2 ms, p95 24.223CustomLayout · 200: median 13.4 ms, p95 14.2132000.58×ms
CPU ×4
0255075100dockview · 4: median 3.65 ms, p95 4.903.6CustomLayout · 4: median 1.22 ms, p95 1.921.240.33×dockview · 20: median 16.5 ms, p95 20.116CustomLayout · 20: median 3.14 ms, p95 4.023.1200.19×dockview · 50: median 22.8 ms, p95 28.523CustomLayout · 50: median 6.56 ms, p95 7.106.6500.29×dockview · 100: median 54.4 ms, p95 61.954CustomLayout · 100: median 18.3 ms, p95 20.1181000.34×dockview · 200: median 91.5 ms, p95 98.392CustomLayout · 200: median 51.3 ms, p95 56.5512000.56×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×11.602.021.320.260.600.660.470.080.38×CL faster6
4×43.654.903.130.641.221.920.950.340.33×CL faster6
20×16.266.545.410.451.131.280.980.120.18×CL faster6
20×416.520.115.12.033.144.022.870.410.19×CL faster6
50×17.327.527.050.232.102.271.920.120.29×CL faster6
50×422.828.520.53.416.567.106.220.330.29×CL faster6
100×113.815.413.60.665.225.494.830.290.38×CL faster6
100×454.461.948.55.6818.320.117.80.840.34×CL faster6
200×123.224.222.90.4913.414.212.90.490.58×CL faster6
200×491.598.389.43.4951.356.550.62.500.56×CL faster6

7Adding a panel to the root add-k · syncMs

Adding 20 root groups to a tree of 4 (one at a time, median per addition). CustomLayout has no fine-grained API — the path is getLayout → helper → loadLayout, as in the app. ranked metric

CPU ×1
02.55.07.510dockview · light, 4: median 3.00 ms, p95 4.733.0CustomLayout · light, 4: median 4.09 ms, p95 5.304.1light, 41.37×dockview · heavy, 4: median 6.25 ms, p95 8.276.3CustomLayout · heavy, 4: median 6.50 ms, p95 8.166.5heavy, 41.04×ms
CPU ×4
010203040dockview · light, 4: median 4.47 ms, p95 7.694.5CustomLayout · light, 4: median 7.22 ms, p95 10.67.2light, 41.62×dockview · heavy, 4: median 24.5 ms, p95 27.725CustomLayout · heavy, 4: median 27.8 ms, p95 33.828heavy, 41.13×ms
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
light, 4×13.004.731.520.834.095.301.761.001.37×not significant120
light, 4×44.477.692.631.347.2210.63.162.201.62×not significant120
heavy, 4×16.258.275.670.766.508.165.480.871.04×parity120
heavy, 4×424.527.721.91.5927.833.821.73.961.13×not significant120

8Adding a tab to a group add-k-tab · syncMs

Adding 20 tabs to an existing group (median per addition). ranked metric

CPU ×1
02.55.07.510dockview · light, 4: median 2.04 ms, p95 3.022.0CustomLayout · light, 4: median 2.51 ms, p95 4.542.5light, 41.23×dockview · heavy, 4: median 7.79 ms, p95 8.947.8CustomLayout · heavy, 4: median 8.49 ms, p95 9.878.5heavy, 41.09×ms
CPU ×4
010203040dockview · light, 4: median 1.66 ms, p95 3.291.7CustomLayout · light, 4: median 4.80 ms, p95 6.804.8light, 42.88×dockview · heavy, 4: median 23.5 ms, p95 27.024CustomLayout · heavy, 4: median 27.5 ms, p95 31.628heavy, 41.17×ms
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
light, 4×12.043.020.790.612.514.541.430.891.23×not significant120
light, 4×41.663.290.600.724.806.803.131.012.88×DV faster120
heavy, 4×17.798.945.590.878.499.875.981.151.09×parity120
heavy, 4×423.527.021.01.7227.531.622.72.651.17×DV faster120

9Switching a tab via the API tab-switch-api · syncMs

Programmatic tab activation in a group of 20 tabs — the main "engine cost" metric for tabs. ranked metric

CPU ×1
02.04.06.08.0dockview · light, tabs-20: median 1.51 ms, p95 2.201.5CustomLayout · light, tabs-20: median 1.60 ms, p95 1.881.6light, tabs-201.05×dockview · heavy, tabs-20: median 6.76 ms, p95 7.986.8CustomLayout · heavy, tabs-20: median 5.99 ms, p95 6.726.0heavy, tabs-200.89×ms
CPU ×4
0102030dockview · light, tabs-20: median 0.78 ms, p95 1.550.78CustomLayout · light, tabs-20: median 2.72 ms, p95 3.652.7light, tabs-203.46×dockview · heavy, tabs-20: median 18.1 ms, p95 19.918CustomLayout · heavy, tabs-20: median 18.6 ms, p95 25.019heavy, tabs-201.03×ms
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
light, tabs-20×11.512.200.420.461.601.881.120.221.05×parity36
light, tabs-20×40.781.550.150.382.723.652.380.423.46×DV faster36
heavy, tabs-20×16.767.985.130.965.996.724.940.590.89×not significant36
heavy, tabs-20×418.119.916.30.9718.625.017.51.921.03×parity36

10First tab open tab-switch-first · syncMs

First activation of each tab: for CustomLayout this is a lazy panel mount, for dockview the panel is already mounted. ranked metric

CPU ×1
02.55.07.510dockview · light, tabs-20: median 0.28 ms, p95 0.410.28CustomLayout · light, tabs-20: median 1.98 ms, p95 4.512.0light, tabs-207.07×dockview · heavy, tabs-20: median 0.09 ms, p95 0.150.09CustomLayout · heavy, tabs-20: median 7.38 ms, p95 9.137.4heavy, tabs-2079.8×ms
CPU ×4
0102030dockview · light, tabs-20: median 0.05 ms, p95 0.710.05CustomLayout · light, tabs-20: median 3.73 ms, p95 5.033.7light, tabs-2083.0×dockview · heavy, tabs-20: median 0.07 ms, p95 0.790.07CustomLayout · heavy, tabs-20: median 23.6 ms, p95 27.924heavy, tabs-20337.4×ms
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
light, tabs-20×10.280.410.120.081.984.511.200.937.07×DV faster114
light, tabs-20×40.050.710.020.233.735.032.270.7283.0×DV faster114
heavy, tabs-20×10.090.150.060.037.389.136.700.6979.8×DV faster114
heavy, tabs-20×40.070.790.040.2723.627.921.81.91337.4×DV faster114

11Tab click (visible latency) tab-switch-warm · readyMs

A real pointerdown → pointerup → click sequence. dockview defers activation by one rAF, so readyMs ≈ one frame. This is frame latency, not engine work. reference metric

CPU ×1
0102030dockview · light, tabs-20: median 17.5 ms, p95 19.117CustomLayout · light, tabs-20: median 1.60 ms, p95 1.911.6light, tabs-200.09×dockview · heavy, tabs-20: median 24.6 ms, p95 26.925CustomLayout · heavy, tabs-20: median 6.31 ms, p95 6.676.3heavy, tabs-200.26×ms
CPU ×4
010203040dockview · light, tabs-20: median 17.6 ms, p95 18.918CustomLayout · light, tabs-20: median 3.00 ms, p95 3.773.0light, tabs-200.17×dockview · heavy, tabs-20: median 34.2 ms, p95 36.434CustomLayout · heavy, tabs-20: median 19.2 ms, p95 23.419heavy, tabs-200.56×ms
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
light, tabs-20×117.519.115.90.871.601.911.230.190.09×CL faster36
light, tabs-20×417.618.914.81.003.003.772.140.430.17×CL faster36
heavy, tabs-20×124.626.915.62.326.316.675.110.410.26×CL faster36
heavy, tabs-20×434.236.427.61.8219.223.417.21.830.56×CL faster36

12Splitter drag: step splitter-drag · stepMs

Synthetic splitter movement: 40 steps of 6 px, synchronous processing time per step. ranked metric

CPU ×1
01.02.03.0dockview · 4: median 0.25 ms, p95 0.370.25CustomLayout · 4: median 0.51 ms, p95 0.760.5142.05×dockview · 20: median 0.29 ms, p95 0.420.29CustomLayout · 20: median 0.62 ms, p95 0.730.62202.16×dockview · 50: median 0.23 ms, p95 0.320.23CustomLayout · 50: median 0.82 ms, p95 0.940.82503.57×dockview · 100: median 0.37 ms, p95 0.490.37CustomLayout · 100: median 1.42 ms, p95 1.571.41003.85×dockview · 200: median 0.42 ms, p95 0.580.42CustomLayout · 200: median 1.99 ms, p95 2.202.02004.73×ms
CPU ×4
05.01015dockview · 4: median 0.23 ms, p95 1.070.23CustomLayout · 4: median 1.27 ms, p95 2.281.345.58×dockview · 20: median 0.88 ms, p95 1.490.88CustomLayout · 20: median 2.66 ms, p95 3.742.7203.01×dockview · 50: median 0.94 ms, p95 1.630.94CustomLayout · 50: median 3.37 ms, p95 4.293.4503.57×dockview · 100: median 2.09 ms, p95 2.802.1CustomLayout · 100: median 6.51 ms, p95 7.556.51003.11×dockview · 200: median 2.39 ms, p95 3.082.4CustomLayout · 200: median 9.51 ms, p95 10.89.52003.97×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×10.250.370.130.060.510.760.290.142.05×DV faster960
4×40.231.070.090.341.272.280.250.505.58×DV faster960
20×10.290.420.150.070.620.730.520.052.16×DV faster960
20×40.881.490.150.372.663.741.470.783.01×DV faster960
50×10.230.320.150.040.820.940.670.093.57×DV faster960
50×40.941.630.140.383.374.292.240.503.57×DV faster960
100×10.370.490.320.271.421.571.290.293.85×DV faster960
100×42.092.800.980.416.517.555.240.743.11×DV faster960
200×10.420.580.330.671.992.201.810.124.73×DV faster960
200×42.393.080.670.439.5110.87.770.933.97×DV faster960
CPU ×1
01.02.03.04.0dockview · 4: median 0.60 ms, p95 0.960.60CustomLayout · 4: median 0.68 ms, p95 1.730.6841.12×dockview · 20: median 0.53 ms, p95 1.300.53CustomLayout · 20: median 0.87 ms, p95 2.070.87201.64×dockview · 50: median 0.37 ms, p95 0.530.37CustomLayout · 50: median 1.09 ms, p95 1.681.1502.99×dockview · 100: median 0.57 ms, p95 0.700.57CustomLayout · 100: median 1.92 ms, p95 2.621.91003.38×dockview · 200: median 0.58 ms, p95 0.720.58CustomLayout · 200: median 2.59 ms, p95 3.242.62004.42×ms
CPU ×4
02.04.06.08.0dockview · 4: median 0.12 ms, p95 0.900.12CustomLayout · 4: median 0.58 ms, p95 1.510.5844.81×dockview · 20: median 0.30 ms, p95 1.130.30CustomLayout · 20: median 1.48 ms, p95 2.781.5204.88×dockview · 50: median 0.72 ms, p95 1.280.72CustomLayout · 50: median 2.20 ms, p95 3.492.2503.08×dockview · 100: median 1.89 ms, p95 2.671.9CustomLayout · 100: median 4.21 ms, p95 5.404.21002.23×dockview · 200: median 2.03 ms, p95 2.762.0CustomLayout · 200: median 6.29 ms, p95 7.926.32003.10×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×10.600.960.180.230.681.730.300.461.12×not significant960
4×40.120.900.060.300.581.510.140.444.81×not significant960
20×10.531.300.220.340.872.070.470.411.64×not significant960
20×40.301.130.110.351.482.780.650.584.88×DV faster960
50×10.370.530.260.081.091.680.870.302.99×DV faster960
50×40.721.280.130.352.203.491.430.553.08×DV faster960
100×10.570.700.380.091.922.621.440.303.38×DV faster960
100×41.892.670.660.724.215.403.180.542.23×DV faster960
200×10.580.720.380.072.593.242.020.294.42×DV faster960
200×42.032.760.670.616.297.925.140.733.10×DV faster960

13Splitter drag: release splitter-drag · commitMs

Splitter release: committing sizes and the final repaint. ranked metric

CPU ×1
0204060dockview · 4: median 13.8 ms, p95 15.114CustomLayout · 4: median 0.68 ms, p95 0.990.6840.05×dockview · 20: median 24.4 ms, p95 26.124CustomLayout · 20: median 0.79 ms, p95 0.880.79200.03×dockview · 50: median 23.4 ms, p95 24.023CustomLayout · 50: median 1.09 ms, p95 1.141.1500.05×dockview · 100: median 45.2 ms, p95 46.145CustomLayout · 100: median 1.72 ms, p95 1.961.71000.04×dockview · 200: median 46.9 ms, p95 48.547CustomLayout · 200: median 2.52 ms, p95 2.802.52000.05×ms
CPU ×4
050100150200dockview · 4: median 32.9 ms, p95 33.733CustomLayout · 4: median 2.04 ms, p95 3.072.040.06×dockview · 20: median 83.9 ms, p95 90.484CustomLayout · 20: median 3.76 ms, p95 16.43.8200.04×dockview · 50: median 85.0 ms, p95 93.785CustomLayout · 50: median 4.45 ms, p95 5.614.5500.05×dockview · 100: median 176 ms, p95 182176CustomLayout · 100: median 8.42 ms, p95 10.08.41000.05×dockview · 200: median 185 ms, p95 189185CustomLayout · 200: median 12.2 ms, p95 13.0122000.07×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×113.815.112.60.730.680.990.470.200.05×CL faster12
4×432.933.732.20.482.043.071.380.470.06×CL faster12
20×124.426.121.81.060.790.880.720.050.03×CL faster12
20×483.990.482.12.693.7616.42.773.690.04×CL faster12
50×123.424.020.91.031.091.140.940.070.05×CL faster12
50×485.093.783.72.704.455.613.970.480.05×CL faster12
100×145.246.144.00.631.721.961.660.100.04×CL faster12
100×41761821723.448.4210.07.540.700.05×CL faster12
200×146.948.545.80.742.522.802.360.130.05×CL faster12
200×41851891783.8712.213.010.70.780.07×CL faster12
CPU ×1
02.04.06.0dockview · 4: median 1.14 ms, p95 1.621.1CustomLayout · 4: median 1.15 ms, p95 2.101.141.00×dockview · 20: median 2.00 ms, p95 2.952.0CustomLayout · 20: median 1.46 ms, p95 3.221.5200.73×dockview · 50: median 2.23 ms, p95 2.552.2CustomLayout · 50: median 1.64 ms, p95 2.291.6500.74×dockview · 100: median 2.82 ms, p95 2.932.8CustomLayout · 100: median 2.82 ms, p95 3.462.81001.00×dockview · 200: median 4.03 ms, p95 4.244.0CustomLayout · 200: median 3.60 ms, p95 4.863.62000.89×ms
CPU ×4
05.0101520dockview · 4: median 1.03 ms, p95 1.581.0CustomLayout · 4: median 1.34 ms, p95 1.831.341.30×dockview · 20: median 2.74 ms, p95 3.252.7CustomLayout · 20: median 2.55 ms, p95 3.872.6200.93×dockview · 50: median 4.11 ms, p95 4.834.1CustomLayout · 50: median 3.89 ms, p95 4.963.9500.95×dockview · 100: median 9.85 ms, p95 10.39.9CustomLayout · 100: median 5.85 ms, p95 6.885.81000.59×dockview · 200: median 14.4 ms, p95 15.714CustomLayout · 200: median 9.24 ms, p95 11.19.22000.64×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×11.141.620.840.251.152.100.590.501.00×parity12
4×41.031.580.650.311.341.830.970.261.30×not significant12
20×12.002.950.900.611.463.221.050.560.73×not significant12
20×42.743.252.340.272.553.872.030.630.93×parity12
50×12.232.551.740.271.642.291.530.230.74×CL faster12
50×44.114.833.670.293.894.963.320.540.95×parity12
100×12.822.932.570.092.823.462.430.341.00×parity12
100×49.8510.38.930.485.856.885.260.480.59×CL faster12
200×14.034.243.720.163.604.863.400.380.89×CL faster12
200×414.415.713.60.559.2411.18.070.780.64×CL faster12

14Real drag (CDP mouse) splitter-drag-trusted · frameMs

Trusted mouse events via CDP Input; median frame interval during the drag. 16.7 ms = 60 fps, 33 ms = 30 fps. reference metric

CPU ×1
05.0101520dockview · 4: median 16.7 ms, p95 16.717CustomLayout · 4: median 16.7 ms, p95 16.71741.00×dockview · 20: median 16.7 ms, p95 16.717CustomLayout · 20: median 16.7 ms, p95 16.717201.00×dockview · 50: median 16.7 ms, p95 16.717CustomLayout · 50: median 16.7 ms, p95 16.717501.00×dockview · 100: median 16.7 ms, p95 16.717CustomLayout · 100: median 16.7 ms, p95 16.7171001.00×dockview · 200: median 16.7 ms, p95 16.717CustomLayout · 200: median 16.7 ms, p95 16.7172001.00×ms
CPU ×4
020406080dockview · 4: median 16.7 ms, p95 16.717CustomLayout · 4: median 16.7 ms, p95 16.71741.00×dockview · 20: median 16.7 ms, p95 33.317CustomLayout · 20: median 25.0 ms, p95 33.325201.50×dockview · 50: median 16.7 ms, p95 33.317CustomLayout · 50: median 25.0 ms, p95 33.325501.50×dockview · 100: median 50.0 ms, p95 66.750CustomLayout · 100: median 33.3 ms, p95 66.7331000.67×dockview · 200: median 50.0 ms, p95 66.750CustomLayout · 200: median 33.3 ms, p95 66.7332000.67×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×116.716.716.70.0016.716.716.70.001.00×parity486
4×416.716.716.72.3616.716.716.70.001.00×parity985
20×116.716.716.70.0016.716.716.70.001.00×parity504
20×416.733.316.710.325.033.316.78.341.50×not significant1116
50×116.716.716.70.0016.716.716.70.001.00×parity504
50×416.733.316.711.725.033.316.79.421.50×not significant1354
100×116.716.716.72.5816.716.716.71.081.00×parity998
100×450.066.716.723.833.366.716.724.70.67×not significant1390
200×116.716.716.73.3316.716.716.70.541.00×parity995
200×450.066.716.725.133.366.716.725.00.67×not significant1401
CPU ×1
05.0101520dockview · 4: median 16.7 ms, p95 16.717CustomLayout · 4: median 16.7 ms, p95 16.71741.00×dockview · 20: median 16.7 ms, p95 16.717CustomLayout · 20: median 16.7 ms, p95 16.717201.00×dockview · 50: median 16.7 ms, p95 16.717CustomLayout · 50: median 16.7 ms, p95 16.717501.00×dockview · 100: median 16.7 ms, p95 16.717CustomLayout · 100: median 16.7 ms, p95 16.7171001.00×dockview · 200: median 16.7 ms, p95 16.717CustomLayout · 200: median 16.7 ms, p95 16.7172001.00×ms
CPU ×4
010203040dockview · 4: median 16.7 ms, p95 16.717CustomLayout · 4: median 16.7 ms, p95 16.71741.00×dockview · 20: median 16.7 ms, p95 16.717CustomLayout · 20: median 16.7 ms, p95 16.717201.00×dockview · 50: median 16.7 ms, p95 16.717CustomLayout · 50: median 16.7 ms, p95 16.717501.00×dockview · 100: median 16.7 ms, p95 33.317CustomLayout · 100: median 16.7 ms, p95 16.7171001.00×dockview · 200: median 16.7 ms, p95 33.317CustomLayout · 200: median 16.7 ms, p95 16.7172001.00×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×116.716.716.71.0716.716.716.70.761.00×parity482
4×416.716.716.71.6916.716.716.70.761.00×parity485
20×116.716.716.70.0016.716.716.70.001.00×parity480
20×416.716.716.70.0016.716.716.70.001.00×parity480
50×116.716.716.70.0016.716.716.70.001.00×parity480
50×416.716.716.70.0016.716.716.70.001.00×parity674
100×116.716.716.70.0016.716.716.70.001.00×parity481
100×416.733.316.77.0816.716.716.70.631.00×parity1012
200×116.716.716.70.0016.716.716.70.001.00×parity481
200×416.733.316.76.9616.716.716.70.931.00×parity1077

15Real drag: dropped frames splitter-drag-trusted · droppedFrames

Number of dropped frames per drag (median). reference metric

CPU ×1
01.02.03.0dockview · 4: median 0 frames, p95 00CustomLayout · 4: median 0 frames, p95 0041.00×dockview · 20: median 0 frames, p95 00CustomLayout · 20: median 0 frames, p95 00201.00×dockview · 50: median 0 frames, p95 00CustomLayout · 50: median 0 frames, p95 00501.00×dockview · 100: median 1 frame, p95 11.0CustomLayout · 100: median 0.5 frames, p95 10.501000.50×dockview · 200: median 1.5 frames, p95 31.5CustomLayout · 200: median 0 frames, p95 10200<0.01×frames
CPU ×4
050100150200dockview · 4: median 2.5 frames, p95 32.5CustomLayout · 4: median 0 frames, p95 004<0.01×dockview · 20: median 39 frames, p95 4839CustomLayout · 20: median 80.5 frames, p95 8181202.06×dockview · 50: median 88.5 frames, p95 9889CustomLayout · 50: median 82 frames, p95 9082500.93×dockview · 100: median 184.5 frames, p95 191185CustomLayout · 100: median 83.5 frames, p95 91841000.45×dockview · 200: median 185 frames, p95 194185CustomLayout · 200: median 88.5 frames, p95 90892000.48×frames
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×1000000001.00×parity6
4×42.5320.50000<0.01×CL faster6
20×1000000001.00×parity6
20×439482010.380.581800.52.06×DV faster6
50×1000000001.00×parity6
50×488.598825.38290813.40.93×parity6
100×111100.5100.50.50×not significant6
100×4184.51911774.783.591823.40.45×CL faster6
200×11.5310.80100.4<0.01×CL faster6
200×41851941834.388.590852.00.48×CL faster6
CPU ×1
00.250.500.751.0dockview · 4: median 0.5 frames, p95 10.50CustomLayout · 4: median 0 frames, p95 104<0.01×dockview · 20: median 0 frames, p95 00CustomLayout · 20: median 0 frames, p95 00201.00×dockview · 50: median 0 frames, p95 00CustomLayout · 50: median 0 frames, p95 00501.00×dockview · 100: median 0 frames, p95 00CustomLayout · 100: median 0 frames, p95 001001.00×dockview · 200: median 0 frames, p95 00CustomLayout · 200: median 0 frames, p95 002001.00×frames
CPU ×4
0204060dockview · 4: median 0.5 frames, p95 10.50CustomLayout · 4: median 0 frames, p95 104<0.01×dockview · 20: median 0 frames, p95 00CustomLayout · 20: median 0 frames, p95 00201.00×dockview · 50: median 0 frames, p95 00CustomLayout · 50: median 0 frames, p95 00501.00×dockview · 100: median 39 frames, p95 4139CustomLayout · 100: median 0 frames, p95 10100<0.01×dockview · 200: median 40 frames, p95 4240CustomLayout · 200: median 0.5 frames, p95 10.502000.01×frames
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×10.5100.50100.4<0.01×not significant6
4×40.5100.50100.4<0.01×not significant6
20×1000000001.00×parity6
20×4000000001.00×parity6
50×1000000001.00×parity6
50×4000000001.00×parity6
100×1000000001.00×parity6
100×43941371.40100.4<0.01×CL faster6
200×1000000001.00×parity6
200×44042372.00.5100.50.01×CL faster6

16Container resize (forced layout) resize-forced · syncMs

Resizing the stage with an explicit layout call — isolates the layout cost. ranked metric

CPU ×1
00.501.01.5dockview · 4: median 0.29 ms, p95 0.370.29CustomLayout · 4: median 0.18 ms, p95 0.240.1840.64×dockview · 20: median 0.39 ms, p95 0.530.39CustomLayout · 20: median 0.25 ms, p95 0.340.25200.65×dockview · 50: median 0.49 ms, p95 0.610.49CustomLayout · 50: median 0.25 ms, p95 0.290.25500.51×dockview · 100: median 0.85 ms, p95 1.100.85CustomLayout · 100: median 0.45 ms, p95 0.540.451000.53×dockview · 200: median 0.92 ms, p95 1.050.92CustomLayout · 200: median 0.47 ms, p95 0.560.472000.51×ms
CPU ×4
02.04.06.0dockview · 4: median 1.14 ms, p95 1.491.1CustomLayout · 4: median 0.68 ms, p95 1.080.6840.60×dockview · 20: median 1.63 ms, p95 2.441.6CustomLayout · 20: median 1.06 ms, p95 1.611.1200.65×dockview · 50: median 1.84 ms, p95 2.461.8CustomLayout · 50: median 1.06 ms, p95 1.681.1500.57×dockview · 100: median 3.56 ms, p95 3.883.6CustomLayout · 100: median 2.05 ms, p95 2.792.01000.57×dockview · 200: median 3.88 ms, p95 4.633.9CustomLayout · 200: median 1.95 ms, p95 2.721.92000.50×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×10.290.370.170.050.180.240.130.030.64×CL faster36
4×41.141.490.230.320.681.080.100.330.60×CL faster36
20×10.390.530.310.060.250.340.210.040.65×CL faster36
20×41.632.440.650.381.061.610.230.330.65×not significant36
50×10.490.610.410.060.250.290.220.020.51×CL faster36
50×41.842.461.020.361.061.680.600.320.57×CL faster36
100×10.851.100.690.150.450.540.320.050.53×CL faster36
100×43.563.882.780.322.052.791.410.380.57×CL faster36
200×10.921.050.760.090.470.560.390.040.51×CL faster36
200×43.884.632.950.471.952.721.080.380.50×CL faster36
CPU ×1
00.501.01.5dockview · 4: median 0.50 ms, p95 1.380.50CustomLayout · 4: median 0.43 ms, p95 0.750.4340.86×dockview · 20: median 0.60 ms, p95 1.100.60CustomLayout · 20: median 0.43 ms, p95 1.290.43200.72×dockview · 50: median 0.62 ms, p95 0.910.62CustomLayout · 50: median 0.39 ms, p95 0.510.39500.63×dockview · 100: median 1.07 ms, p95 1.411.1CustomLayout · 100: median 0.75 ms, p95 0.960.751000.70×dockview · 200: median 0.97 ms, p95 1.280.97CustomLayout · 200: median 0.70 ms, p95 0.920.702000.72×ms
CPU ×4
02.04.06.0dockview · 4: median 0.85 ms, p95 1.200.85CustomLayout · 4: median 0.43 ms, p95 0.950.4340.51×dockview · 20: median 1.43 ms, p95 2.171.4CustomLayout · 20: median 0.95 ms, p95 1.540.95200.66×dockview · 50: median 1.88 ms, p95 2.471.9CustomLayout · 50: median 1.07 ms, p95 1.671.1500.57×dockview · 100: median 3.39 ms, p95 4.163.4CustomLayout · 100: median 1.90 ms, p95 2.311.91000.56×dockview · 200: median 3.71 ms, p95 4.363.7CustomLayout · 200: median 1.84 ms, p95 2.271.82000.49×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×10.501.380.230.340.430.750.140.200.86×not significant36
4×40.851.200.150.270.430.950.080.310.51×CL faster36
20×10.601.100.390.220.431.290.330.270.72×not significant36
20×41.432.170.910.380.951.540.180.350.66×CL faster36
50×10.620.910.460.110.390.510.290.060.63×CL faster36
50×41.882.470.900.421.071.670.180.310.57×CL faster36
100×11.071.410.780.190.750.960.590.110.70×CL faster36
100×43.394.162.250.461.902.311.050.320.56×CL faster36
200×10.971.280.750.130.700.920.520.100.72×CL faster36
200×43.714.362.990.441.842.271.020.360.49×CL faster36

17Resize (via ResizeObserver) resize-observed · readyMs

Resize observer only. dockview does ResizeObserver → rAF → layout, so its readyMs includes a frame of waiting. Do not rank — read together with framesToSettle. reference metric

CPU ×1
010203040dockview · 4: median 22.1 ms, p95 24.922CustomLayout · 4: median 0.16 ms, p95 0.230.164<0.01×dockview · 20: median 24.6 ms, p95 31.925CustomLayout · 20: median 0.24 ms, p95 0.290.2420<0.01×dockview · 50: median 23.6 ms, p95 29.124CustomLayout · 50: median 0.25 ms, p95 0.370.25500.01×dockview · 100: median 31.4 ms, p95 33.731CustomLayout · 100: median 0.45 ms, p95 0.550.451000.01×dockview · 200: median 30.4 ms, p95 35.630CustomLayout · 200: median 0.47 ms, p95 0.590.472000.02×ms
CPU ×4
050100150200dockview · 4: median 31.8 ms, p95 34.632CustomLayout · 4: median 0.52 ms, p95 1.040.5240.02×dockview · 20: median 45.4 ms, p95 79.745CustomLayout · 20: median 1.03 ms, p95 1.561.0200.02×dockview · 50: median 58.4 ms, p95 88.958CustomLayout · 50: median 1.25 ms, p95 1.771.2500.02×dockview · 100: median 99.0 ms, p95 15199CustomLayout · 100: median 2.13 ms, p95 2.652.11000.02×dockview · 200: median 111 ms, p95 153111CustomLayout · 200: median 1.90 ms, p95 2.881.92000.02×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×122.124.920.21.340.160.230.120.03<0.01×CL faster36
4×431.834.629.81.340.521.040.090.400.02×CL faster36
20×124.631.922.52.380.240.290.190.02<0.01×CL faster36
20×445.479.741.914.01.031.560.250.320.02×CL faster36
50×123.629.121.72.210.250.370.210.040.01×CL faster36
50×458.488.937.417.11.251.770.600.330.02×CL faster36
100×131.433.722.22.840.450.550.360.050.01×CL faster36
100×499.015183.021.52.132.651.230.370.02×CL faster36
200×130.435.622.63.780.470.590.360.060.02×CL faster36
200×411115391.021.61.902.881.070.460.02×CL faster36
CPU ×1
0102030dockview · 4: median 18.7 ms, p95 20.819CustomLayout · 4: median 0.32 ms, p95 0.900.3240.02×dockview · 20: median 18.3 ms, p95 20.518CustomLayout · 20: median 0.40 ms, p95 1.000.40200.02×dockview · 50: median 18.7 ms, p95 19.819CustomLayout · 50: median 0.44 ms, p95 0.580.44500.02×dockview · 100: median 19.4 ms, p95 20.819CustomLayout · 100: median 0.75 ms, p95 0.940.751000.04×dockview · 200: median 19.8 ms, p95 21.320CustomLayout · 200: median 0.71 ms, p95 0.880.712000.04×ms
CPU ×4
0204060dockview · 4: median 18.1 ms, p95 19.618CustomLayout · 4: median 0.28 ms, p95 0.990.2840.02×dockview · 20: median 19.6 ms, p95 21.420CustomLayout · 20: median 0.94 ms, p95 1.350.94200.05×dockview · 50: median 20.0 ms, p95 22.420CustomLayout · 50: median 0.89 ms, p95 1.450.89500.04×dockview · 100: median 20.6 ms, p95 23.921CustomLayout · 100: median 1.77 ms, p95 2.361.81000.09×dockview · 200: median 25.4 ms, p95 41.425CustomLayout · 200: median 1.83 ms, p95 2.411.82000.07×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×118.720.815.51.370.320.900.150.230.02×CL faster36
4×418.119.616.60.810.280.990.080.320.02×CL faster36
20×118.320.516.11.150.401.000.320.220.02×CL faster36
20×419.621.417.90.880.941.350.160.350.05×CL faster36
50×118.719.816.80.950.440.580.300.070.02×CL faster36
50×420.022.412.01.650.891.450.210.280.04×CL faster36
100×119.420.817.70.840.750.940.580.100.04×CL faster36
100×420.623.917.91.771.772.361.110.330.09×CL faster36
200×119.821.317.11.020.710.880.550.100.04×CL faster36
200×425.441.417.54.551.832.411.060.380.07×CL faster36

18Moving a panel between groups move · syncMs

Moving a panel to another group. In CustomLayout: getLayout → moveItemToStack → loadLayout. ranked metric

CPU ×1
05.01015dockview · 20: median 9.78 ms, p95 10.69.8CustomLayout · 20: median 9.64 ms, p95 10.59.6200.99×dockview · 50: median 10.1 ms, p95 10.710CustomLayout · 50: median 10.9 ms, p95 12.211501.09×dockview · 100: median 10.1 ms, p95 10.610CustomLayout · 100: median 11.8 ms, p95 12.4121001.17×dockview · 200: median 10.2 ms, p95 10.710CustomLayout · 200: median 12.6 ms, p95 13.4132001.23×ms
CPU ×4
020406080dockview · 20: median 37.9 ms, p95 40.838CustomLayout · 20: median 37.9 ms, p95 42.238201.00×dockview · 50: median 38.6 ms, p95 41.939CustomLayout · 50: median 42.3 ms, p95 62.642501.09×dockview · 100: median 40.9 ms, p95 43.941CustomLayout · 100: median 46.0 ms, p95 73.6461001.12×dockview · 200: median 40.5 ms, p95 43.341CustomLayout · 200: median 49.9 ms, p95 52.4502001.23×ms
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
20×19.7810.68.810.549.6410.58.880.480.99×parity36
20×437.940.834.11.7137.942.235.63.521.00×parity36
50×110.110.79.020.4910.912.29.880.581.09×parity36
50×438.641.935.54.6642.362.639.36.581.09×parity36
100×110.110.69.740.2411.812.411.10.341.17×DV faster36
100×440.943.938.71.4746.073.642.67.451.12×DV faster36
200×110.210.79.780.2212.613.411.60.501.23×DV faster36
200×440.543.338.41.2949.952.445.11.561.23×DV faster36
CPU ×1
02.04.06.08.0dockview · 20: median 2.03 ms, p95 3.242.0CustomLayout · 20: median 2.53 ms, p95 3.032.5201.25×dockview · 50: median 1.60 ms, p95 3.301.6CustomLayout · 50: median 3.47 ms, p95 3.983.5502.18×dockview · 100: median 1.23 ms, p95 1.501.2CustomLayout · 100: median 4.79 ms, p95 5.924.81003.88×dockview · 200: median 1.34 ms, p95 1.941.3CustomLayout · 200: median 5.74 ms, p95 6.775.72004.27×ms
CPU ×4
05.0101520dockview · 20: median 2.07 ms, p95 3.082.1CustomLayout · 20: median 5.37 ms, p95 6.935.4202.59×dockview · 50: median 2.78 ms, p95 3.612.8CustomLayout · 50: median 7.65 ms, p95 9.357.6502.75×dockview · 100: median 3.10 ms, p95 3.993.1CustomLayout · 100: median 10.6 ms, p95 11.8111003.42×dockview · 200: median 3.75 ms, p95 4.863.7CustomLayout · 200: median 14.6 ms, p95 15.7152003.90×ms
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
20×12.033.240.990.692.533.032.030.301.25×not significant36
20×42.073.081.010.455.376.933.901.082.59×DV faster36
50×11.603.301.100.713.473.982.670.362.18×DV faster36
50×42.783.611.860.527.659.356.130.762.75×DV faster36
100×11.231.500.890.254.795.923.640.573.88×DV faster36
100×43.103.992.180.4410.611.89.100.893.42×DV faster36
200×11.341.941.090.285.746.774.500.684.27×DV faster36
200×43.754.862.360.5314.615.712.60.753.90×DV faster36

19Serialization serialize · serializeUs

toJSON() / getLayout(), microseconds per call (300 calls per measurement). getLayout makes a deep copy. ranked metric

CPU ×1
050100150dockview · 4: median 0.86 µs, p95 1.220.86CustomLayout · 4: median 8.25 µs, p95 9.258.349.61×dockview · 20: median 1.82 µs, p95 2.051.8CustomLayout · 20: median 17.6 µs, p95 18.218209.67×dockview · 50: median 3.01 µs, p95 3.603.0CustomLayout · 50: median 33.4 µs, p95 36.5335011.1×dockview · 100: median 6.07 µs, p95 7.326.1CustomLayout · 100: median 66.7 µs, p95 70.16710011.0×dockview · 200: median 11.0 µs, p95 17.611CustomLayout · 200: median 115 µs, p95 12011520010.5×µs
CPU ×4
0200400600dockview · 4: median 2.17 µs, p95 3.522.2CustomLayout · 4: median 24.3 µs, p95 26.724411.2×dockview · 20: median 6.16 µs, p95 9.836.2CustomLayout · 20: median 71.0 µs, p95 79.8712011.5×dockview · 50: median 11.8 µs, p95 54.312CustomLayout · 50: median 130 µs, p95 1411305011.0×dockview · 100: median 23.0 µs, p95 28.623CustomLayout · 100: median 259 µs, p95 27625910011.3×dockview · 200: median 41.5 µs, p95 54.741CustomLayout · 200: median 452 µs, p95 47445220010.9×µs
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×10.861.220.720.138.259.257.200.579.61×DV faster36
4×42.173.520.551.0324.326.722.91.2511.2×DV faster36
20×11.822.051.580.1517.618.217.10.399.67×DV faster36
20×46.169.833.431.5771.079.869.02.3711.5×DV faster36
50×13.013.602.750.8133.436.531.51.3811.1×DV faster36
50×411.854.39.0714.21301411254.5711.0×DV faster36
100×16.077.325.420.4966.770.164.31.4311.0×DV faster36
100×423.028.620.62.342592762497.5311.3×DV faster36
200×111.017.610.61.911151201131.8310.5×DV faster36
200×441.554.739.34.2145247443211.610.9×DV faster36
CPU ×1
050100150dockview · 4: median 1.08 µs, p95 3.221.1CustomLayout · 4: median 9.82 µs, p95 14.19.849.07×dockview · 20: median 2.43 µs, p95 3.272.4CustomLayout · 20: median 19.3 µs, p95 23.219207.92×dockview · 50: median 3.46 µs, p95 4.333.5CustomLayout · 50: median 33.5 µs, p95 37.434509.69×dockview · 100: median 6.15 µs, p95 7.356.2CustomLayout · 100: median 67.2 µs, p95 69.96710010.9×dockview · 200: median 10.8 µs, p95 12.311CustomLayout · 200: median 116 µs, p95 11811620010.7×µs
CPU ×4
0200400600dockview · 4: median 1.87 µs, p95 3.181.9CustomLayout · 4: median 24.7 µs, p95 25.825413.2×dockview · 20: median 6.23 µs, p95 8.206.2CustomLayout · 20: median 70.5 µs, p95 72.3712011.3×dockview · 50: median 10.8 µs, p95 13.611CustomLayout · 50: median 130 µs, p95 1371305012.1×dockview · 100: median 23.1 µs, p95 29.923CustomLayout · 100: median 262 µs, p95 27326210011.4×dockview · 200: median 42.3 µs, p95 80.842CustomLayout · 200: median 459 µs, p95 47645920010.9×µs
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×11.083.220.680.679.8214.16.452.219.07×DV faster36
4×41.873.180.531.0324.725.823.00.7413.2×DV faster36
20×12.433.272.020.3519.323.217.71.707.92×DV faster36
20×46.238.203.671.1170.572.367.81.2011.3×DV faster36
50×13.464.333.130.3533.537.431.61.389.69×DV faster36
50×410.813.68.031.671301371272.5612.1×DV faster36
100×16.157.355.870.4867.269.965.51.0110.9×DV faster36
100×423.129.921.42.882622732525.7211.4×DV faster36
200×110.812.310.40.571161181131.2310.7×DV faster36
200×442.380.839.118.54594764439.7310.9×DV faster36

20Serialization + JSON.stringify serialize-stringify · serializeUs

Same, plus JSON.stringify of the result. reference metric

CPU ×1
050100150dockview · 4: median 1.98 µs, p95 2.722.0CustomLayout · 4: median 8.95 µs, p95 9.639.044.51×dockview · 20: median 9.48 µs, p95 10.89.5CustomLayout · 20: median 19.9 µs, p95 20.420202.10×dockview · 50: median 16.1 µs, p95 23.816CustomLayout · 50: median 36.5 µs, p95 37.936502.27×dockview · 100: median 31.7 µs, p95 33.732CustomLayout · 100: median 72.9 µs, p95 74.7731002.30×dockview · 200: median 56.9 µs, p95 59.557CustomLayout · 200: median 125 µs, p95 1271252002.20×µs
CPU ×4
0200400600dockview · 4: median 5.90 µs, p95 7.525.9CustomLayout · 4: median 27.5 µs, p95 29.32844.66×dockview · 20: median 33.8 µs, p95 39.234CustomLayout · 20: median 78.8 µs, p95 83.379202.33×dockview · 50: median 65.5 µs, p95 96.665CustomLayout · 50: median 141 µs, p95 152141502.15×dockview · 100: median 128 µs, p95 136128CustomLayout · 100: median 283 µs, p95 3062831002.21×dockview · 200: median 226 µs, p95 233226CustomLayout · 200: median 499 µs, p95 5244992002.21×µs
Table: heavy panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×11.982.721.530.288.959.637.900.514.51×DV faster36
4×45.907.523.571.0427.529.324.31.194.66×DV faster36
20×19.4810.88.700.6219.920.418.90.442.10×DV faster36
20×433.839.231.02.1978.883.375.22.092.33×DV faster36
50×116.123.815.23.1536.537.935.10.622.27×DV faster36
50×465.596.660.310.51411521374.002.15×DV faster36
100×131.733.730.80.9472.974.771.01.102.30×DV faster36
100×41281361234.032833062749.732.21×DV faster36
200×156.959.555.60.821251271233.572.20×DV faster36
200×42262332163.9149952447416.32.21×DV faster36
CPU ×1
050100150dockview · 4: median 2.47 µs, p95 6.952.5CustomLayout · 4: median 10.4 µs, p95 12.21044.20×dockview · 20: median 13.2 µs, p95 15.613CustomLayout · 20: median 20.7 µs, p95 24.221201.57×dockview · 50: median 19.6 µs, p95 21.620CustomLayout · 50: median 36.8 µs, p95 38.837501.88×dockview · 100: median 31.4 µs, p95 35.631CustomLayout · 100: median 73.4 µs, p95 75.1731002.33×dockview · 200: median 57.0 µs, p95 60.157CustomLayout · 200: median 126 µs, p95 1271262002.20×µs
CPU ×4
0200400600dockview · 4: median 6.25 µs, p95 8.036.3CustomLayout · 4: median 27.4 µs, p95 28.52744.38×dockview · 20: median 33.9 µs, p95 37.734CustomLayout · 20: median 78.2 µs, p95 84.178202.31×dockview · 50: median 63.7 µs, p95 69.464CustomLayout · 50: median 145 µs, p95 151145502.28×dockview · 100: median 126 µs, p95 136126CustomLayout · 100: median 288 µs, p95 3002881002.28×dockview · 200: median 227 µs, p95 236227CustomLayout · 200: median 496 µs, p95 5214962002.18×µs
Table: light panels
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
4×12.476.951.521.4010.412.26.882.004.20×DV faster36
4×46.258.033.431.2727.428.525.51.044.38×DV faster36
20×113.215.611.31.1120.724.219.21.461.57×DV faster36
20×433.937.732.01.5378.284.174.92.532.31×DV faster36
50×119.621.618.70.8536.838.835.70.881.88×DV faster36
50×463.769.459.93.051451511393.162.28×DV faster36
100×131.435.630.51.4873.475.171.90.832.33×DV faster36
100×41261361204.002883002766.482.28×DV faster36
200×157.060.155.61.391261271231.102.20×DV faster36
200×42272362197.1949652148411.12.18×DV faster36

21Mount/unmount cycles mount-cycles · cycleMs

8 cycles of "mount 50 panels → unmount the whole engine", two rounds per pass with alternating engine order. ranked metric

CPU ×1
0100200300dockview · light, 50: median 133 ms, p95 137133CustomLayout · light, 50: median 133 ms, p95 137133light, 501.00×dockview · heavy, 50: median 252 ms, p95 270252CustomLayout · heavy, 50: median 169 ms, p95 188169heavy, 500.67×ms
CPU ×4
0200400600800dockview · light, 50: median 150 ms, p95 154150CustomLayout · light, 50: median 135 ms, p95 150135light, 500.90×dockview · heavy, 50: median 686 ms, p95 712686CustomLayout · heavy, 50: median 419 ms, p95 440419heavy, 500.61×ms
SizeCPUdockviewCustomLayoutCL / DVVerdictn
medianp95minσmedianp95minσ
light, 50×11331371184.641331371184.081.00×parity48
light, 50×41501541403.041351501286.760.90×parity48
heavy, 50×125227021913.71691881617.660.67×CL faster48
heavy, 50×468671264017.841944039914.60.61×CL faster48

05Scaling

Median by panel count (4, 20, 50, 100, 200; sizes with tabs in groups, see the size table). Two charts per operation: CPU ×1 and ×4. Panel type follows the toggle above (currently: heavylight).

Cold mount
0100200300050100150200dockview, 4 panels: 23.9 msdockview, 20 panels: 62.7 msdockview, 50 panels: 88.5 msdockview, 100 panels: 196 msdockview, 200 panels: 279 ms279CustomLayout, 4 panels: 22.7 msCustomLayout, 20 panels: 51.6 msCustomLayout, 50 panels: 54.5 msCustomLayout, 100 panels: 114 msCustomLayout, 200 panels: 122 ms122ms, CPU ×1panels05001,0001,500050100150200dockview, 4 panels: 85.5 msdockview, 20 panels: 246 msdockview, 50 panels: 355 msdockview, 100 panels: 742 msdockview, 200 panels: 1.052 ms1,052CustomLayout, 4 panels: 82.3 msCustomLayout, 20 panels: 200 msCustomLayout, 50 panels: 208 msCustomLayout, 100 panels: 451 msCustomLayout, 200 panels: 492 ms492ms, CPU ×4panels
Restore (new ids)
0200400600050100150200dockview, 4 panels: 23.4 msdockview, 20 panels: 149 msdockview, 50 panels: 181 msdockview, 100 panels: 403 msdockview, 200 panels: 539 ms539CustomLayout, 4 panels: 22.4 msCustomLayout, 20 panels: 55.6 msCustomLayout, 50 panels: 59.9 msCustomLayout, 100 panels: 129 msCustomLayout, 200 panels: 137 ms137ms, CPU ×1panels01,0002,0003,000050100150200dockview, 4 panels: 92.7 msdockview, 20 panels: 553 msdockview, 50 panels: 700 msdockview, 100 panels: 1.553 msdockview, 200 panels: 2.008 ms2,008CustomLayout, 4 panels: 86.5 msCustomLayout, 20 panels: 241 msCustomLayout, 50 panels: 245 msCustomLayout, 100 panels: 505 msCustomLayout, 200 panels: 556 ms556ms, CPU ×4panels
Cleanup
0100200300050100150200dockview, 4 panels: 3.75 msdockview, 20 panels: 77.4 msdockview, 50 panels: 93.5 msdockview, 100 panels: 215 msdockview, 200 panels: 240 ms240CustomLayout, 4 panels: 2.41 msCustomLayout, 20 panels: 5.59 msCustomLayout, 50 panels: 6.12 msCustomLayout, 100 panels: 13.9 msCustomLayout, 200 panels: 13.3 ms13ms, CPU ×1panels02505007501,000050100150200dockview, 4 panels: 14.2 msdockview, 20 panels: 345 msdockview, 50 panels: 362 msdockview, 100 panels: 874 msdockview, 200 panels: 960 ms960CustomLayout, 4 panels: 9.22 msCustomLayout, 20 panels: 23.2 msCustomLayout, 50 panels: 23.7 msCustomLayout, 100 panels: 62.4 msCustomLayout, 200 panels: 60.0 ms60ms, CPU ×4panels
Removal, per operation
02.04.06.08.0050100150200dockview, 4 panels: 5.61 msdockview, 20 panels: 4.50 msdockview, 50 panels: 0.24 msdockview, 100 panels: 0.25 msdockview, 200 panels: 0.27 ms0.27CustomLayout, 4 panels: 1.03 msCustomLayout, 20 panels: 3.82 msCustomLayout, 50 panels: 5.26 msCustomLayout, 100 panels: 5.65 msCustomLayout, 200 panels: 6.00 ms6.0ms, CPU ×1panels0102030050100150200dockview, 4 panels: 21.6 msdockview, 20 panels: 19.1 msdockview, 50 panels: 1.19 msdockview, 100 panels: 1.16 msdockview, 200 panels: 1.14 ms1.1CustomLayout, 4 panels: 4.24 msCustomLayout, 20 panels: 16.1 msCustomLayout, 50 panels: 21.1 msCustomLayout, 100 panels: 22.3 msCustomLayout, 200 panels: 23.8 ms24ms, CPU ×4panels
Splitter step
00.501.01.52.0050100150200dockview, 4 panels: 0.25 msdockview, 20 panels: 0.29 msdockview, 50 panels: 0.23 msdockview, 100 panels: 0.37 msdockview, 200 panels: 0.42 ms0.42CustomLayout, 4 panels: 0.51 msCustomLayout, 20 panels: 0.62 msCustomLayout, 50 panels: 0.82 msCustomLayout, 100 panels: 1.42 msCustomLayout, 200 panels: 1.99 ms2.0ms, CPU ×1panels02.55.07.510050100150200dockview, 4 panels: 0.23 msdockview, 20 panels: 0.88 msdockview, 50 panels: 0.94 msdockview, 100 panels: 2.09 msdockview, 200 panels: 2.39 ms2.4CustomLayout, 4 panels: 1.27 msCustomLayout, 20 panels: 2.66 msCustomLayout, 50 panels: 3.37 msCustomLayout, 100 panels: 6.51 msCustomLayout, 200 panels: 9.51 ms9.5ms, CPU ×4panels
Serialization
050100150050100150200dockview, 4 panels: 0.86 µsdockview, 20 panels: 1.82 µsdockview, 50 panels: 3.01 µsdockview, 100 panels: 6.07 µsdockview, 200 panels: 11.0 µs11CustomLayout, 4 panels: 8.25 µsCustomLayout, 20 panels: 17.6 µsCustomLayout, 50 panels: 33.4 µsCustomLayout, 100 panels: 66.7 µsCustomLayout, 200 panels: 115 µs115µs, CPU ×1panels0200400600050100150200dockview, 4 panels: 2.17 µsdockview, 20 panels: 6.16 µsdockview, 50 panels: 11.8 µsdockview, 100 panels: 23.0 µsdockview, 200 panels: 41.5 µs41CustomLayout, 4 panels: 24.3 µsCustomLayout, 20 panels: 71.0 µsCustomLayout, 50 panels: 130 µsCustomLayout, 100 panels: 259 µsCustomLayout, 200 panels: 452 µs452µs, CPU ×4panels
Cold mount
0102030050100150200dockview, 4 panels: 7.86 msdockview, 20 panels: 10.3 msdockview, 50 panels: 11.0 msdockview, 100 panels: 15.2 msdockview, 200 panels: 18.8 ms19CustomLayout, 4 panels: 5.92 msCustomLayout, 20 panels: 8.22 msCustomLayout, 50 panels: 10.6 msCustomLayout, 100 panels: 15.9 msCustomLayout, 200 panels: 21.2 ms21ms, CPU ×1panels020406080050100150200dockview, 4 panels: 14.9 msdockview, 20 panels: 20.4 msdockview, 50 panels: 25.8 msdockview, 100 panels: 41.9 msdockview, 200 panels: 60.3 ms60CustomLayout, 4 panels: 10.8 msCustomLayout, 20 panels: 17.0 msCustomLayout, 50 panels: 25.0 msCustomLayout, 100 panels: 45.7 msCustomLayout, 200 panels: 72.1 ms72ms, CPU ×4panels
Restore (new ids)
010203040050100150200dockview, 4 panels: 4.68 msdockview, 20 panels: 12.6 msdockview, 50 panels: 14.0 msdockview, 100 panels: 23.2 msdockview, 200 panels: 34.3 ms34CustomLayout, 4 panels: 3.94 msCustomLayout, 20 panels: 6.80 msCustomLayout, 50 panels: 9.21 msCustomLayout, 100 panels: 15.6 msCustomLayout, 200 panels: 21.7 ms22ms, CPU ×1panels050100150050100150200dockview, 4 panels: 7.95 msdockview, 20 panels: 28.1 msdockview, 50 panels: 37.5 msdockview, 100 panels: 82.6 msdockview, 200 panels: 136 ms136CustomLayout, 4 panels: 6.85 msCustomLayout, 20 panels: 15.4 msCustomLayout, 50 panels: 24.6 msCustomLayout, 100 panels: 47.5 msCustomLayout, 200 panels: 79.4 ms79ms, CPU ×4panels
Cleanup
0102030050100150200dockview, 4 panels: 1.51 msdockview, 20 panels: 7.20 msdockview, 50 panels: 7.70 msdockview, 100 panels: 15.8 msdockview, 200 panels: 23.2 ms23CustomLayout, 4 panels: 0.50 msCustomLayout, 20 panels: 0.75 msCustomLayout, 50 panels: 0.93 msCustomLayout, 100 panels: 1.17 msCustomLayout, 200 panels: 1.49 ms1.5ms, CPU ×1panels0255075100050100150200dockview, 4 panels: 2.98 msdockview, 20 panels: 17.0 msdockview, 50 panels: 21.0 msdockview, 100 panels: 50.6 msdockview, 200 panels: 86.2 ms86CustomLayout, 4 panels: 1.11 msCustomLayout, 20 panels: 2.03 msCustomLayout, 50 panels: 2.61 msCustomLayout, 100 panels: 3.28 msCustomLayout, 200 panels: 4.85 ms4.8ms, CPU ×4panels
Removal, per operation
00.501.01.5050100150200dockview, 4 panels: 0.70 msdockview, 20 panels: 0.33 msdockview, 50 panels: 0.13 msdockview, 100 panels: 0.14 msdockview, 200 panels: 0.15 ms0.15CustomLayout, 4 panels: 0.76 msCustomLayout, 20 panels: 0.62 msCustomLayout, 50 panels: 0.53 msCustomLayout, 100 panels: 0.81 msCustomLayout, 200 panels: 1.16 ms1.2ms, CPU ×1panels02.04.06.0050100150200dockview, 4 panels: 1.48 msdockview, 20 panels: 0.88 msdockview, 50 panels: 0.52 msdockview, 100 panels: 0.61 msdockview, 200 panels: 0.61 ms0.61CustomLayout, 4 panels: 1.59 msCustomLayout, 20 panels: 1.55 msCustomLayout, 50 panels: 1.80 msCustomLayout, 100 panels: 3.25 msCustomLayout, 200 panels: 4.74 ms4.7ms, CPU ×4panels
Splitter step
01.02.03.0050100150200dockview, 4 panels: 0.60 msdockview, 20 panels: 0.53 msdockview, 50 panels: 0.37 msdockview, 100 panels: 0.57 msdockview, 200 panels: 0.58 ms0.58CustomLayout, 4 panels: 0.68 msCustomLayout, 20 panels: 0.87 msCustomLayout, 50 panels: 1.09 msCustomLayout, 100 panels: 1.92 msCustomLayout, 200 panels: 2.59 ms2.6ms, CPU ×1panels02.04.06.08.0050100150200dockview, 4 panels: 0.12 msdockview, 20 panels: 0.30 msdockview, 50 panels: 0.72 msdockview, 100 panels: 1.89 msdockview, 200 panels: 2.03 ms2.0CustomLayout, 4 panels: 0.58 msCustomLayout, 20 panels: 1.48 msCustomLayout, 50 panels: 2.20 msCustomLayout, 100 panels: 4.21 msCustomLayout, 200 panels: 6.29 ms6.3ms, CPU ×4panels
Serialization
050100150050100150200dockview, 4 panels: 1.08 µsdockview, 20 panels: 2.43 µsdockview, 50 panels: 3.46 µsdockview, 100 panels: 6.15 µsdockview, 200 panels: 10.8 µs11CustomLayout, 4 panels: 9.82 µsCustomLayout, 20 panels: 19.3 µsCustomLayout, 50 panels: 33.5 µsCustomLayout, 100 panels: 67.2 µsCustomLayout, 200 panels: 116 µs116µs, CPU ×1panels0200400600050100150200dockview, 4 panels: 1.87 µsdockview, 20 panels: 6.23 µsdockview, 50 panels: 10.8 µsdockview, 100 panels: 23.1 µsdockview, 200 panels: 42.3 µs42CustomLayout, 4 panels: 24.7 µsCustomLayout, 20 panels: 70.5 µsCustomLayout, 50 panels: 130 µsCustomLayout, 100 panels: 262 µsCustomLayout, 200 panels: 459 µs459µs, CPU ×4panels

How many panels are actually mounted

alivePanels after cold mount: dockview / CustomLayout. This explains why the CustomLayout curves grow more slowly: it mounts only active tabs.

Panels420flat-2050100200tabs-20
heavy4 / 420 / 1020 / 2050 / 10100 / 20200 / 2021 / 2
light4 / 420 / 1020 / 2050 / 10100 / 20200 / 2021 / 2

06Memory and leaks

Neither engine shows DOM leaks: after 8 mount/unmount cycles of 50 panels there are 0 live panels, and growth in document nodes and body children is 0. Heap: for dockview after a forced GC the median growth is +2.4 MB (light) and +15.4–30.8 MB (heavy, ×4 and ×1), but the spread is large (heavy at ×4 ranges from 0.2 to 15.9 MB). A slope of ~15–25 KB per cycle adds only ~0.1–0.2 MB over 8 cycles, so the growth is more likely one-off retention (caches/closures) than a linear leak. For CustomLayout the median growth is negative (−0.6…−6.2 MB), but for heavy panels the range reaches +3.7 MB, and the slope at ×4 is unstable (median +943 KB/cycle, spread from −7 KB to +1.9 MB/cycle). With 8 cycles and 6 measurements nothing can be definitively called a leak — a long run (20+ cycles) is needed. CDP usedSize before/after depends heavily on garbage left by the previous scenario (passes 1 and 3 start with a large heap), so do not use it to compare engines.

PanelsCPUMetricdockview, median [min … max]CustomLayout, median [min … max]
light×1Heap growth after 8 cycles2.4 MB [783.6 KB … 2.4 MB]-937.2 KB [-2.0 MB … 21.9 KB]
light×1Heap slope per cycle24.0 KB [4.8 KB … 26.2 KB]857 B [584 B … 1.1 KB]
light×1Live panels after unmount0 [0 … 0]0 [0 … 0]
light×1Δ document nodes0 [0 … 0]0 [0 … 0]
light×1Δ body children0 [0 … 0]0 [0 … 0]
light×1Cycle time133 [118 … 139]133 [118 … 137]
light×4Heap growth after 8 cycles2.4 MB [1.3 MB … 2.4 MB]-649.0 KB [-1.5 MB … 22.0 KB]
light×4Heap slope per cycle24.5 KB [4.9 KB … 25.1 KB]601 B [-4.8 KB … 1.2 KB]
light×4Live panels after unmount0 [0 … 0]0 [0 … 0]
light×4Δ document nodes0 [0 … 0]0 [0 … 0]
light×4Δ body children0 [0 … 0]0 [0 … 0]
light×4Cycle time150 [140 … 156]135 [128 … 151]
heavy×1Heap growth after 8 cycles30.8 MB [16.0 MB … 31.7 MB]-6.2 MB [-16.1 MB … 3.7 MB]
heavy×1Heap slope per cycle14.9 KB [-7.7 KB … 50.7 KB]-3.3 KB [-1.9 MB … 1.9 MB]
heavy×1Live panels after unmount0 [0 … 0]0 [0 … 0]
heavy×1Δ document nodes0 [0 … 0]0 [0 … 0]
heavy×1Δ body children0 [0 … 0]0 [0 … 0]
heavy×1Cycle time252 [219 … 272]169 [161 … 191]
heavy×4Heap growth after 8 cycles15.4 MB [208.5 KB … 15.9 MB]-6.2 MB [-16.1 MB … 3.7 MB]
heavy×4Heap slope per cycle15.1 KB [3.7 KB … 37.1 KB]943.2 KB [-7.3 KB … 1.9 MB]
heavy×4Live panels after unmount0 [0 … 0]0 [0 … 0]
heavy×4Δ document nodes0 [0 … 0]0 [0 … 0]
heavy×4Δ body children0 [0 … 0]0 [0 … 0]
heavy×4Cycle time686 [640 … 732]419 [399 … 474]

CDP Runtime.getHeapUsage around mount-cycles (per engine)

PassCPUdockview Δ usedSizeCustomLayout Δ usedSizeOrder
1×1-48.2 MB-15.9 MBdockview → custom
2×116.0 MB-2.2 MBcustom → dockview
3×1-48.2 MB-16.0 MBdockview → custom
1×4-2.2 MB27.5 KBdockview → custom
2×442.3 KB-2.2 MBcustom → dockview
3×4-2.2 MB42.4 KBdockview → custom

07DOM nodes

Counted after mount, CPU ×1, dockview / CustomLayout. "Chrome" means engine nodes excluding panel content (splitters, headers, tabs). Panel type follows the toggle.

"chrome" nodes (excluding panel content)
01,0002,0003,000dockview · 4: median 107 pcs, p95 107107CustomLayout · 4: median 112 pcs, p95 11211241.05×dockview · 20: median 291 pcs, p95 291291CustomLayout · 20: median 376 pcs, p95 376376201.29×dockview · flat-20: median 461 pcs, p95 461461CustomLayout · flat-20: median 554 pcs, p95 554554flat-201.20×dockview · 50: median 481 pcs, p95 481481CustomLayout · 50: median 686 pcs, p95 686686501.43×dockview · 100: median 1,041 pcs, p95 1,0411,041CustomLayout · 100: median 1,380 pcs, p95 1,3801,3801001.33×dockview · 200: median 1,641 pcs, p95 1,6411,641CustomLayout · 200: median 2,380 pcs, p95 2,3802,3802001.45×dockview · tabs-20: median 178 pcs, p95 178178CustomLayout · tabs-20: median 247 pcs, p95 247247tabs-201.39×pcs
"chrome" nodes (excluding panel content)
01,0002,0003,000dockview · 4: median 107 pcs, p95 107107CustomLayout · 4: median 112 pcs, p95 11211241.05×dockview · 20: median 291 pcs, p95 291291CustomLayout · 20: median 376 pcs, p95 376376201.29×dockview · flat-20: median 461 pcs, p95 461461CustomLayout · flat-20: median 554 pcs, p95 554554flat-201.20×dockview · 50: median 481 pcs, p95 481481CustomLayout · 50: median 686 pcs, p95 686686501.43×dockview · 100: median 1,041 pcs, p95 1,0411,041CustomLayout · 100: median 1,380 pcs, p95 1,3801,3801001.33×dockview · 200: median 1,641 pcs, p95 1,6411,641CustomLayout · 200: median 2,380 pcs, p95 2,3802,3802001.45×dockview · tabs-20: median 178 pcs, p95 178178CustomLayout · tabs-20: median 247 pcs, p95 247247tabs-201.39×pcs
Sizelive panelsvisibledetachednodes in scenepanel nodes"chrome" nodesoff-scene nodes
44 / 44 / 40 / 05,719 / 5,7245,612 / 5,612107 / 1120 / 0
2020 / 1010 / 1010 / 014,321 / 14,40614,030 / 14,030291 / 3760 / 0
flat-2020 / 2020 / 200 / 028,521 / 28,61428,060 / 28,060461 / 5540 / 0
5050 / 1010 / 1040 / 014,511 / 14,71614,030 / 14,030481 / 6860 / 0
100100 / 2020 / 2080 / 029,101 / 29,44028,060 / 28,0601,041 / 1,3800 / 0
200200 / 2020 / 20180 / 029,701 / 30,44028,060 / 28,0601,641 / 2,3800 / 0
tabs-2021 / 22 / 219 / 02,984 / 3,0532,806 / 2,806178 / 2470 / 0
44 / 44 / 40 / 0119 / 12412 / 12107 / 1120 / 0
2020 / 1010 / 1010 / 0321 / 40630 / 30291 / 3760 / 0
flat-2020 / 2020 / 200 / 0521 / 61460 / 60461 / 5540 / 0
5050 / 1010 / 1040 / 0511 / 71630 / 30481 / 6860 / 0
100100 / 2020 / 2080 / 01,101 / 1,44060 / 601,041 / 1,3800 / 0
200200 / 2020 / 20180 / 01,701 / 2,44060 / 601,641 / 2,3800 / 0
tabs-2021 / 22 / 219 / 0184 / 2536 / 6178 / 2470 / 0

08Bundle size

In the app build both engines are bundled into the main index chunk, so sizes are taken from separate library builds of each engine (vite, same minification config).

JS and CSS, gzip / brotli compression
dockview JS gzip86.3 KBCustomLayout JS gzip14.2 KBdockview JS br72.0 KBCustomLayout JS br12.7 KBdockview CSS gzip11.0 KBCustomLayout CSS gzip4.4 KB
dockviewCustomLayoutDV / CL
JS raw361.5 KB42.5 KB8.5×
JS gzip86.3 KB14.2 KB6.1×
JS brotli72.0 KB12.7 KB5.7×
CSS gzip11.0 KB4.4 KB2.5×
CSS brotli9.2 KB3.9 KB2.4×
Source modulesdockview-core 700.6 KB, dockview-vue 18.4 KBcustom-layout 90.2 KB
App index chunk2.440.8 KB raw / 730.6 KB gzip (both engines inside)

Against the ~731 KB gzip main chunk, the difference of ~79 KB is about 11% of the bundle.

09Features: speed isn't everything

dockview is a mature library with a broad API; CustomLayout (~3.7k lines of TS/Vue and ~0.8k lines of SCSS themes in src/components/custom-layout) covers what the terminal needs today, but everything else would have to be written and maintained in-house.

Capabilitydockview 8.4CustomLayout
Nested row/column splitsyesyes (MAX_TREE_DEPTH, config validation)
Tabbed groupsyesyes (stacks)
Tab DnD between groups and to edgesyes, customizable overlays and zonesyes: group zones and root edges
Dragging a whole groupyesyes
Touch dragginglimited — relies on HTML5 DnDyes, custom use-touch-drag
Floating groupsyes (now persisted in the workspace)no
Popout to a separate windowyesno
Maximize groupyes (maximize)yes (stack fullscreen)
Tab overflowyes (dropdown list)yes ("+N" menu, menu item slot)
Lazy mounting of hidden tabsno — a component is created for every panel (alivePanels = N)yes — only tabs that have ever been visible
Fine-grained API (activate, move, addPanel to a group, sizes)yes, plus dozens of events (onDidActivePanelChange, onDidLayoutChange, onWillDrop…)minimal: add/remove/load/get/clear; activation and moving go through a full config reload
SerializationtoJSON — ~11 µs at 200 panelsgetLayout — deep copy, ~115 µs
Minimum sizesin pixels (group no smaller than 100 px)in percent (no less than 5%); groups keep shrinking
Accessibilitypartial: aria-live announcements (disabled in the app), limited keyboard navigationminimal
Themesbuilt-in themes + CSS variables --dv-*7 themes (default, light, terminal, sunset, gl, midnight, ocean)
Tab customizationtab/header components, header actions, watermarktabComponent, overflow menu slot
Other layout typesgridview, splitview, paneviewno
Support and updatesexternal dependency; the 5.2 → 8.4 upgrade required fixes and surfaced a blockerown code — full control, all maintenance and testing on the team
Size (JS gzip)86.3 KB14.2 KB

10dockview 5.2 → 8.4 upgrade

Changes

  • dockview-vue 5.2.0 → 8.4.0, plus an explicit dependency dockview 8.4.0; dockview-core is no longer imported directly.
  • Style import moved to dockview-vue/dist/styles/dockview.css.
  • Payload onDidActivePanelChange is now { panel, origin }.
  • The component root became a fragment — the layout's scoped styles were moved to :deep().
  • floating-group-drag-handle="tabbar" — to keep the 5.x look.
  • Light theme: color-scheme: light and --dv-floating-border.
  • Floating groups are now persisted (dockviewToGl / glToDockview — floatingGroups).
  • .dv-shell got isolation: isolate.
  • New spec dockview-integration.spec.ts (8 tests).

Blocker found in the browser smoke test

Vue casts an omitted Boolean prop to false. As a result, proportionalLayout became false, and core 8.4 produced NaN sizes for nested splits; the same cast disabled the root edge drop zones. Fixed with explicit props:

<DockviewVue
  :proportional-layout="true"
  :dnd-edges="undefined"
  :announcements="false" />

Also, panels are mounted via Teleport one tick after addPanel/fromJSON — the benchmark waits for nextTick + requestAnimationFrame before stopping the timers.

Checks

  • Unit tests 229/229 after the upgrade (271/271 after adding the benchmark); the build passes.
  • Typecheck: 99 errors, all pre-existing, no new ones.
  • Smoke: /dockview-demo 18/18; /trading-dockview 8/10 — 2 long-standing issues (a closed tab is not hidden in the spec after reload; report table console errors caused by the mock).
  • Known and not fixed: glToDockview ignores missing and percentage sizes.

11How to rerun

In the browser

VITE_LAYOUT_BENCH=1 npm run build
npx vite preview --port 5050
# open http://localhost:5050/layout-benchmark

The /layout-benchmark route is available only in a build with VITE_LAYOUT_BENCH=1. The page offers selection of scenarios, sizes and engines, progress, and a results table with JSON export. From the console:

await window.__layoutBench.run({
  scenarios: ['cold-mount', 'restore'],
  sizes: [4, 50, 200],
})

Important: after the run, rebuild without the flag — dist/ currently contains a build with the benchmark route.

Full run via Playwright

Script: perf-reports/layout-benchmark/run.mjs (the runner for this run). It builds the project, measures bundle size, starts preview on :5050, mocks all /api/* (non-GET requests are blocked), runs passes with CDP throttling and real drag, and writes results.json next to itself.

cd perf-reports/layout-benchmark
PLAYWRIGHT_DIR=/path/to/playwright node run.mjs --isolate \
  --passes=3 --throttles=1,4 --trusted-repeats=5
# quick run:        --quick
# selected only:    --scenarios=restore,remove-all
# no rebuild:       --no-build
# custom config:    --config='{"sizes":[4,100]}'

Next to the script are mocks.mjs (mocks for /api/*) and size/ (a separate engine build for bundle measurement). Playwright is not a project dependency: install it in any folder (npm i playwright) and pass the path via PLAYWRIGHT_DIR. The defaults (10/30 iterations, 20 cycles) take ~5 h; this report was produced with reduced values via --config (the command is in the header of run.mjs).

12Raw data

The page embeds JSON (<script type="application/json" id="bench-results">): meta, env, bundle, safety, all 2344 aggregates, comparisons, the re-check, and pass summaries (CDP heap, trusted drag without per-sample arrays). Per-sample data (the full results.json, 13 MB) is not embedded due to its size.