Cytoscape.js GPU benchmarks

v4 (src/) vs v3 (v3/src/) · Mitata · times are per-iteration p50 · 2026-08-12 15:45 · c2d24c2e (v4) · Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz · node v24.18.0 · all profile

Machine and provenance
CPUIntel(R) Core(TM) i9-9900K CPU @ 3.60GHz
Cores8 physical / 16 logical · 3.6 GHz base · 5 GHz max
Memory62.6 GiB
GPUCoffeeLake-S GT2 [UHD Graphics 630] i915
Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (8.0 GiB) amdgpu
OSFedora Linux 43 (Workstation Edition) · 6.19.14-200.fc43.x86_64 · x64
Nodev24.18.0 (v8 13.6.233.17-node.50)
Commitc2d24c2e
docs: the summary goes day by day, from the commit record
Machine id5cf3f79c
Median speedup (geo-mean) 11× 270 v3-vs-gpu comparisons
Biggest win 285107× sweep: edges() @ N=2k
v3 still ahead 2 comparisons
Total run time 45.0 min all profile

Speedup overview v3 p50 ÷ gpu p50, log scale · right of the 1× line = gpu faster

sweep: edges() @ 2k
285107×
sweep: nodes() @ 2k
173123×
core: edges() @ 2k
93661×
core: nodes() @ 2k
50524×
sweep: elements() @ 2k
28736×
core: elements() @ 2k
20389×
core: graph scratch() set + get (v3 restyles the graph) @ 2k
16367×
core: removeScratch() @ 2k
8942×
compare: same() @ 2k
8155×
core: graph data() set + get (v3 restyles the graph) @ 2k
8137×
trav: predecessors() @ 2k
723×
trav: successors() @ 2k
719×
mut-bulk: hide + show @ 2k
268×
flags: show + hide + visible @ 2k
227×
parent drag (shift subtree + bb settle) @ 2k
185×
compound: commonAncestors @ 2k
124×
degree: nodes.totalDegree() @ 2k
112×
mut-bulk: shift @ 2k
111×
viewport: reset() @ 2k
105×
degree: nodes.maxDegree() @ 2k
96×
layout: grid @ 2k
94×
flags: panify + unpanify + pannable @ 2k
89×
flags: selectify + unselectify + selectable @ 2k
88×
degree: node.degree() @ 2k
88×
flags: lock + unlock + locked @ 2k
88×
flags: grabify + ungrabify + grabbable @ 2k
87×
core: options() @ 2k
87×
degree: indegree + outdegree (2 calls) @ 2k
77×
reparent round-trip @ 2k
76×
collection: same + anySame + contains (3 calls) @ 2k
75×
algo: pageRank (20 iters) @ 500
70×
algo: closenessCentrality (one root) @ 2k
70×
algo: closenessCentrality (one root) @ 500
69×
mut-bulk: positions(obj) @ 2k
65×
dimensions: shift + silentShift (round-trip) @ 2k
61×
layout: preset (fn form) @ 2k
60×
algo: dfs (whole graph) @ 2k
59×
viewport: viewport({ zoom, pan }) @ 2k
59×
sweep: nodes(":selected") vs nodes({selected}) @ 2k
59×
algo: bfs (whole graph) @ 2k
58×
algo: bfs (whole graph) @ 500
57×
algo: dfs (whole graph) @ 500
56×
algo: dijkstra + pathTo @ 2k
56×
mut-bulk: lock + unlock @ 2k
54×
algo: closenessCentrality (weighted, one root) @ 500
53×
child drag (move + parent re-derive) @ 2k
51×
dimensions: positions( fn ) over 100 @ 2k
50×
algo: dijkstra + pathTo @ 500
49×
degree: minDegree + maxDegree (2 calls) @ 2k
44×
collection: component() @ 2k
43×
traverse: components() @ 2k
41×
algo: degreeCentralityNormalized @ 500
37×
algo: degreeCentralityNormalized @ 2k
37×
layout: breadthfirst @ 2k
36×
sweep: selected nodes ($("node:selected") vs filter({group, selected})) @ 2k
35×
algo: degreeCentrality (one root) @ 500
35×
query: structural, parents (:parent vs { parent: true }) @ 2k
34×
algo: degreeCentrality (one root) @ 2k
34×
algo: tarjan SCC @ 500
34×
algo: tarjan SCC @ 2k
33×
bounds: getFitViewport() (compute without committing) @ 2k
33×
bounds: cy.fit() (whole-graph scan) @ 2k
33×
query: structural, orphans (:orphan vs { child: false }) @ 2k
32×
collection: silentPositions( fn ) over 100 @ 2k
30×
collection: difference @ 2k
29×
collection: intersection @ 2k
29×
algo: kruskal @ 2k
28×
emit: position write, no listeners @ 2k
28×
layout: concentric @ 2k
28×
algo: hopcroft-tarjan biconnected @ 500
26×
scn: select-all + fit (listeners on) @ 2k
26×
set: intersection() @ 2k
26×
load: init from the definition form (construct + dispose) @ 2k
26×
set: difference() @ 2k
26×
degree: minIndegree + maxOutdegree (2 calls) @ 2k
26×
degree: maxIndegree + minOutdegree (2 calls) @ 2k
25×
algo: kruskal @ 500
25×
algo: hopcroft-tarjan biconnected @ 2k
24×
trav: band roots() @ 2k
24×
core: id lookup ($("#id") vs $id()) @ 2k
23×
mut-bulk: positions(fn) @ 2k
23×
mut: position set @ 2k
23×
data: bulk write, object column (plain-array fallback) @ 2k
21×
algo: bellmanFord @ 500
20×
data: bulk write, numeric column @ 2k
20×
algo: bellmanFord @ 2k
20×
layout: preset @ 2k
19×
core: add + remove @ 2k
18×
data: bulk write, one new dictionary entry per pass @ 2k
18×
viewport: center( eles ) @ 2k
18×
data: bulk write, dictionary string column (4 values) @ 2k
16×
scn: drag (select band of 100 + 8-step shift, position listener) @ 2k
16×
dimensions: silentPosition @ 2k
16×
query: membership ([bucket in ...] vs { in }) @ 2k
15×
collection: absoluteComplement @ 2k
15×
flags: active/activate/unactivate (3 calls) @ 2k
15×
flags: select + unselect + selected (band) @ 2k
15×
viewport: minZoom/maxZoom get (2 calls) @ 2k
15×
mut-bulk: data set @ 2k
14×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } }) @ 2k
14×
core: selected ($(":selected") vs filter({selected})) @ 2k
14×
core: forceRender() (headless no-op) @ 2k
14×
style: renderedStyle (one prop) @ 2k
13×
query: structural, childless (:childless vs { parent: false }) @ 2k
13×
traversal: roots + leaves (2 calls) @ 2k
13×
sweep: selected ($(":selected") vs filter({selected})) @ 2k
13×
dimensions: padding + paddedWidth + paddedHeight (3 calls) @ 2k
13×
algo: betweennessCentrality (unweighted) @ 500
12×
query: two keys AND-ed @ 2k
12×
layout: circle @ 2k
12×
collection: toArray() @ 2k
12×
algo: fuzzyCMeans @ 500
11×
dimensions: relativePosition get @ 2k
11×
algo: betweennessCentrality (unweighted) @ 2k
11×
query: data comparison ([weight > 3] vs { gt }) @ 2k
11×
layout: random @ 2k
11×
layout: scope (eles.layout, 10% of nodes) @ 2k
10×
sweep: all nodes ($("node") vs filter({group})) @ 2k
9.5×
collection: removeScratch() @ 2k
9.0×
algo: betweennessCentrality (weighted) @ 500
8.8×
algo: kMedoids @ 500
8.7×
core: removeAllListeners() @ 2k
8.5×
emit: 1 core listener @ 2k
8.5×
data: removeData (whole collection) @ 2k
8.4×
algo: hierarchicalClustering (threshold) @ 500
8.3×
core: batchData() @ 2k
8.0×
emit: delegated (v3 selector vs v4 predicate) @ 2k
8.0×
scn: explore (expand 2-hop + select + fit) @ 2k
8.0×
mut-bulk: select + unselect @ 2k
7.8×
element data: scratch get + set @ 2k
7.6×
emit: 1 element (ref-qualified) listener @ 2k
7.6×
core: collection() @ 2k
7.2×
core: collection() @ 2k
7.2×
compound: orphans + nonorphans (2 calls) @ 2k
6.9×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners) @ 2k
6.8×
mut-bulk: remove + re-add (256 nodes + cascade) @ 2k
6.4×
core: batch( fn ) (empty) @ 2k
6.3×
style: whole-object style() @ 2k
6.2×
emit: 10 core listeners @ 2k
6.1×
query: predicate function (both sides) @ 2k
6.0×
collection: union @ 2k
6.0×
core: startBatch + endBatch + batching @ 2k
5.9×
bounds: whole-graph boundingBox() @ 2k
5.9×
style: bypass set + removeStyle round-trip @ 2k
5.8×
style: sheet swap (compile + applyAll) @ 2k
5.8×
traverse: outgoers() @ 2k
5.4×
traversal: allAreNeighbors @ 2k
5.3×
traverse: incomers() @ 2k
5.3×
algo: hierholzer (directed) @ 500
5.2×
set: union() @ 2k
5.1×
algo: affinityPropagation @ 500
5.1×
trav: band neighborhood() @ 2k
5.0×
trav: outgoers() @ 2k
4.9×
core: animated() @ 2k
4.9×
trav: incomers() @ 2k
4.9×
core: nodes ($("node") vs filter({group})) @ 2k
4.9×
compare: contains() @ 2k
4.9×
compound: children + descendants + siblings (3 calls) @ 2k
4.8×
viewport: zoom() get @ 2k
4.7×
algo: kMeans (fixed centroids) @ 500
4.6×
collection: length + empty + nonempty (3 calls) @ 2k
4.6×
style: bypass set (ele.style name,value) @ 2k
4.1×
mut: select + unselect @ 2k
4.0×
trav: neighborhood() @ 2k
3.9×
traverse: neighborhood() @ 2k
3.8×
collection: symmetricDifference @ 2k
3.7×
compound: parent + parents + ancestors (3 calls) @ 2k
3.7×
collection: cy() @ 2k
3.6×
collection: layoutDimensions() @ 2k
3.6×
algo: aStar @ 500
3.5×
traversal: parallelEdges + codirectedEdges (2 calls) @ 2k
3.5×
algo: aStar @ 2k
3.4×
traversal: sources + targets (2 calls) @ 2k
3.4×
collection: diff @ 2k
3.3×
traversal: connectedNodes @ 2k
3.3×
traversal: isLoop + isSimple (2 calls) @ 2k
3.1×
flags: takesUpSpace + interactive + transparent (3 calls) @ 2k
3.1×
collection: byGroup @ 2k
3.0×
anim: start + stop, 512-node collection @ 2k
3.0×
dimensions: rendered dims (4 calls) @ 2k
3.0×
anim: viewport animate + stop @ 2k
3.0×
traversal: openNeighborhood + closedNeighborhood (2 calls) @ 2k
2.9×
viewport: width() + height() + size() (3 calls) @ 2k
2.9×
collection: animated() @ 2k
2.9×
style: numericStyle @ 2k
2.9×
iter: map() @ 2k
2.9×
algo: hierholzer (directed) @ 2k
2.9×
trav: band connectedNodes() @ 2k
2.8×
core: window() @ 2k
2.8×
load: cy.json() @ 2k
2.8×
collection: delayAnimation() @ 2k
2.8×
traverse: connectedEdges() @ 2k
2.7×
mut: data set @ 2k
2.7×
dimensions: width + height + outerWidth + outerHeight (4 calls) @ 2k
2.7×
core: container() @ 2k
2.7×
trav: closedNeighborhood() @ 2k
2.6×
trav: connectedEdges() @ 2k
2.5×
collection: is (none match: the full walk) @ 2k
2.5×
core: onRender + offRender @ 2k
2.4×
dimensions: renderedPosition get @ 2k
2.4×
core: resize() / invalidateSize() @ 2k
2.4×
flags: effectiveOpacity @ 2k
2.3×
collection: eq/first/last (3 calls) @ 2k
2.3×
core: zoom set @ 2k
2.3×
core: destroyed() @ 2k
2.2×
emit: on() + off() round-trip @ 2k
2.2×
style: read one prop (width) @ 2k
2.2×
data: read the whole object @ 2k
2.2×
core: isReady() @ 2k
2.2×
collection: slice() @ 2k
2.2×
element data: json() one element @ 2k
2.1×
collection: min + max ( fn ) (2 calls) @ 2k
2.0×
core: selectionType get @ 2k
1.99×
element data: jsons() over 100 @ 2k
1.99×
flags: grabbed + hidden + inactive (3 calls) @ 2k
1.99×
style: first apply on add (256-node band) @ 2k
1.94×
dimensions: renderedBoundingBox @ 2k
1.93×
algo: floydWarshall @ 500
1.93×
viewport: zoom( n ) set @ 2k
1.90×
core: gating setters round-trip (autolock/autoungrabify/autounselectify) @ 2k
1.90×
json: element @ 2k
1.88×
collection: indexOfId() @ 2k
1.79×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener) @ 2k
1.79×
viewport: pan( p ) set @ 2k
1.79×
algo: closenessCentralityNormalized @ 500
1.78×
iter: filter(fn) @ 2k
1.78×
collection: element accessors (id/group/isNode/isEdge, 4 calls) @ 2k
1.76×
style: read one prop (color) @ 2k
1.73×
style( 'text-max-width' ) (was #74 in the switch) @ 2k
1.73×
style( 'text-wrap' ) (was #73 in the switch) @ 2k
1.70×
sweep: filter(fn) @ 2k
1.69×
load: add a 256-node band (add + remove) @ 2k
1.66×
viewport: panBy() @ 2k
1.64×
position: get @ 2k
1.64×
viewport: renderedExtent() @ 2k
1.63×
collection: some + every (2 calls) @ 2k
1.62×
collection: sort( fn ) @ 2k
1.62×
bounds: one node boundingBox() @ 2k
1.61×
anim: delay() (no channels touched) @ 2k
1.59×
compound: isParent/isChild/isChildless/isOrphan (4 calls) @ 2k
1.56×
collection: allAre (all match: the full walk) @ 2k
1.55×
viewport: extent() @ 2k
1.50×
collection: indexOf @ 2k
1.50×
trav: band sources() @ 2k
1.48×
trav: band connectedEdges() @ 2k
1.46×
data: read one numeric key @ 2k
1.41×
collection: reduce( fn ) @ 2k
1.40×
anim: start + stop, one element @ 2k
1.37×
core: mutableElements() (v4 materializes; v3 is O(1)) @ 2k
1.36×
traversal: source() + target() (2 calls) @ 2k
1.35×
data: read one string key (dictionary decode) @ 2k
1.35×
core: pan() get (x32) @ 2k
1.31×
style( 'taxi-radius' ) (was #142 in the switch) @ 2k
1.29×
traversal: edgesTo @ 2k
1.28×
traversal: edgesWith @ 2k
1.27×
style( 'target-distance-from-node' ) (was #150 in the switch) @ 2k
1.27×
core: instanceString + headless + styleEnabled (3 calls) @ 2k
1.27×
core: hasElementWithId + hasCompoundNodes (2 calls) @ 2k
1.19×
core: gating getters (5 calls) @ 2k
1.18×
collection: removed() + inside() (2 calls) @ 2k
1.17×
style( 'border-width' ) (was #6 in the switch) @ 2k
1.15×
style( 'background-color' ) (was #4 in the switch) @ 2k
1.12×
core: extent() @ 2k
1.12×
algo: markovClustering @ 500
1.11×
viewport: pan() get @ 2k
1.09×
iter: forEach() @ 2k
1.04×
algo: kargerStein @ 500
1.04×
data: get @ 2k
1.03×
core: filter(fn) @ 2k
0.99×
core: getElementById() @ 2k
0.98×
0.1×10×100×1000×10000×100000×1000000×

Scaling speedup vs graph size

algorithms

group× @ N=500× @ N=2k
algo: bfs (whole graph)57×58×
algo: dfs (whole graph)56×59×
algo: dijkstra + pathTo49×56×
algo: aStar3.5×3.4×
algo: bellmanFord20×20×
algo: kruskal25×28×
algo: tarjan SCC34×33×
algo: hopcroft-tarjan biconnected26×24×
algo: hierholzer (directed)5.2×2.9×
algo: betweennessCentrality (unweighted)12×11×
algo: degreeCentralityNormalized37×37×
algo: closenessCentrality (one root)69×70×
algo: degreeCentrality (one root)35×34×
algo: pageRank (20 iters)70×
algo: closenessCentrality (weighted, one root)53×
algo: floydWarshall1.93×
algo: closenessCentralityNormalized1.78×
algo: markovClustering1.11×
algo: hierarchicalClustering (threshold)8.3×
algo: kMeans (fixed centroids)4.6×
algo: kMedoids8.7×
algo: fuzzyCMeans11×
algo: affinityPropagation5.1×
algo: kargerStein1.04×
algo: betweennessCentrality (weighted)8.8×

core+collection N=2,000 · 2.9 minv4 (gpu) v3

core: getElementById()
0.98×
core: id lookup ($("#id") vs $id())
23×
core: nodes()
50524×
core: edges()
93661×
core: elements()
20389×
core: nodes ($("node") vs filter({group}))
4.9×
core: selected ($(":selected") vs filter({selected}))
14×
core: filter(fn)
0.99×
core: collection()
7.2×
core: pan() get (x32)
1.31×
core: extent()
1.12×
core: add + remove
18×
core: zoom set
2.3×
traverse: neighborhood()
3.8×
traverse: connectedEdges()
2.7×
traverse: outgoers()
5.4×
traverse: incomers()
5.3×
traverse: components()
41×
degree: node.degree()
88×
degree: nodes.totalDegree()
112×
degree: nodes.maxDegree()
96×
data: get
1.03×
position: get
1.64×
json: element
1.88×
set: union()
5.1×
set: intersection()
26×
set: difference()
26×
iter: map()
2.9×
iter: forEach()
1.04×
iter: filter(fn)
1.78×
compare: same()
8155×
compare: contains()
4.9×
mut: data set
2.7×
mut: position set
23×
mut: select + unselect
4.0×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
core: getElementById()v3 89.2 ns91.8 ns 131 ns85.2 ns 1868
core: getElementById()gpu 91.2 ns94.2 ns 128 ns87.2 ns 1817
core: id lookup ($("#id") vs $id())v3 1.95 µs2.30 µs 3.69 µs1.82 µs 69
core: id lookup ($("#id") vs $id())gpu 84.6 ns87.7 ns 159 ns82.1 ns 1950
core: nodes()v3 412 µs424 µs 569 µs406 µs 1647
core: nodes()gpu 8.15 ns8.47 ns 18.8 ns7.88 ns 20125
core: edges()v3 725 µs740 µs 945 µs715 µs 945
core: edges()gpu 7.74 ns8.22 ns 15.1 ns7.67 ns 20650
core: elements()v3 142 µs148 µs 252 µs140 µs 4697
core: elements()gpu 6.96 ns7.30 ns 18.3 ns6.63 ns 23282
core: nodes ($("node") vs filter({group}))v3 548 µs581 µs 1.22 ms533 µs 1201
core: nodes ($("node") vs filter({group}))gpu 113 µs119 µs 276 µs82.8 µs 5773
core: selected ($(":selected") vs filter({selected}))v3 346 µs359 µs 630 µs338 µs 1937
core: selected ($(":selected") vs filter({selected}))gpu 24.9 µs25.5 µs 26.6 µs24.5 µs 12
core: filter(fn)v3 414 µs427 µs 693 µs399 µs 1637
core: filter(fn)gpu 418 µs452 µs 956 µs410 µs 1533
core: collection()v3 463 ns570 ns 1.68 µs447 ns 293
core: collection()gpu 64.4 ns68.5 ns 116 ns61.9 ns 2431
core: pan() get (x32)v3 44.5 ns45.4 ns 55.9 ns43.5 ns 3654
core: pan() get (x32)gpu 33.9 ns35.7 ns 50.6 ns32.9 ns 4793
core: extent()v3 22.9 ns39.5 ns 142 ns21.9 ns 4214
core: extent()gpu 20.5 ns28.1 ns 108 ns19.1 ns 5917
core: add + removev3 121 µs124 µs 196 µs110 µs 5635
core: add + removegpu 6.77 µs7.77 µs 18.8 µs6.38 µs 80570
core: zoom setv3 1.33 µs1.34 µs 1.47 µs1.20 µs 122
core: zoom setgpu 583 ns598 ns 774 ns572 ns 272
traverse: neighborhood()v3 3.70 µs3.85 µs 4.47 µs3.43 µs 40
traverse: neighborhood()gpu 976 ns1.11 µs 2.01 µs938 ns 146
traverse: connectedEdges()v3 1.05 µs1.17 µs 2.04 µs1.01 µs 141
traverse: connectedEdges()gpu 385 ns423 ns 1.36 µs376 ns 395
traverse: outgoers()v3 2.44 µs2.61 µs 3.38 µs2.32 µs 61
traverse: outgoers()gpu 454 ns538 ns 2.03 µs442 ns 300
traverse: incomers()v3 2.42 µs2.61 µs 3.41 µs2.35 µs 61
traverse: incomers()gpu 460 ns571 ns 2.03 µs449 ns 283
traverse: components()v3 80.2 ms82.2 ms 90.8 ms75.6 ms 12
traverse: components()gpu 1.93 ms2.07 ms 3.55 ms1.88 ms 319
degree: node.degree()v3 3.66 µs3.78 µs 4.61 µs3.27 µs 41
degree: node.degree()gpu 41.5 ns44.0 ns 130 ns39.6 ns 3881
degree: nodes.totalDegree()v3 7.27 ms8.09 ms 12.0 ms6.88 ms 82
degree: nodes.totalDegree()gpu 64.7 µs67.3 µs 120 µs60.1 µs 10399
degree: nodes.maxDegree()v3 7.25 ms8.07 ms 12.8 ms6.79 ms 83
degree: nodes.maxDegree()gpu 75.2 µs77.8 µs 138 µs69.8 µs 9006
data: getv3 30.0 ns31.6 ns 60.1 ns29.0 ns 5418
data: getgpu 29.2 ns30.9 ns 61.1 ns28.5 ns 5524
position: getv3 35.8 ns37.1 ns 56.9 ns34.4 ns 4610
position: getgpu 21.8 ns25.6 ns 54.1 ns21.0 ns 6541
json: elementv3 300 ns393 ns 3.52 µs292 ns 423
json: elementgpu 160 ns166 ns 266 ns156 ns 982
set: union()v3 93.3 µs106 µs 171 µs91.1 µs 6456
set: union()gpu 18.1 µs18.8 µs 18.7 µs17.6 µs 12
set: intersection()v3 92.6 µs106 µs 155 µs88.4 µs 6517
set: intersection()gpu 3.56 µs3.61 µs 3.93 µs3.50 µs 42
set: difference()v3 91.1 µs105 µs 195 µs88.4 µs 6576
set: difference()gpu 3.54 µs3.58 µs 3.98 µs3.45 µs 43
iter: map()v3 29.6 µs31.6 µs 57.4 µs28.5 µs 21839
iter: map()gpu 10.3 µs10.3 µs 10.7 µs10.2 µs 12
iter: forEach()v3 3.48 µs3.73 µs 3.83 µs3.43 µs 36
iter: forEach()gpu 3.35 µs3.40 µs 3.89 µs3.28 µs 44
iter: filter(fn)v3 245 µs254 µs 346 µs239 µs 2756
iter: filter(fn)gpu 138 µs143 µs 204 µs135 µs 4885
compare: same()v3 119 µs124 µs 219 µs114 µs 5678
compare: same()gpu 14.6 ns15.6 ns 30.8 ns14.2 ns 10943
compare: contains()v3 6.12 µs6.19 µs 6.44 µs6.04 µs 24
compare: contains()gpu 1.26 µs1.27 µs 1.37 µs1.23 µs 128
mut: data setv3 618 ns645 ns 1.23 µs601 ns 260
mut: data setgpu 230 ns241 ns 373 ns229 ns 706
mut: position setv3 1.18 µs1.19 µs 1.27 µs1.15 µs 136
mut: position setgpu 52.1 ns55.1 ns 100 ns50.1 ns 3083
mut: select + unselectv3 2.43 µs2.61 µs 3.25 µs2.34 µs 61
mut: select + unselectgpu 610 ns617 ns 672 ns597 ns 263

materializers N=2,000 · 49.8 sv4 (gpu) v3

sweep: nodes()
173123×
sweep: edges()
285107×
sweep: elements()
28736×
sweep: all nodes ($("node") vs filter({group}))
9.5×
sweep: selected ($(":selected") vs filter({selected}))
13×
sweep: selected nodes ($("node:selected") vs filter({group, selected}))
35×
sweep: nodes(":selected") vs nodes({selected})
59×
sweep: filter(fn)
1.69×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
sweep: nodes()v3 417 µs428 µs 568 µs407 µs 1637
sweep: nodes()gpu 2.41 ns2.51 ns 5.29 ns2.40 ns 65852
sweep: edges()v3 717 µs731 µs 927 µs696 µs 956
sweep: edges()gpu 2.51 ns2.63 ns 4.89 ns2.46 ns 62891
sweep: elements()v3 139 µs148 µs 235 µs136 µs 4709
sweep: elements()gpu 4.85 ns5.19 ns 12.1 ns4.64 ns 32562
sweep: all nodes ($("node") vs filter({group}))v3 545 µs576 µs 866 µs527 µs 1213
sweep: all nodes ($("node") vs filter({group}))gpu 57.5 µs72.3 µs 176 µs53.9 µs 9578
sweep: selected ($(":selected") vs filter({selected}))v3 328 µs338 µs 525 µs322 µs 2070
sweep: selected ($(":selected") vs filter({selected}))gpu 25.8 µs26.4 µs 27.8 µs25.6 µs 12
sweep: selected nodes ($("node:selected") vs filter({group, selected}))v3 318 µs328 µs 556 µs313 µs 2134
sweep: selected nodes ($("node:selected") vs filter({group, selected}))gpu 9.03 µs9.11 µs 9.69 µs8.86 µs 15
sweep: nodes(":selected") vs nodes({selected})v3 529 µs560 µs 1.12 ms504 µs 1250
sweep: nodes(":selected") vs nodes({selected})gpu 9.03 µs9.06 µs 9.10 µs8.97 µs 15
sweep: filter(fn)v3 409 µs430 µs 739 µs402 µs 1628
sweep: filter(fn)gpu 242 µs260 µs 566 µs237 µs 2680

mutators N=2,000 · 56.4 sv4 (gpu) v3

mut-bulk: select + unselect
7.8×
mut-bulk: hide + show
268×
mut-bulk: lock + unlock
54×
mut-bulk: positions(obj)
65×
mut-bulk: positions(fn)
23×
mut-bulk: shift
111×
mut-bulk: data set
14×
mut-bulk: remove + re-add (256 nodes + cascade)
6.4×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
mut-bulk: select + unselectv3 2.00 ms2.06 ms 3.19 ms1.95 ms 319
mut-bulk: select + unselectgpu 255 µs265 µs 400 µs249 µs 2649
mut-bulk: hide + showv3 57.7 ms63.2 ms 72.2 ms56.0 ms 12
mut-bulk: hide + showgpu 216 µs222 µs 396 µs206 µs 3067
mut-bulk: lock + unlockv3 2.09 ms2.15 ms 4.13 ms2.02 ms 320
mut-bulk: lock + unlockgpu 38.7 µs39.1 µs 40.5 µs38.1 µs 12
mut-bulk: positions(obj)v3 2.39 ms2.45 ms 3.88 ms2.19 ms 279
mut-bulk: positions(obj)gpu 37.0 µs38.6 µs 64.6 µs35.7 µs 17865
mut-bulk: positions(fn)v3 3.41 ms3.58 ms 5.60 ms3.23 ms 191
mut-bulk: positions(fn)gpu 148 µs153 µs 267 µs143 µs 4469
mut-bulk: shiftv3 3.58 ms3.75 ms 5.16 ms3.49 ms 180
mut-bulk: shiftgpu 32.3 µs33.7 µs 59.7 µs31.2 µs 20424
mut-bulk: data setv3 907 µs930 µs 1.39 ms880 µs 732
mut-bulk: data setgpu 63.5 µs65.1 µs 109 µs61.7 µs 10440
mut-bulk: remove + re-add (256 nodes + cascade)v3 41.4 ms44.9 ms 54.5 ms40.3 ms 12
mut-bulk: remove + re-add (256 nodes + cascade)gpu 6.49 ms6.64 ms 8.56 ms5.73 ms 99

scenarios N=2,000 · 37.8 sv4 (gpu) v3

scn: explore (expand 2-hop + select + fit)
8.0×
scn: select-all + fit (listeners on)
26×
scn: drag (select band of 100 + 8-step shift, position listener)
16×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)
6.8×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)
1.79×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
scn: explore (expand 2-hop + select + fit)v3 300 µs357 µs 977 µs279 µs 1858
scn: explore (expand 2-hop + select + fit)gpu 37.6 µs41.0 µs 82.3 µs33.8 µs 16441
scn: select-all + fit (listeners on)v3 25.3 ms26.1 ms 29.8 ms23.5 ms 22
scn: select-all + fit (listeners on)gpu 969 µs1.01 ms 1.46 ms928 µs 664
scn: drag (select band of 100 + 8-step shift, position listener)v3 1.62 ms1.65 ms 2.12 ms1.58 ms 397
scn: drag (select band of 100 + 8-step shift, position listener)gpu 99.9 µs108 µs 362 µs97.3 µs 6455
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)v3 44.5 ms44.7 ms 45.5 ms43.8 ms 12
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)gpu 6.57 ms6.66 ms 8.37 ms6.01 ms 97
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)v3 7.57 ms7.63 ms 9.11 ms6.84 ms 83
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)gpu 4.23 ms4.38 ms 6.95 ms3.87 ms 147

traversal N=2,000 · 2.0 minv4 (gpu) v3

trav: neighborhood()
3.9×
trav: closedNeighborhood()
2.6×
trav: connectedEdges()
2.5×
trav: outgoers()
4.9×
trav: incomers()
4.9×
trav: successors()
719×
trav: predecessors()
723×
trav: band neighborhood()
5.0×
trav: band connectedEdges()
1.46×
trav: band roots()
24×
trav: band sources()
1.48×
trav: band connectedNodes()
2.8×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
trav: neighborhood()v3 3.97 µs4.22 µs 5.28 µs3.48 µs 36
trav: neighborhood()gpu 1.03 µs1.07 µs 2.05 µs863 ns 154
trav: closedNeighborhood()v3 5.81 µs5.68 µs 6.23 µs5.15 µs 26
trav: closedNeighborhood()gpu 2.20 µs2.31 µs 2.78 µs2.12 µs 69
trav: connectedEdges()v3 1.01 µs1.09 µs 1.81 µs977 ns 153
trav: connectedEdges()gpu 401 ns414 ns 700 ns392 ns 407
trav: outgoers()v3 2.29 µs2.44 µs 2.93 µs2.22 µs 65
trav: outgoers()gpu 465 ns545 ns 2.03 µs440 ns 305
trav: incomers()v3 2.31 µs2.44 µs 3.03 µs2.22 µs 66
trav: incomers()gpu 472 ns549 ns 2.02 µs443 ns 303
trav: successors()v3 431 ms433 ms 443 ms426 ms 12
trav: successors()gpu 599 µs636 µs 1.89 ms576 µs 1065
trav: predecessors()v3 431 ms434 ms 443 ms427 ms 12
trav: predecessors()gpu 595 µs629 µs 1.84 ms578 µs 1079
trav: band neighborhood()v3 184 µs201 µs 393 µs179 µs 3464
trav: band neighborhood()gpu 36.9 µs37.7 µs 40.9 µs36.4 µs 12
trav: band connectedEdges()v3 24.0 µs24.6 µs 27.1 µs23.8 µs 12
trav: band connectedEdges()gpu 16.5 µs17.3 µs 19.7 µs16.3 µs 12
trav: band roots()v3 109 µs118 µs 186 µs103 µs 5910
trav: band roots()gpu 4.54 µs4.56 µs 4.66 µs4.49 µs 34
trav: band sources()v3 6.48 µs6.45 µs 6.68 µs6.20 µs 23
trav: band sources()gpu 4.37 µs4.40 µs 4.56 µs4.25 µs 34
trav: band connectedNodes()v3 14.0 µs14.0 µs 14.1 µs13.9 µs 9
trav: band connectedNodes()gpu 4.96 µs4.99 µs 5.12 µs4.91 µs 30

algorithms N=2,000 · 4.6 minv4 (gpu) v3

algo: bfs (whole graph)
58×
algo: dfs (whole graph)
59×
algo: dijkstra + pathTo
56×
algo: aStar
3.4×
algo: bellmanFord
20×
algo: kruskal
28×
algo: tarjan SCC
33×
algo: hopcroft-tarjan biconnected
24×
algo: hierholzer (directed)
2.9×
algo: betweennessCentrality (unweighted)
11×
algo: degreeCentralityNormalized
37×
algo: closenessCentrality (one root)
70×
algo: degreeCentrality (one root)
34×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 50.2 ms53.2 ms 57.6 ms49.4 ms 9
algo: bfs (whole graph)gpu 866 µs891 µs 1.38 ms844 µs 781
algo: dfs (whole graph)v3 49.0 ms49.5 ms 51.7 ms48.1 ms 10
algo: dfs (whole graph)gpu 828 µs852 µs 1.38 ms792 µs 818
algo: dijkstra + pathTov3 52.6 ms53.6 ms 55.8 ms51.7 ms 10
algo: dijkstra + pathTogpu 938 µs955 µs 1.23 ms893 µs 729
algo: aStarv3 1.65 ms1.70 ms 2.38 ms1.58 ms 405
algo: aStargpu 489 µs505 µs 796 µs475 µs 1381
algo: bellmanFordv3 231 ms226 ms 244 ms204 ms 12
algo: bellmanFordgpu 11.7 ms11.8 ms 12.3 ms11.6 ms 56
algo: kruskalv3 13.0 ms14.0 ms 16.9 ms12.5 ms 45
algo: kruskalgpu 462 µs483 µs 950 µs449 µs 1443
algo: tarjan SCCv3 22.4 ms23.4 ms 27.2 ms21.2 ms 26
algo: tarjan SCCgpu 673 µs816 µs 4.90 ms627 µs 846
algo: hopcroft-tarjan biconnectedv3 84.9 ms85.8 ms 89.7 ms80.9 ms 12
algo: hopcroft-tarjan biconnectedgpu 3.53 ms3.65 ms 4.62 ms3.44 ms 185
algo: hierholzer (directed)v3 22.4 ms23.3 ms 28.6 ms21.3 ms 26
algo: hierholzer (directed)gpu 7.82 ms8.09 ms 12.2 ms7.58 ms 77
algo: betweennessCentrality (unweighted)v3 4.04 s4.06 s 4.13 s4.00 s 12
algo: betweennessCentrality (unweighted)gpu 360 ms376 ms 442 ms346 ms 12
algo: degreeCentralityNormalizedv3 14.4 ms15.4 ms 20.0 ms13.6 ms 41
algo: degreeCentralityNormalizedgpu 389 µs405 µs 807 µs376 µs 1718
algo: closenessCentrality (one root)v3 59.3 ms61.4 ms 67.9 ms58.1 ms 12
algo: closenessCentrality (one root)gpu 853 µs884 µs 1.40 ms828 µs 783
algo: degreeCentrality (one root)v3 7.40 µs7.26 µs 7.74 µs6.53 µs 20
algo: degreeCentrality (one root)gpu 218 ns225 ns 290 ns213 ns 751

algorithms N=500 · 10.4 minv4 (gpu) v3

algo: bfs (whole graph)
57×
algo: dfs (whole graph)
56×
algo: dijkstra + pathTo
49×
algo: aStar
3.5×
algo: bellmanFord
20×
algo: kruskal
25×
algo: tarjan SCC
34×
algo: hopcroft-tarjan biconnected
26×
algo: hierholzer (directed)
5.2×
algo: betweennessCentrality (unweighted)
12×
algo: degreeCentralityNormalized
37×
algo: closenessCentrality (one root)
69×
algo: degreeCentrality (one root)
35×
algo: pageRank (20 iters)
70×
algo: closenessCentrality (weighted, one root)
53×
algo: floydWarshall
1.93×
algo: closenessCentralityNormalized
1.78×
algo: markovClustering
1.11×
algo: hierarchicalClustering (threshold)
8.3×
algo: kMeans (fixed centroids)
4.6×
algo: kMedoids
8.7×
algo: fuzzyCMeans
11×
algo: affinityPropagation
5.1×
algo: kargerStein
1.04×
algo: betweennessCentrality (weighted)
8.8×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 12.7 ms13.1 ms 17.5 ms10.7 ms 49
algo: bfs (whole graph)gpu 224 µs233 µs 387 µs206 µs 2943
algo: dfs (whole graph)v3 11.4 ms12.3 ms 15.1 ms11.1 ms 53
algo: dfs (whole graph)gpu 204 µs214 µs 348 µs200 µs 3261
algo: dijkstra + pathTov3 11.8 ms12.5 ms 15.5 ms11.3 ms 52
algo: dijkstra + pathTogpu 240 µs254 µs 414 µs230 µs 2744
algo: aStarv3 443 µs453 µs 648 µs431 µs 1545
algo: aStargpu 127 µs132 µs 184 µs123 µs 5311
algo: bellmanFordv3 16.8 ms17.0 ms 17.9 ms16.5 ms 37
algo: bellmanFordgpu 824 µs888 µs 1.99 ms805 µs 782
algo: kruskalv3 3.25 ms3.58 ms 7.26 ms3.12 ms 188
algo: kruskalgpu 132 µs143 µs 268 µs125 µs 4805
algo: tarjan SCCv3 5.34 ms5.75 ms 9.38 ms5.21 ms 118
algo: tarjan SCCgpu 159 µs175 µs 316 µs151 µs 3948
algo: hopcroft-tarjan biconnectedv3 20.9 ms21.6 ms 24.0 ms19.4 ms 29
algo: hopcroft-tarjan biconnectedgpu 799 µs818 µs 1.14 ms776 µs 851
algo: hierholzer (directed)v3 4.28 ms4.60 ms 7.74 ms4.13 ms 142
algo: hierholzer (directed)gpu 821 µs852 µs 1.22 ms794 µs 798
algo: betweennessCentrality (unweighted)v3 253 ms255 ms 258 ms250 ms 12
algo: betweennessCentrality (unweighted)gpu 20.5 ms20.6 ms 21.0 ms20.2 ms 29
algo: degreeCentralityNormalizedv3 3.52 ms3.79 ms 7.18 ms3.40 ms 178
algo: degreeCentralityNormalizedgpu 94.8 µs99.2 µs 170 µs91.0 µs 7036
algo: closenessCentrality (one root)v3 14.3 ms15.1 ms 18.4 ms13.1 ms 42
algo: closenessCentrality (one root)gpu 206 µs216 µs 348 µs202 µs 3233
algo: degreeCentrality (one root)v3 7.60 µs7.58 µs 8.36 µs6.88 µs 19
algo: degreeCentrality (one root)gpu 216 ns224 ns 326 ns210 ns 757
algo: pageRank (20 iters)v3 2.81 ms3.01 ms 6.29 ms2.72 ms 225
algo: pageRank (20 iters)gpu 39.9 µs44.7 µs 162 µs38.7 µs 15517
algo: closenessCentrality (weighted, one root)v3 13.8 ms14.8 ms 18.0 ms13.2 ms 43
algo: closenessCentrality (weighted, one root)gpu 259 µs279 µs 496 µs249 µs 2508
algo: floydWarshallv3 249 ms273 ms 386 ms244 ms 12
algo: floydWarshallgpu 129 ms133 ms 138 ms127 ms 12
algo: closenessCentralityNormalizedv3 277 ms279 ms 286 ms272 ms 12
algo: closenessCentralityNormalizedgpu 155 ms174 ms 238 ms153 ms 12
algo: markovClusteringv3 4.17 s4.39 s 4.68 s4.08 s 12
algo: markovClusteringgpu 3.76 s3.76 s 3.78 s3.75 s 12
algo: hierarchicalClustering (threshold)v3 34.2 ms34.2 ms 34.9 ms33.5 ms 17
algo: hierarchicalClustering (threshold)gpu 4.12 ms4.28 ms 5.65 ms4.03 ms 158
algo: kMeans (fixed centroids)v3 8.94 ms9.02 ms 9.75 ms8.73 ms 74
algo: kMeans (fixed centroids)gpu 1.93 ms1.98 ms 3.10 ms1.87 ms 350
algo: kMedoidsv3 358 ms310 ms 391 ms142 ms 12
algo: kMedoidsgpu 41.2 ms39.9 ms 47.4 ms26.5 ms 15
algo: fuzzyCMeansv3 79.3 ms80.5 ms 84.0 ms77.2 ms 12
algo: fuzzyCMeansgpu 6.98 ms7.03 ms 7.67 ms6.68 ms 95
algo: affinityPropagationv3 209 ms211 ms 218 ms200 ms 12
algo: affinityPropagationgpu 40.8 ms59.3 ms 115 ms40.3 ms 12
algo: kargerSteinv3 318 ms323 ms 332 ms312 ms 12
algo: kargerSteingpu 307 ms309 ms 317 ms298 ms 12
algo: betweennessCentrality (weighted)v3 718 ms720 ms 729 ms711 ms 12
algo: betweennessCentrality (weighted)gpu 81.3 ms82.7 ms 82.4 ms79.9 ms 12

mappers N=2,000 · 23.9 s

mapper: bulk write, color — cpu eval
1.31 ms
mapper: bulk write, color — gpu path
175 µs
mapper: bulk write, color + size — cpu eval
1.60 ms
mapper: bulk write, color + size — gpu color / cpu size
1.50 ms
mapper: bulk write, mapped labels (round-5 path) — label refresh
4.06 ms
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
mapper: bulk write, colorcpu eval 1.31 ms1.36 ms 1.99 ms1.27 ms 513
mapper: bulk write, colorgpu path 175 µs185 µs 320 µs170 µs 3793
mapper: bulk write, color + sizecpu eval 1.60 ms1.63 ms 2.00 ms1.54 ms 425
mapper: bulk write, color + sizegpu color / cpu size 1.50 ms1.50 ms 1.70 ms1.43 ms 465
mapper: bulk write, mapped labels (round-5 path)label refresh 4.06 ms4.30 ms 6.93 ms3.48 ms 158

layouts N=2,000 · 1.5 minv4 (gpu) v3

layout: grid
94×
layout: preset
19×
layout: preset (fn form)
60×
layout: circle
12×
layout: concentric
28×
layout: breadthfirst
36×
layout: random
11×
layout: force (CPU executor, 20 iterations) — gpu
114 ms
layout: force seed — spectral vs scatter (20 iterations) — spectral (landmark MDS, the default)
112 ms
layout: force seed — spectral vs scatter (20 iterations) — scatter
56.5 ms
layout: plumbing (layoutPositions vs setPositions) — finisher
356 µs
layout: plumbing (layoutPositions vs setPositions) — bulk
31.5 µs
layout: contract fixed cost (empty impl vs bulk placement) — wrapper only
521 ns
layout: contract fixed cost (empty impl vs bulk placement) — wrapper + bulk write
39.4 µs
layout: scope (eles.layout, 10% of nodes)
10×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
layout: gridv3 12.1 ms12.5 ms 14.9 ms10.6 ms 51
layout: gridgpu 129 µs143 µs 615 µs80.4 µs 4649
layout: presetv3 5.75 ms6.03 ms 7.89 ms5.35 ms 104
layout: presetgpu 295 µs325 µs 718 µs287 µs 2130
layout: preset (fn form)v3 5.78 ms6.05 ms 8.82 ms5.24 ms 111
layout: preset (fn form)gpu 96.3 µs103 µs 352 µs93.5 µs 6508
layout: circlev3 9.65 ms10.2 ms 15.0 ms9.00 ms 64
layout: circlegpu 816 µs944 µs 2.89 ms803 µs 714
layout: concentricv3 31.6 ms31.3 ms 36.2 ms27.2 ms 18
layout: concentricgpu 1.15 ms1.32 ms 4.83 ms1.11 ms 512
layout: breadthfirstv3 388 ms399 ms 435 ms382 ms 12
layout: breadthfirstgpu 10.8 ms11.2 ms 15.9 ms10.2 ms 55
layout: randomv3 5.76 ms6.09 ms 9.39 ms5.17 ms 109
layout: randomgpu 537 µs603 µs 1.55 ms525 µs 1106
layout: force (CPU executor, 20 iterations)gpu 114 ms129 ms 143 ms109 ms 12
layout: force seed — spectral vs scatter (20 iterations)spectral (landmark MDS, the default) 112 ms113 ms 121 ms103 ms 12
layout: force seed — spectral vs scatter (20 iterations)scatter 56.5 ms60.7 ms 75.2 ms55.3 ms 12
layout: plumbing (layoutPositions vs setPositions)finisher 356 µs389 µs 912 µs348 µs 1779
layout: plumbing (layoutPositions vs setPositions)bulk 31.5 µs45.1 µs 259 µs29.3 µs 14800
layout: contract fixed cost (empty impl vs bulk placement)wrapper only 521 ns980 ns 3.86 µs510 ns 161
layout: contract fixed cost (empty impl vs bulk placement)wrapper + bulk write 39.4 µs41.8 µs 50.1 µs37.8 µs 12
layout: scope (eles.layout, 10% of nodes)v3 947 µs1.01 ms 2.33 ms905 µs 668
layout: scope (eles.layout, 10% of nodes)gpu 94.1 µs106 µs 262 µs92.2 µs 6522

style N=2,000 · 1.7 minv4 (gpu) v3

style: sheet swap (compile + applyAll)
5.8×
style: compile vs compile + apply — compile only (in batch)
24.6 µs
style: compile vs compile + apply — compile + apply
2.24 ms
style: first apply on add (256-node band)
1.94×
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — flat
2.26 ms
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — compound
2.72 ms
style: applyAll — constant vs state-case (the 57.1d partition) — constant sheet
2.25 ms
style: applyAll — constant vs state-case (the 57.1d partition) — state-case sheet
2.26 ms
style: applyAll — state-case vs data-case (what the partition avoids) — state-case sheet
2.24 ms
style: applyAll — state-case vs data-case (what the partition avoids) — data-case sheet
10.0 ms
style: select+unselect 256-band — constant vs state-case sheet — constant sheet (skips restyle)
6.77 µs
style: select+unselect 256-band — constant vs state-case sheet — paint-only state sheet (round-61 diff path)
32.9 µs
style: select+unselect 256-band — constant vs state-case sheet — state-case sheet (all channels; full write)
372 µs
style: read one prop (color)
1.73×
style: read one prop (width)
2.2×
style: numericStyle
2.9×
style: renderedStyle (one prop)
13×
style: whole-object style()
6.2×
style: bypass set (ele.style name,value)
4.1×
style: bypass set + removeStyle round-trip
5.8×
style: select+unselect 256-band under the default sheet — bypass punch-out — no bypasses (diff path; the O(0) gate row)
33.7 µs
style: select+unselect 256-band under the default sheet — bypass punch-out — 128 of 256 bypassed (punched out to merged writes)
226 µs
style: sheet swap (applyAll) — 0 vs 128 bypasses — no bypasses
2.43 ms
style: sheet swap (applyAll) — 0 vs 128 bypasses — 128 bypassed
8.90 ms
10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
style: sheet swap (compile + applyAll)v3 13.0 ms13.5 ms 16.5 ms12.5 ms 46
style: sheet swap (compile + applyAll)gpu 2.25 ms2.29 ms 2.67 ms2.19 ms 289
style: compile vs compile + applycompile only (in batch) 24.6 µs27.2 µs 36.2 µs23.8 µs 12
style: compile vs compile + applycompile + apply 2.24 ms2.28 ms 2.71 ms2.15 ms 305
style: first apply on add (256-node band)v3 1.41 ms1.68 ms 7.11 ms1.16 ms 403
style: first apply on add (256-node band)gpu 726 µs865 µs 2.62 ms698 µs 798
style: applyAll, flat vs compound (100 parents — the 14.6 partition)flat 2.26 ms2.35 ms 3.28 ms2.18 ms 295
style: applyAll, flat vs compound (100 parents — the 14.6 partition)compound 2.72 ms2.81 ms 4.70 ms2.62 ms 244
style: applyAll — constant vs state-case (the 57.1d partition)constant sheet 2.25 ms2.32 ms 3.19 ms2.18 ms 299
style: applyAll — constant vs state-case (the 57.1d partition)state-case sheet 2.26 ms2.30 ms 2.91 ms2.19 ms 301
style: applyAll — state-case vs data-case (what the partition avoids)state-case sheet 2.24 ms2.29 ms 2.82 ms2.20 ms 301
style: applyAll — state-case vs data-case (what the partition avoids)data-case sheet 10.0 ms10.1 ms 11.1 ms9.67 ms 62
style: select+unselect 256-band — constant vs state-case sheetconstant sheet (skips restyle) 6.77 µs6.80 µs 6.97 µs6.68 µs 20
style: select+unselect 256-band — constant vs state-case sheetpaint-only state sheet (round-61 diff path) 32.9 µs34.8 µs 75.1 µs31.8 µs 19130
style: select+unselect 256-band — constant vs state-case sheetstate-case sheet (all channels; full write) 372 µs389 µs 660 µs368 µs 1798
style: read one prop (color)v3 95.0 ns106 ns 624 ns87.0 ns 2006561
style: read one prop (color)gpu 54.8 ns59.4 ns 104 ns53.2 ns 2868
style: read one prop (width)v3 115 ns126 ns 435 ns100 ns 1868713
style: read one prop (width)gpu 51.9 ns56.1 ns 302 ns50.7 ns 3032
style: numericStylev3 141 ns133 ns 382 ns87.0 ns 1784946
style: numericStylegpu 48.9 ns52.0 ns 117 ns47.6 ns 3282
style: renderedStyle (one prop)v3 883 ns949 ns 1.98 µs844 ns 556273
style: renderedStyle (one prop)gpu 65.6 ns70.0 ns 225 ns62.7 ns 2441
style: whole-object style()v3 85.5 µs91.3 µs 187 µs83.8 µs 7610
style: whole-object style()gpu 13.8 µs15.2 µs 49.6 µs13.0 µs 44410
style: bypass set (ele.style name,value)v3 10.0 µs10.1 µs 10.7 µs9.69 µs 11
style: bypass set (ele.style name,value)gpu 2.46 µs2.76 µs 4.13 µs2.36 µs 55
style: bypass set + removeStyle round-tripv3 21.0 µs23.3 µs 50.0 µs20.1 µs 29070
style: bypass set + removeStyle round-tripgpu 3.60 µs3.62 µs 4.43 µs3.18 µs 42
style: select+unselect 256-band under the default sheet — bypass punch-outno bypasses (diff path; the O(0) gate row) 33.7 µs34.9 µs 65.9 µs32.7 µs 18977
style: select+unselect 256-band under the default sheet — bypass punch-out128 of 256 bypassed (punched out to merged writes) 226 µs237 µs 416 µs219 µs 2942
style: sheet swap (applyAll) — 0 vs 128 bypassesno bypasses 2.43 ms2.47 ms 3.06 ms2.33 ms 265
style: sheet swap (applyAll) — 0 vs 128 bypasses128 bypassed 8.90 ms9.06 ms 10.4 ms8.62 ms 73

style-bundle N=2,000 · 58.6 sv4 (gpu) v3

style( 'background-color' ) (was #4 in the switch)
1.12×
style( 'border-width' ) (was #6 in the switch)
1.15×
style( 'text-wrap' ) (was #73 in the switch)
1.70×
style( 'text-max-width' ) (was #74 in the switch)
1.73×
style( 'taxi-radius' ) (was #142 in the switch)
1.29×
style( 'target-distance-from-node' ) (was #150 in the switch)
1.27×
whole-object style() (gpu-only: v3 returns a different shape) — gpu node
13.4 µs
whole-object style() (gpu-only: v3 returns a different shape) — gpu edge
14.4 µs
colour-valued vs numeric reads (the string build) — gpu background-color (colour)
73.8 ns
colour-valued vs numeric reads (the string build) — gpu border-color (colour)
65.7 ns
colour-valued vs numeric reads (the string build) — gpu border-width (number)
67.1 ns
colour-valued vs numeric reads (the string build) — gpu width (number)
60.9 ns
the getters that ride readProp — gpu numericStyle( width )
62.9 ns
the getters that ride readProp — gpu effectiveOpacity()
20.6 ns
the getters that ride readProp — gpu renderedStyle( width )
77.2 ns
10 ns100 ns1 µs10 µs100 µs
All stats (table view)
groupbenchp50avgp99minsamples
style( 'background-color' ) (was #4 in the switch)v3 59.7 ns61.8 ns 99.9 ns56.8 ns 2775
style( 'background-color' ) (was #4 in the switch)gpu 53.4 ns56.2 ns 96.2 ns52.2 ns 3043
style( 'border-width' ) (was #6 in the switch)v3 61.5 ns62.9 ns 92.0 ns58.7 ns 2728
style( 'border-width' ) (was #6 in the switch)gpu 53.7 ns57.0 ns 116 ns52.0 ns 2997
style( 'text-wrap' ) (was #73 in the switch)v3 60.1 ns62.2 ns 97.1 ns58.8 ns 2751
style( 'text-wrap' ) (was #73 in the switch)gpu 35.3 ns36.1 ns 47.9 ns34.1 ns 4739
style( 'text-max-width' ) (was #74 in the switch)v3 59.5 ns63.1 ns 128 ns57.7 ns 2723
style( 'text-max-width' ) (was #74 in the switch)gpu 34.5 ns35.0 ns 46.1 ns33.1 ns 4898
style( 'taxi-radius' ) (was #142 in the switch)v3 63.4 ns65.4 ns 89.5 ns59.7 ns 2627
style( 'taxi-radius' ) (was #142 in the switch)gpu 49.3 ns55.4 ns 99.2 ns47.9 ns 3071
style( 'target-distance-from-node' ) (was #150 in the switch)v3 61.4 ns63.7 ns 92.2 ns59.2 ns 2695
style( 'target-distance-from-node' ) (was #150 in the switch)gpu 48.4 ns50.0 ns 96.5 ns47.1 ns 3423
whole-object style() (gpu-only: v3 returns a different shape)gpu node 13.4 µs14.7 µs 27.4 µs12.7 µs 45818
whole-object style() (gpu-only: v3 returns a different shape)gpu edge 14.4 µs15.6 µs 36.5 µs13.8 µs 43075
colour-valued vs numeric reads (the string build)gpu background-color (colour) 73.8 ns76.6 ns 119 ns71.5 ns 2232
colour-valued vs numeric reads (the string build)gpu border-color (colour) 65.7 ns68.3 ns 104 ns65.1 ns 2505
colour-valued vs numeric reads (the string build)gpu border-width (number) 67.1 ns68.9 ns 93.0 ns65.8 ns 2483
colour-valued vs numeric reads (the string build)gpu width (number) 60.9 ns63.7 ns 107 ns58.7 ns 2680
the getters that ride readPropgpu numericStyle( width ) 62.9 ns65.6 ns 103 ns62.0 ns 2610
the getters that ride readPropgpu effectiveOpacity() 20.6 ns21.3 ns 34.2 ns19.4 ns 8046
the getters that ride readPropgpu renderedStyle( width ) 77.2 ns80.3 ns 126 ns73.9 ns 2128

load N=2,000 · 58.6 sv4 (gpu) v3

load: init from the definition form (construct + dispose)
26×
load: v4 ingest forms (construct + dispose) — definition form
4.58 ms
load: v4 ingest forms (construct + dispose) — columnar form
3.26 ms
load: v4 ingest forms (construct + dispose) — wire buffer
2.86 ms
load: v4 ingest forms (construct + dispose) — def clone alone (control)
301 µs
load: conversion — toColumnarElements
693 µs
load: conversion — serializeElements (from columnar)
179 µs
load: conversion — serializeElements (from defs)
880 µs
load: conversion — deserializeElements
4.54 µs
load: export from a live graph — cy.serialize() (wire)
501 µs
load: export from a live graph — cy.json() (v4)
727 µs
load: cy.json()
2.8×
load: add a 256-node band (add + remove)
1.66×
load: add a 256-node band, v4 forms — definition form
2.26 ms
load: add a 256-node band, v4 forms — columnar form
1.71 ms
load: add a 256-node band, v4 forms — wire buffer
1.95 ms
1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
load: init from the definition form (construct + dispose)v3 135 ms147 ms 175 ms126 ms 12
load: init from the definition form (construct + dispose)gpu 5.19 ms7.00 ms 20.8 ms4.28 ms 88
load: v4 ingest forms (construct + dispose)definition form 4.58 ms6.56 ms 16.8 ms4.24 ms 102
load: v4 ingest forms (construct + dispose)columnar form 3.26 ms4.49 ms 13.3 ms3.20 ms 152
load: v4 ingest forms (construct + dispose)wire buffer 2.86 ms4.18 ms 12.5 ms2.73 ms 162
load: v4 ingest forms (construct + dispose)def clone alone (control) 301 µs592 µs 8.37 ms208 µs 1113
load: conversiontoColumnarElements 693 µs745 µs 1.29 ms673 µs 928
load: conversionserializeElements (from columnar) 179 µs360 µs 956 µs172 µs 1934
load: conversionserializeElements (from defs) 880 µs955 µs 1.83 ms856 µs 728
load: conversiondeserializeElements 4.54 µs4.44 µs 5.95 µs3.41 µs 29
load: export from a live graphcy.serialize() (wire) 501 µs571 µs 1.96 ms486 µs 1204
load: export from a live graphcy.json() (v4) 727 µs1.04 ms 6.38 ms707 µs 642
load: cy.json()v3 2.05 ms2.38 ms 5.30 ms1.98 ms 285
load: cy.json()gpu 738 µs813 µs 2.83 ms706 µs 856
load: add a 256-node band (add + remove)v3 3.67 ms4.40 ms 10.8 ms3.28 ms 149
load: add a 256-node band (add + remove)gpu 2.21 ms2.45 ms 7.77 ms1.49 ms 275
load: add a 256-node band, v4 formsdefinition form 2.26 ms2.35 ms 5.14 ms1.50 ms 291
load: add a 256-node band, v4 formscolumnar form 1.71 ms1.83 ms 3.50 ms1.26 ms 339
load: add a 256-node band, v4 formswire buffer 1.95 ms2.04 ms 3.82 ms1.39 ms 336

spatial N=2,000 · 1.9 minv4 (gpu) v3

pick: hit (the walk; one inside-test) — zoom 1
20.6 µs
pick: hit (the walk; one inside-test) — zoom 2
21.2 µs
pick: miss walk — exact vs 24 px touch halo (57.9) — exact
45.8 µs
pick: miss walk — exact vs 24 px touch halo (57.9) — padPx 24
44.5 µs
pick: shape inside-test, 2000 coincident misses — ellipse
89.0 µs
pick: shape inside-test, 2000 coincident misses — star
235 µs
pick: shape inside-test, 2000 coincident misses — round-hexagon
797 µs
pick: shape inside-test, 2000 coincident misses — barrel
681 µs
pick: shape inside-test, 2000 coincident misses — cut-rectangle
100 µs
pick: shape inside-test, 2000 coincident misses — polygon
212 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 1
800 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 2
790 µs
pick: background miss (full highWater walk) — gpu
45.2 µs
pick: label box in the scan (text-events) — text-events: no
45.1 µs
pick: label box in the scan (text-events) — text-events: yes
126 µs
box: elementsInBox by covered fraction — 10%
149 µs
box: elementsInBox by covered fraction — 50%
196 µs
box: elementsInBox by covered fraction — 100%
321 µs
box: label containment (boxSelectionIncludesLabels) — off
230 µs
box: label containment (boxSelectionIncludesLabels) — on
262 µs
box: overlap vs contain (straight edges) — contain
234 µs
box: overlap vs contain (straight edges) — overlap
485 µs
box: overlap vs contain (curved edges — the segment walk) — contain
1.28 ms
box: overlap vs contain (curved edges — the segment walk) — overlap
2.18 ms
bounds: whole-graph boundingBox()
5.9×
bounds: boundingBox, labels in vs out (v4) — includeLabels: true (default)
1.34 ms
bounds: boundingBox, labels in vs out (v4) — includeLabels: false
816 µs
bounds: cy.fit() (whole-graph scan)
33×
bounds: getFitViewport() (compute without committing)
33×
bounds: boundingBoxAt (v4 only) — gpu
2.63 ms
bounds: one node boundingBox()
1.61×
bounds: labelBoundingBox (v4 only) — gpu
429 ns
bounds: compound + taxi conservative scan (round 54, v4 only) — warm (curve bbs memoized)
76.7 µs
bounds: compound + taxi conservative scan (round 54, v4 only) — cold (geometry write per call)
151 µs
100 ns1 µs10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
pick: hit (the walk; one inside-test)zoom 1 20.6 µs21.4 µs 38.9 µs20.4 µs 32176
pick: hit (the walk; one inside-test)zoom 2 21.2 µs21.5 µs 21.9 µs20.7 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)exact 45.8 µs46.3 µs 46.9 µs45.5 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)padPx 24 44.5 µs46.2 µs 88.1 µs43.2 µs 15019
pick: shape inside-test, 2000 coincident missesellipse 89.0 µs92.7 µs 169 µs84.1 µs 7531
pick: shape inside-test, 2000 coincident missesstar 235 µs245 µs 317 µs226 µs 2855
pick: shape inside-test, 2000 coincident missesround-hexagon 797 µs809 µs 975 µs779 µs 865
pick: shape inside-test, 2000 coincident missesbarrel 681 µs697 µs 848 µs660 µs 1002
pick: shape inside-test, 2000 coincident missescut-rectangle 100 µs102 µs 142 µs97.5 µs 6872
pick: shape inside-test, 2000 coincident missespolygon 212 µs216 µs 264 µs208 µs 3243
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 1 800 µs812 µs 1.13 ms769 µs 862
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 2 790 µs809 µs 1.01 ms764 µs 865
pick: background miss (full highWater walk)gpu 45.2 µs45.7 µs 46.5 µs44.6 µs 12
pick: label box in the scan (text-events)text-events: no 45.1 µs45.5 µs 46.1 µs44.7 µs 12
pick: label box in the scan (text-events)text-events: yes 126 µs130 µs 216 µs121 µs 5343
box: elementsInBox by covered fraction10% 149 µs154 µs 256 µs148 µs 4530
box: elementsInBox by covered fraction50% 196 µs205 µs 356 µs191 µs 3371
box: elementsInBox by covered fraction100% 321 µs336 µs 790 µs312 µs 2065
box: label containment (boxSelectionIncludesLabels)off 230 µs240 µs 478 µs225 µs 2911
box: label containment (boxSelectionIncludesLabels)on 262 µs277 µs 631 µs254 µs 2520
box: overlap vs contain (straight edges)contain 234 µs244 µs 494 µs231 µs 2863
box: overlap vs contain (straight edges)overlap 485 µs504 µs 999 µs432 µs 1375
box: overlap vs contain (curved edges — the segment walk)contain 1.28 ms1.31 ms 1.85 ms1.25 ms 532
box: overlap vs contain (curved edges — the segment walk)overlap 2.18 ms2.23 ms 2.80 ms2.14 ms 311
bounds: whole-graph boundingBox()v3 7.76 ms7.94 ms 9.41 ms7.45 ms 84
bounds: whole-graph boundingBox()gpu 1.32 ms1.37 ms 1.86 ms1.29 ms 506
bounds: boundingBox, labels in vs out (v4)includeLabels: true (default) 1.34 ms1.38 ms 2.04 ms1.31 ms 503
bounds: boundingBox, labels in vs out (v4)includeLabels: false 816 µs842 µs 1.21 ms778 µs 829
bounds: cy.fit() (whole-graph scan)v3 7.73 ms8.03 ms 10.4 ms7.51 ms 83
bounds: cy.fit() (whole-graph scan)gpu 237 µs247 µs 342 µs233 µs 2824
bounds: getFitViewport() (compute without committing)v3 7.70 ms7.92 ms 9.50 ms7.33 ms 83
bounds: getFitViewport() (compute without committing)gpu 236 µs247 µs 430 µs229 µs 2832
bounds: boundingBoxAt (v4 only)gpu 2.63 ms2.71 ms 3.50 ms2.62 ms 247
bounds: one node boundingBox()v3 1.68 µs1.70 µs 2.17 µs1.63 µs 94
bounds: one node boundingBox()gpu 1.04 µs1.08 µs 1.76 µs993 ns 152
bounds: labelBoundingBox (v4 only)gpu 429 ns456 ns 1.09 µs419 ns 365
bounds: compound + taxi conservative scan (round 54, v4 only)warm (curve bbs memoized) 76.7 µs80.5 µs 190 µs76.0 µs 8661
bounds: compound + taxi conservative scan (round 54, v4 only)cold (geometry write per call) 151 µs157 µs 294 µs147 µs 4441

data N=2,000 · 1.4 minv4 (gpu) v3

data: bulk write, numeric column
20×
data: bulk write, dictionary string column (4 values)
16×
data: bulk write, one new dictionary entry per pass
18×
data: bulk write, object column (plain-array fallback)
21×
data: removeData (whole collection)
8.4×
data: read one numeric key
1.41×
data: read one string key (dictionary decode)
1.35×
data: read the whole object
2.2×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })
14×
query: data comparison ([weight > 3] vs { gt })
11×
query: two keys AND-ed
12×
query: membership ([bucket in ...] vs { in })
15×
query: predicate function (both sides)
6.0×
query: structural, parents (:parent vs { parent: true })
34×
query: structural, childless (:childless vs { parent: false })
13×
query: structural, orphans (:orphan vs { child: false })
32×
10 ns100 ns1 µs10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
data: bulk write, numeric columnv3 1.67 ms1.77 ms 3.33 ms1.62 ms 376
data: bulk write, numeric columngpu 84.3 µs87.5 µs 136 µs81.1 µs 7993
data: bulk write, dictionary string column (4 values)v3 1.77 ms1.81 ms 2.40 ms1.71 ms 369
data: bulk write, dictionary string column (4 values)gpu 109 µs114 µs 311 µs97.5 µs 6105
data: bulk write, one new dictionary entry per passv3 1.77 ms1.91 ms 3.27 ms1.73 ms 358
data: bulk write, one new dictionary entry per passgpu 99.7 µs104 µs 164 µs94.7 µs 6705
data: bulk write, object column (plain-array fallback)v3 1.77 ms1.85 ms 3.24 ms1.70 ms 374
data: bulk write, object column (plain-array fallback)gpu 83.3 µs87.3 µs 152 µs79.5 µs 8011
data: removeData (whole collection)v3 2.76 ms2.82 ms 3.97 ms2.65 ms 243
data: removeData (whole collection)gpu 328 µs340 µs 551 µs316 µs 2009
data: read one numeric keyv3 38.7 ns41.3 ns 118 ns36.7 ns 4159
data: read one numeric keygpu 27.5 ns28.6 ns 71.7 ns26.7 ns 5745
data: read one string key (dictionary decode)v3 41.9 ns43.9 ns 97.8 ns40.4 ns 3910
data: read one string key (dictionary decode)gpu 31.1 ns32.5 ns 46.8 ns30.5 ns 5285
data: read the whole objectv3 46.2 ns47.8 ns 76.0 ns43.8 ns 3598
data: read the whole objectgpu 21.0 ns22.3 ns 40.5 ns20.5 ns 7666
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })v3 664 µs683 µs 1.07 ms646 µs 1022
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })gpu 46.8 µs50.6 µs 125 µs41.1 µs 13650
query: data comparison ([weight > 3] vs { gt })v3 751 µs778 µs 1.17 ms740 µs 897
query: data comparison ([weight > 3] vs { gt })gpu 69.9 µs76.6 µs 221 µs58.2 µs 9026
query: two keys AND-edv3 796 µs816 µs 1.31 ms779 µs 854
query: two keys AND-edgpu 65.9 µs69.8 µs 145 µs65.0 µs 9956
query: membership ([bucket in ...] vs { in })v3 1.01 ms1.07 ms 2.10 ms980 µs 653
query: membership ([bucket in ...] vs { in })gpu 65.6 µs71.6 µs 140 µs61.9 µs 9554
query: predicate function (both sides)v3 661 µs689 µs 1.25 ms642 µs 1011
query: predicate function (both sides)gpu 110 µs114 µs 179 µs106 µs 6136
query: structural, parents (:parent vs { parent: true })v3 524 µs530 µs 622 µs512 µs 1321
query: structural, parents (:parent vs { parent: true })gpu 15.4 µs16.3 µs 19.3 µs15.1 µs 12
query: structural, childless (:childless vs { parent: false })v3 804 µs823 µs 1.25 ms784 µs 847
query: structural, childless (:childless vs { parent: false })gpu 61.3 µs79.5 µs 229 µs56.2 µs 8643
query: structural, orphans (:orphan vs { child: false })v3 499 µs512 µs 787 µs492 µs 1356
query: structural, orphans (:orphan vs { child: false })gpu 15.4 µs16.0 µs 15.6 µs15.1 µs 12

events N=2,000 · 1.3 minv4 (gpu) v3

emit: position write, no listeners
28×
emit: 1 core listener
8.5×
emit: 1 element (ref-qualified) listener
7.6×
emit: delegated (v3 selector vs v4 predicate)
8.0×
emit: 10 core listeners
6.1×
emit: on() + off() round-trip
2.2×
emit: flat vs phased (compound bubbling, 14.5) — orphan (flat emit)
285 ns
emit: flat vs phased (compound bubbling, 14.5) — child of 2 ancestors (phased)
834 ns
emit: flat vs phased, no listeners — orphan (flat)
77.0 ns
emit: flat vs phased, no listeners — child (phased)
483 ns
anim: start + stop, one element
1.37×
anim: start against a running animation (round-21 eviction) — disjoint channels (composes)
1.28 µs
anim: start against a running animation (round-21 eviction) — overlapping channels (evicts)
817 ns
anim: start + stop, 512-node collection
3.0×
anim: delay() (no channels touched)
1.59×
anim: controls (v4 only) — pause + resume
458 ns
anim: controls (v4 only) — reverse
896 ns
anim: viewport animate + stop
3.0×
10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
emit: position write, no listenersv3 1.31 µs1.37 µs 1.63 µs1.26 µs 115
emit: position write, no listenersgpu 47.3 ns50.2 ns 108 ns45.8 ns 3399
emit: 1 core listenerv3 1.44 µs1.50 µs 2.20 µs1.39 µs 102
emit: 1 core listenergpu 169 ns187 ns 342 ns165 ns 860
emit: 1 element (ref-qualified) listenerv3 1.38 µs1.46 µs 2.16 µs1.34 µs 107
emit: 1 element (ref-qualified) listenergpu 182 ns201 ns 925 ns180 ns 815
emit: delegated (v3 selector vs v4 predicate)v3 1.49 µs1.54 µs 2.71 µs1.43 µs 104
emit: delegated (v3 selector vs v4 predicate)gpu 185 ns199 ns 353 ns181 ns 803
emit: 10 core listenersv3 1.93 µs1.99 µs 2.44 µs1.89 µs 78
emit: 10 core listenersgpu 319 ns327 ns 494 ns311 ns 485
emit: on() + off() round-tripv3 470 ns562 ns 1.34 µs433 ns 283
emit: on() + off() round-tripgpu 212 ns254 ns 959 ns180 ns 648
emit: flat vs phased (compound bubbling, 14.5)orphan (flat emit) 285 ns347 ns 2.96 µs266 ns 970078
emit: flat vs phased (compound bubbling, 14.5)child of 2 ancestors (phased) 834 ns885 ns 1.22 µs796 ns 179
emit: flat vs phased, no listenersorphan (flat) 77.0 ns81.1 ns 156 ns73.9 ns 1959
emit: flat vs phased, no listenerschild (phased) 483 ns529 ns 1.88 µs469 ns 314
anim: start + stop, one elementv3 870 ns1.28 µs 3.42 µs798 ns 406979
anim: start + stop, one elementgpu 633 ns1.03 µs 4.70 µs587 ns 474950
anim: start against a running animation (round-21 eviction)disjoint channels (composes) 1.28 µs1.87 µs 3.78 µs1.07 µs 81
anim: start against a running animation (round-21 eviction)overlapping channels (evicts) 817 ns1.46 µs 3.83 µs790 ns 104
anim: start + stop, 512-node collectionv3 297 µs418 µs 1.09 ms290 µs 1496
anim: start + stop, 512-node collectiongpu 98.5 µs109 µs 165 µs94.8 µs 5850
anim: delay() (no channels touched)v3 676 ns967 ns 3.29 µs653 ns 165
anim: delay() (no channels touched)gpu 426 ns768 ns 2.85 µs417 ns 210
anim: controls (v4 only)pause + resume 458 ns739 ns 2.62 µs450 ns 207
anim: controls (v4 only)reverse 896 ns1.53 µs 3.47 µs877 ns 99
anim: viewport animate + stopv3 575 ns820 ns 3.06 µs559 ns 191
anim: viewport animate + stopgpu 191 ns214 ns 569 ns186 ns 741

store N=2,000 · 1.0 min

id index: set x 2000 (build) — gpu
264 µs
id index: single-key operations — get (probe)
65.8 ns
id index: single-key operations — has
51.6 ns
id index: single-key operations — idAt (memoized hit)
9.02 ns
id index: single-key operations — hashAt
7.01 ns
id index: remove + re-set (churn, drives the round-11 reclaim) — gpu
232 ns
adjacency: rebuild (4000 edges, two counting passes) — gpu
39.1 µs
adjacency: reads — outDegree (O(1))
6.26 ns
adjacency: reads — outEdges
45.2 ns
adjacency: reads — connectedEdges
117 ns
adjacency: addEdge + removeEdge (the overlay path) — gpu
140 ns
blob: write x 2000 (build) — gpu
104 µs
blob: single-record operations — rewrite in place (same length)
29.7 ns
blob: single-record operations — offsetOf
4.28 ns
blob: single-record operations — free + rewrite
152 ns
dirty: mark (per-write span coalescing) — contiguous marks
12.8 ns
dirty: mark (per-write span coalescing) — scattered marks
17.8 ns
dirty: take (a frame's drain) — gpu
598 ns
images: registry bookkeeping — acquire (existing url)
205 ns
images: registry bookkeeping — acquire (new url) + release
535 ns
charts: sheet apply, chart vs no chart — no chart
2.22 ms
charts: sheet apply, chart vs no chart — pie from data (blob record per node)
2.69 ms
charts: data write refreshing chart-values — gpu
1.49 ms
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
id index: set x 2000 (build)gpu 264 µs275 µs 449 µs253 µs 2548
id index: single-key operationsget (probe) 65.8 ns66.8 ns 138 ns54.5 ns 2547
id index: single-key operationshas 51.6 ns53.4 ns 84.2 ns49.6 ns 3204
id index: single-key operationsidAt (memoized hit) 9.02 ns9.51 ns 18.3 ns8.71 ns 17824
id index: single-key operationshashAt 7.01 ns7.23 ns 14.0 ns6.79 ns 23430
id index: remove + re-set (churn, drives the round-11 reclaim)gpu 232 ns239 ns 357 ns226 ns 700
adjacency: rebuild (4000 edges, two counting passes)gpu 39.1 µs46.4 µs 224 µs36.8 µs 14940
adjacency: readsoutDegree (O(1)) 6.26 ns6.37 ns 9.47 ns5.95 ns 26642
adjacency: readsoutEdges 45.2 ns46.5 ns 69.7 ns43.5 ns 3678
adjacency: readsconnectedEdges 117 ns177 ns 2.05 µs113 ns 947
adjacency: addEdge + removeEdge (the overlay path)gpu 140 ns144 ns 192 ns139 ns 1181
blob: write x 2000 (build)gpu 104 µs127 µs 672 µs100 µs 5491
blob: single-record operationsrewrite in place (same length) 29.7 ns30.5 ns 44.5 ns28.7 ns 5607
blob: single-record operationsoffsetOf 4.28 ns4.42 ns 9.87 ns4.09 ns 38063
blob: single-record operationsfree + rewrite 152 ns172 ns 495 ns147 ns 991
dirty: mark (per-write span coalescing)contiguous marks 12.8 ns13.3 ns 23.5 ns12.4 ns 12786
dirty: mark (per-write span coalescing)scattered marks 17.8 ns18.2 ns 28.1 ns17.4 ns 9343
dirty: take (a frame's drain)gpu 598 ns699 ns 1.27 µs582 ns 236
images: registry bookkeepingacquire (existing url) 205 ns208 ns 253 ns202 ns 821
images: registry bookkeepingacquire (new url) + release 535 ns602 ns 2.27 µs517 ns 272
charts: sheet apply, chart vs no chartno chart 2.22 ms2.28 ms 3.28 ms2.13 ms 297
charts: sheet apply, chart vs no chartpie from data (blob record per node) 2.69 ms2.72 ms 3.11 ms2.58 ms 252
charts: data write refreshing chart-valuesgpu 1.49 ms1.53 ms 2.55 ms1.44 ms 453

surface N=2,000 · 8.8 minv4 (gpu) v3

viewport: zoom() get
4.7×
viewport: zoom( n ) set
1.90×
viewport: pan() get
1.09×
viewport: pan( p ) set
1.79×
viewport: panBy()
1.64×
viewport: extent()
1.50×
viewport: renderedExtent()
1.63×
viewport: width() + height() + size() (3 calls)
2.9×
viewport: minZoom/maxZoom get (2 calls)
15×
viewport: center( eles )
18×
viewport: reset()
105×
viewport: viewport({ zoom, pan })
59×
viewport: getCenterPan( eles ) — gpu
6.59 µs
core: instanceString + headless + styleEnabled (3 calls)
1.27×
core: hasElementWithId + hasCompoundNodes (2 calls)
1.19×
core: options()
87×
core: mutableElements() (v4 materializes; v3 is O(1))
1.36×
core: gating getters (5 calls)
1.18×
core: gating setters round-trip (autolock/autoungrabify/autounselectify)
1.90×
core: interaction tuning getters (5 calls) — gpu
7.26 ns
core: graph data() set + get (v3 restyles the graph)
8137×
core: graph scratch() set + get (v3 restyles the graph)
16367×
core: batch( fn ) (empty)
6.3×
core: startBatch + endBatch + batching
5.9×
core: collection()
7.2×
core: compact() (no dead slots — the early-out) — gpu
17.0 µs
collection: element accessors (id/group/isNode/isEdge, 4 calls)
1.76×
collection: length + empty + nonempty (3 calls)
4.6×
collection: eq/first/last (3 calls)
2.3×
collection: slice()
2.2×
collection: toArray()
12×
collection: sort( fn )
1.62×
collection: reduce( fn )
1.40×
collection: min + max ( fn ) (2 calls)
2.0×
collection: some + every (2 calls)
1.62×
collection: same + anySame + contains (3 calls)
75×
collection: allAre (all match: the full walk)
1.55×
collection: is (none match: the full walk)
2.5×
collection: union
6.0×
collection: intersection
29×
collection: difference
29×
collection: symmetricDifference
3.7×
collection: absoluteComplement
15×
collection: byGroup
3.0×
collection: diff
3.3×
collection: indexOf
1.50×
traversal: openNeighborhood + closedNeighborhood (2 calls)
2.9×
traversal: connectedNodes
3.3×
traversal: sources + targets (2 calls)
3.4×
traversal: source() + target() (2 calls)
1.35×
traversal: edgesWith
1.27×
traversal: edgesTo
1.28×
traversal: parallelEdges + codirectedEdges (2 calls)
3.5×
traversal: roots + leaves (2 calls)
13×
traversal: allAreNeighbors
5.3×
traversal: isLoop + isSimple (2 calls)
3.1×
degree: indegree + outdegree (2 calls)
77×
degree: minDegree + maxDegree (2 calls)
44×
degree: minIndegree + maxOutdegree (2 calls)
26×
dimensions: renderedPosition get
2.4×
dimensions: relativePosition get
11×
dimensions: width + height + outerWidth + outerHeight (4 calls)
2.7×
dimensions: rendered dims (4 calls)
3.0×
dimensions: renderedBoundingBox
1.93×
dimensions: midpoint + renderedMidpoint (2 calls) — gpu
1.17 µs
dimensions: source/targetEndpoint (2 calls) — gpu
386 ns
dimensions: rendered source/targetEndpoint (2 calls) — gpu
408 ns
dimensions: shift + silentShift (round-trip)
61×
dimensions: silentPosition
16×
dimensions: positions( fn ) over 100
50×
dimensions: padding + paddedWidth + paddedHeight (3 calls)
13×
curves: isBundledBezier — gpu
25.4 ns
curves: controlPoints + renderedControlPoints (2 calls) — gpu
532 ns
curves: segmentPoints (undefined for bezier) — gpu
41.9 ns
compound: parent + parents + ancestors (3 calls)
3.7×
compound: children + descendants + siblings (3 calls)
4.8×
compound: orphans + nonorphans (2 calls)
6.9×
compound: commonAncestors
124×
compound: isParent/isChild/isChildless/isOrphan (4 calls)
1.56×
flags: select + unselect + selected (band)
15×
flags: selectify + unselectify + selectable
88×
flags: lock + unlock + locked
88×
flags: grabify + ungrabify + grabbable
87×
flags: show + hide + visible
227×
flags: active/activate/unactivate (3 calls)
15×
flags: panify + unpanify + pannable
89×
flags: takesUpSpace + interactive + transparent (3 calls)
3.1×
flags: effectiveOpacity
2.3×
element data: scratch get + set
7.6×
element data: json() one element
2.1×
element data: jsons() over 100
1.99×
element data: label() — gpu
15.2 ns
core: batchData()
8.0×
core: animated()
4.9×
core: zoomRange get — gpu
2.16 ns
core: forceRender() (headless no-op)
14×
core: resize() / invalidateSize()
2.4×
core: onRender + offRender
2.4×
core: removeScratch()
8942×
core: selectionType get
1.99×
core: isReady()
2.2×
core: window()
2.8×
core: container()
2.7×
core: destroyed()
2.2×
core: removeAllListeners()
8.5×
collection: cy()
3.6×
collection: indexOfId()
1.79×
collection: removed() + inside() (2 calls)
1.17×
collection: silentPositions( fn ) over 100
30×
collection: animated()
2.9×
collection: delayAnimation()
2.8×
collection: removeScratch()
9.0×
collection: component()
43×
collection: layoutDimensions()
3.6×
degree: maxIndegree + minOutdegree (2 calls)
25×
flags: grabbed + hidden + inactive (3 calls)
1.99×
curves: renderedSegmentPoints — gpu
36.7 ns
layout contract: edgeSlots + endpoints + degreeOf — gpu
34.6 µs
formats: isColumnarElements + isSerializedElements + isPackedIds — gpu
4.61 ns
0.100 ns1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
viewport: zoom() getv3 5.63 ns5.74 ns 9.22 ns5.45 ns 28768
viewport: zoom() getgpu 1.21 ns1.24 ns 1.75 ns1.21 ns 128095
viewport: zoom( n ) setv3 612 ns619 ns 711 ns590 ns 267
viewport: zoom( n ) setgpu 321 ns326 ns 368 ns308 ns 516
viewport: pan() getv3 5.43 ns5.64 ns 11.9 ns5.17 ns 29859
viewport: pan() getgpu 4.96 ns5.22 ns 12.7 ns4.85 ns 32302
viewport: pan( p ) setv3 611 ns645 ns 1.03 µs598 ns 259
viewport: pan( p ) setgpu 342 ns356 ns 596 ns325 ns 475
viewport: panBy()v3 566 ns573 ns 692 ns554 ns 292
viewport: panBy()gpu 344 ns350 ns 693 ns311 ns 481
viewport: extent()v3 29.7 ns45.2 ns 196 ns28.4 ns 3742
viewport: extent()gpu 19.8 ns27.8 ns 114 ns18.3 ns 6082
viewport: renderedExtent()v3 27.0 ns28.7 ns 58.4 ns25.6 ns 5866
viewport: renderedExtent()gpu 16.5 ns23.9 ns 103 ns15.3 ns 7071
viewport: width() + height() + size() (3 calls)v3 21.1 ns21.8 ns 43.2 ns20.1 ns 7821
viewport: width() + height() + size() (3 calls)gpu 7.18 ns7.58 ns 15.7 ns6.97 ns 22273
viewport: minZoom/maxZoom get (2 calls)v3 14.8 ns15.4 ns 25.0 ns14.4 ns 11066
viewport: minZoom/maxZoom get (2 calls)gpu 0.999 ns1.07 ns 2.00 ns0.997 ns 146337
viewport: center( eles )v3 117 µs122 µs 186 µs112 µs 5706
viewport: center( eles )gpu 6.57 µs6.58 µs 6.72 µs6.44 µs 21
viewport: reset()v3 938 ns1.02 µs 1.57 µs909 ns 161
viewport: reset()gpu 8.96 ns9.27 ns 17.6 ns8.52 ns 18142
viewport: viewport({ zoom, pan })v3 939 ns1.02 µs 1.56 µs910 ns 161
viewport: viewport({ zoom, pan })gpu 16.0 ns16.8 ns 38.6 ns15.2 ns 10118
viewport: getCenterPan( eles )gpu 6.59 µs6.64 µs 6.84 µs6.54 µs 22
core: instanceString + headless + styleEnabled (3 calls)v3 32.6 ns34.0 ns 60.0 ns31.6 ns 5013
core: instanceString + headless + styleEnabled (3 calls)gpu 25.8 ns27.0 ns 52.0 ns24.9 ns 6313
core: hasElementWithId + hasCompoundNodes (2 calls)v3 39.3 ns40.2 ns 51.0 ns38.1 ns 4268
core: hasElementWithId + hasCompoundNodes (2 calls)gpu 33.0 ns34.1 ns 46.5 ns32.4 ns 5005
core: options()v3 93.4 ns97.9 ns 167 ns92.7 ns 1744
core: options()gpu 1.07 ns1.18 ns 2.20 ns1.05 ns 135407
core: mutableElements() (v4 materializes; v3 is O(1))v3 3.19 ns3.32 ns 6.59 ns3.14 ns 50247
core: mutableElements() (v4 materializes; v3 is O(1))gpu 2.35 ns2.40 ns 5.52 ns2.25 ns 68972
core: gating getters (5 calls)v3 15.7 ns16.1 ns 24.1 ns15.0 ns 10645
core: gating getters (5 calls)gpu 13.3 ns13.8 ns 24.6 ns12.5 ns 12416
core: gating setters round-trip (autolock/autoungrabify/autounselectify)v3 11.4 ns12.2 ns 21.6 ns10.8 ns 13924
core: gating setters round-trip (autolock/autoungrabify/autounselectify)gpu 6.03 ns6.37 ns 14.3 ns5.79 ns 26630
core: interaction tuning getters (5 calls)gpu 7.26 ns7.69 ns 16.3 ns7.15 ns 22081
core: graph data() set + get (v3 restyles the graph)v3 2.68 ms2.71 ms 3.76 ms2.50 ms 255
core: graph data() set + get (v3 restyles the graph)gpu 329 ns336 ns 424 ns321 ns 504
core: graph scratch() set + get (v3 restyles the graph)v3 2.71 ms2.71 ms 3.63 ms2.48 ms 254
core: graph scratch() set + get (v3 restyles the graph)gpu 165 ns170 ns 255 ns164 ns 1003
core: batch( fn ) (empty)v3 533 ns641 ns 1.64 µs510 ns 262
core: batch( fn ) (empty)gpu 84.9 ns87.8 ns 123 ns83.3 ns 1926
core: startBatch + endBatch + batchingv3 530 ns644 ns 1.71 µs496 ns 261
core: startBatch + endBatch + batchinggpu 89.6 ns164 ns 3.00 µs86.4 ns 1005
core: collection()v3 448 ns531 ns 1.56 µs439 ns 316
core: collection()gpu 62.0 ns65.8 ns 150 ns59.5 ns 2580
core: compact() (no dead slots — the early-out)gpu 17.0 µs21.5 µs 95.3 µs16.4 µs 31800
collection: element accessors (id/group/isNode/isEdge, 4 calls)v3 60.8 ns65.8 ns 200 ns57.3 ns 2584
collection: element accessors (id/group/isNode/isEdge, 4 calls)gpu 34.5 ns36.4 ns 73.4 ns33.7 ns 4647
collection: length + empty + nonempty (3 calls)v3 6.72 ns6.92 ns 12.5 ns6.34 ns 24549
collection: length + empty + nonempty (3 calls)gpu 1.47 ns1.52 ns 1.99 ns1.44 ns 106292
collection: eq/first/last (3 calls)v3 15.2 ns15.6 ns 24.7 ns14.9 ns 10896
collection: eq/first/last (3 calls)gpu 6.64 ns6.91 ns 14.1 ns6.33 ns 24560
collection: slice()v3 3.73 µs3.82 µs 4.23 µs3.59 µs 41
collection: slice()gpu 1.72 µs1.73 µs 1.89 µs1.67 µs 94
collection: toArray()v3 8.85 µs8.97 µs 9.29 µs8.69 µs 15
collection: toArray()gpu 757 ns770 ns 933 ns718 ns 212
collection: sort( fn )v3 14.7 µs15.1 µs 15.4 µs14.1 µs 12
collection: sort( fn )gpu 9.10 µs9.14 µs 9.36 µs8.99 µs 15
collection: reduce( fn )v3 157 ns160 ns 188 ns117 ns 1062
collection: reduce( fn )gpu 112 ns113 ns 130 ns111 ns 1509
collection: min + max ( fn ) (2 calls)v3 11.3 µs11.3 µs 11.6 µs11.0 µs 11
collection: min + max ( fn ) (2 calls)gpu 5.60 µs5.63 µs 5.92 µs5.50 µs 26
collection: some + every (2 calls)v3 894 ns908 ns 1.04 µs883 ns 183
collection: some + every (2 calls)gpu 551 ns559 ns 595 ns549 ns 304
collection: same + anySame + contains (3 calls)v3 7.58 µs7.71 µs 8.26 µs7.48 µs 18
collection: same + anySame + contains (3 calls)gpu 101 ns105 ns 178 ns98.2 ns 1627
collection: allAre (all match: the full walk)v3 3.64 µs3.65 µs 4.02 µs3.41 µs 42
collection: allAre (all match: the full walk)gpu 2.34 µs2.40 µs 2.84 µs2.34 µs 64
collection: is (none match: the full walk)v3 5.67 µs5.71 µs 6.01 µs5.42 µs 26
collection: is (none match: the full walk)gpu 2.27 µs2.32 µs 3.38 µs2.22 µs 68
collection: unionv3 98.3 µs108 µs 158 µs94.4 µs 6405
collection: uniongpu 16.4 µs16.6 µs 16.8 µs15.7 µs 12
collection: intersectionv3 93.5 µs104 µs 180 µs90.6 µs 6638
collection: intersectiongpu 3.21 µs3.24 µs 3.47 µs3.16 µs 48
collection: differencev3 93.0 µs105 µs 212 µs91.6 µs 6610
collection: differencegpu 3.16 µs3.18 µs 3.49 µs3.10 µs 49
collection: symmetricDifferencev3 24.6 µs25.0 µs 25.0 µs24.4 µs 12
collection: symmetricDifferencegpu 6.58 µs6.62 µs 6.81 µs6.48 µs 22
collection: absoluteComplementv3 6.23 ms6.74 ms 10.5 ms6.04 ms 100
collection: absoluteComplementgpu 410 µs419 µs 549 µs404 µs 1670
collection: byGroupv3 995 µs1.01 ms 1.25 ms984 µs 692
collection: byGroupgpu 328 µs341 µs 615 µs314 µs 2054
collection: diffv3 37.3 µs37.5 µs 38.8 µs35.1 µs 12
collection: diffgpu 11.3 µs11.4 µs 12.0 µs9.84 µs 11
collection: indexOfv3 34.9 ns36.4 ns 75.9 ns34.0 ns 4696
collection: indexOfgpu 23.4 ns24.3 ns 42.8 ns22.5 ns 7044
traversal: openNeighborhood + closedNeighborhood (2 calls)v3 9.54 µs9.77 µs 10.5 µs9.39 µs 14
traversal: openNeighborhood + closedNeighborhood (2 calls)gpu 3.25 µs3.43 µs 4.01 µs3.08 µs 45
traversal: connectedNodesv3 1.02 µs1.11 µs 1.88 µs983 ns 149
traversal: connectedNodesgpu 311 ns320 ns 479 ns304 ns 531
traversal: sources + targets (2 calls)v3 1.77 µs1.96 µs 2.73 µs1.71 µs 84
traversal: sources + targets (2 calls)gpu 528 ns734 ns 2.40 µs514 ns 226
traversal: source() + target() (2 calls)v3 77.4 ns79.4 ns 118 ns64.5 ns 2154
traversal: source() + target() (2 calls)gpu 57.3 ns59.4 ns 99.2 ns54.0 ns 2877
traversal: edgesWithv3 68.3 µs70.5 µs 118 µs67.0 µs 9881
traversal: edgesWithgpu 53.5 µs54.0 µs 56.8 µs52.7 µs 12
traversal: edgesTov3 68.2 µs70.3 µs 118 µs66.8 µs 9894
traversal: edgesTogpu 53.2 µs53.8 µs 55.2 µs52.7 µs 12
traversal: parallelEdges + codirectedEdges (2 calls)v3 3.75 µs3.98 µs 4.77 µs3.57 µs 39
traversal: parallelEdges + codirectedEdges (2 calls)gpu 1.08 µs1.30 µs 2.15 µs1.05 µs 124
traversal: roots + leaves (2 calls)v3 5.05 ms5.47 ms 9.04 ms4.87 ms 124
traversal: roots + leaves (2 calls)gpu 387 µs396 µs 584 µs379 µs 1768
traversal: allAreNeighborsv3 198 µs213 µs 363 µs193 µs 3270
traversal: allAreNeighborsgpu 37.3 µs37.7 µs 38.3 µs37.0 µs 12
traversal: isLoop + isSimple (2 calls)v3 156 ns158 ns 178 ns145 ns 1062
traversal: isLoop + isSimple (2 calls)gpu 50.3 ns51.8 ns 75.3 ns49.3 ns 3299
degree: indegree + outdegree (2 calls)v3 3.59 µs3.95 µs 4.77 µs3.46 µs 39
degree: indegree + outdegree (2 calls)gpu 46.8 ns48.2 ns 76.2 ns46.0 ns 3544
degree: minDegree + maxDegree (2 calls)v3 16.3 ms17.6 ms 21.6 ms15.8 ms 35
degree: minDegree + maxDegree (2 calls)gpu 370 µs376 µs 505 µs363 µs 1851
degree: minIndegree + maxOutdegree (2 calls)v3 9.22 ms10.0 ms 14.0 ms8.99 ms 66
degree: minIndegree + maxOutdegree (2 calls)gpu 359 µs368 µs 594 µs348 µs 1910
dimensions: renderedPosition getv3 73.7 ns77.4 ns 144 ns72.1 ns 2196
dimensions: renderedPosition getgpu 30.5 ns33.9 ns 108 ns29.0 ns 4976
dimensions: relativePosition getv3 860 ns880 ns 1.15 µs836 ns 189
dimensions: relativePosition getgpu 76.1 ns81.7 ns 192 ns74.1 ns 2073
dimensions: width + height + outerWidth + outerHeight (4 calls)v3 618 ns624 ns 666 ns613 ns 273
dimensions: width + height + outerWidth + outerHeight (4 calls)gpu 232 ns234 ns 260 ns226 ns 726
dimensions: rendered dims (4 calls)v3 717 ns721 ns 782 ns706 ns 235
dimensions: rendered dims (4 calls)gpu 238 ns241 ns 260 ns238 ns 710
dimensions: renderedBoundingBoxv3 1.79 µs1.81 µs 2.16 µs1.74 µs 89
dimensions: renderedBoundingBoxgpu 926 ns942 ns 1.12 µs900 ns 175
dimensions: midpoint + renderedMidpoint (2 calls)gpu 1.17 µs1.18 µs 1.30 µs1.13 µs 139
dimensions: source/targetEndpoint (2 calls)gpu 386 ns393 ns 443 ns382 ns 431
dimensions: rendered source/targetEndpoint (2 calls)gpu 408 ns414 ns 511 ns398 ns 410
dimensions: shift + silentShift (round-trip)v3 292 µs304 µs 570 µs285 µs 2301
dimensions: shift + silentShift (round-trip)gpu 4.82 µs4.84 µs 5.02 µs4.74 µs 31
dimensions: silentPositionv3 903 ns917 ns 1.14 µs861 ns 183
dimensions: silentPositiongpu 55.8 ns58.3 ns 83.8 ns54.8 ns 2915
dimensions: positions( fn ) over 100v3 178 µs183 µs 250 µs173 µs 3816
dimensions: positions( fn ) over 100gpu 3.54 µs3.57 µs 3.81 µs3.47 µs 44
dimensions: padding + paddedWidth + paddedHeight (3 calls)v3 2.03 µs2.04 µs 2.21 µs1.98 µs 80
dimensions: padding + paddedWidth + paddedHeight (3 calls)gpu 161 ns163 ns 201 ns155 ns 1052
curves: isBundledBeziergpu 25.4 ns26.0 ns 35.7 ns21.2 ns 6538
curves: controlPoints + renderedControlPoints (2 calls)gpu 532 ns547 ns 804 ns526 ns 300
curves: segmentPoints (undefined for bezier)gpu 41.9 ns43.7 ns 81.3 ns36.0 ns 3910
compound: parent + parents + ancestors (3 calls)v3 3.06 µs3.34 µs 4.17 µs2.94 µs 47
compound: parent + parents + ancestors (3 calls)gpu 817 ns1.15 µs 2.42 µs793 ns 140
compound: children + descendants + siblings (3 calls)v3 8.79 µs8.86 µs 9.80 µs7.89 µs 16
compound: children + descendants + siblings (3 calls)gpu 1.83 µs2.37 µs 3.87 µs1.78 µs 66
compound: orphans + nonorphans (2 calls)v3 3.71 µs4.01 µs 4.82 µs3.58 µs 38
compound: orphans + nonorphans (2 calls)gpu 539 ns783 ns 3.18 µs531 ns 212
compound: commonAncestorsv3 9.59 µs9.67 µs 10.2 µs9.25 µs 14
compound: commonAncestorsgpu 77.1 ns80.2 ns 132 ns73.9 ns 2121
compound: isParent/isChild/isChildless/isOrphan (4 calls)v3 70.6 ns73.5 ns 118 ns69.7 ns 2336
compound: isParent/isChild/isChildless/isOrphan (4 calls)gpu 45.3 ns47.2 ns 76.1 ns43.2 ns 3616
flags: select + unselect + selected (band)v3 181 µs190 µs 391 µs178 µs 3686
flags: select + unselect + selected (band)gpu 12.1 µs12.2 µs 12.3 µs11.9 µs 10
flags: selectify + unselectify + selectablev3 181 µs186 µs 316 µs176 µs 3758
flags: selectify + unselectify + selectablegpu 2.05 µs2.08 µs 2.45 µs2.00 µs 79
flags: lock + unlock + lockedv3 179 µs185 µs 294 µs174 µs 3785
flags: lock + unlock + lockedgpu 2.04 µs2.05 µs 2.24 µs2.01 µs 80
flags: grabify + ungrabify + grabbablev3 178 µs184 µs 295 µs175 µs 3805
flags: grabify + ungrabify + grabbablegpu 2.04 µs2.04 µs 2.14 µs1.99 µs 80
flags: show + hide + visiblev3 2.57 ms2.71 ms 4.03 ms2.49 ms 253
flags: show + hide + visiblegpu 11.3 µs11.3 µs 11.4 µs11.2 µs 11
flags: active/activate/unactivate (3 calls)v3 180 µs185 µs 286 µs176 µs 3772
flags: active/activate/unactivate (3 calls)gpu 11.9 µs11.9 µs 12.0 µs11.8 µs 11
flags: panify + unpanify + pannablev3 182 µs188 µs 345 µs176 µs 3706
flags: panify + unpanify + pannablegpu 2.03 µs2.04 µs 2.22 µs1.99 µs 81
flags: takesUpSpace + interactive + transparent (3 calls)v3 195 ns201 ns 298 ns194 ns 852
flags: takesUpSpace + interactive + transparent (3 calls)gpu 63.3 ns65.6 ns 90.5 ns62.0 ns 2606
flags: effectiveOpacityv3 49.1 ns50.1 ns 60.7 ns46.9 ns 3429
flags: effectiveOpacitygpu 21.3 ns21.6 ns 31.3 ns20.6 ns 7947
element data: scratch get + setv3 1.30 µs1.32 µs 1.59 µs1.26 µs 125
element data: scratch get + setgpu 171 ns177 ns 267 ns166 ns 966
element data: json() one elementv3 300 ns389 ns 3.46 µs292 ns 421
element data: json() one elementgpu 141 ns183 ns 542 ns137 ns 875
element data: jsons() over 100v3 39.8 µs40.4 µs 42.6 µs37.2 µs 12
element data: jsons() over 100gpu 20.0 µs21.0 µs 24.0 µs16.3 µs 12
element data: label()gpu 15.2 ns15.9 ns 27.1 ns14.5 ns 10799
core: batchData()v3 2.29 µs2.41 µs 3.06 µs2.25 µs 66
core: batchData()gpu 285 ns380 ns 2.26 µs279 ns 432
core: animated()v3 7.53 ns7.81 ns 13.9 ns7.37 ns 21723
core: animated()gpu 1.53 ns1.60 ns 2.35 ns1.50 ns 103231
core: zoomRange getgpu 2.16 ns2.28 ns 6.12 ns2.05 ns 73373
core: forceRender() (headless no-op)v3 20.1 ns20.8 ns 32.9 ns19.6 ns 8235
core: forceRender() (headless no-op)gpu 1.48 ns1.54 ns 1.94 ns1.48 ns 106961
core: resize() / invalidateSize()v3 304 ns308 ns 378 ns297 ns 546
core: resize() / invalidateSize()gpu 127 ns131 ns 163 ns126 ns 1300
core: onRender + offRenderv3 472 ns549 ns 1.26 µs457 ns 306
core: onRender + offRendergpu 194 ns240 ns 758 ns189 ns 696
core: removeScratch()v3 2.50 ms2.58 ms 4.14 ms2.39 ms 266
core: removeScratch()gpu 279 ns285 ns 387 ns268 ns 596
core: selectionType getv3 4.51 ns4.79 ns 9.74 ns4.35 ns 35404
core: selectionType getgpu 2.26 ns2.46 ns 6.18 ns2.10 ns 68002
core: isReady()v3 3.25 ns3.37 ns 4.56 ns3.25 ns 49944
core: isReady()gpu 1.48 ns1.53 ns 1.87 ns1.48 ns 107680
core: window()v3 4.11 ns4.28 ns 7.79 ns4.10 ns 39371
core: window()gpu 1.48 ns1.54 ns 1.98 ns1.45 ns 107056
core: container()v3 3.94 ns4.08 ns 7.82 ns3.75 ns 41306
core: container()gpu 1.48 ns1.53 ns 1.90 ns1.48 ns 107366
core: destroyed()v3 3.30 ns3.42 ns 6.65 ns3.25 ns 49378
core: destroyed()gpu 1.48 ns1.54 ns 1.94 ns1.45 ns 106918
core: removeAllListeners()v3 13.5 ns14.2 ns 26.2 ns13.0 ns 11980
core: removeAllListeners()gpu 1.58 ns1.64 ns 1.98 ns1.58 ns 101034
collection: cy()v3 7.80 ns8.39 ns 15.6 ns7.32 ns 20373
collection: cy()gpu 2.16 ns2.44 ns 6.29 ns2.06 ns 68322
collection: indexOfId()v3 69.6 ns71.8 ns 123 ns67.6 ns 2381
collection: indexOfId()gpu 38.8 ns40.2 ns 71.9 ns38.1 ns 4252
collection: removed() + inside() (2 calls)v3 17.7 ns18.4 ns 30.0 ns17.3 ns 9326
collection: removed() + inside() (2 calls)gpu 15.1 ns15.7 ns 25.4 ns14.6 ns 10938
collection: silentPositions( fn ) over 100v3 107 µs115 µs 266 µs105 µs 6055
collection: silentPositions( fn ) over 100gpu 3.53 µs3.56 µs 3.83 µs3.47 µs 44
collection: animated()v3 12.2 ns12.5 ns 22.6 ns11.9 ns 13651
collection: animated()gpu 4.19 ns4.34 ns 7.51 ns4.08 ns 38925
collection: delayAnimation()v3 456 ns594 ns 2.00 µs444 ns 281
collection: delayAnimation()gpu 165 ns175 ns 309 ns159 ns 965
collection: removeScratch()v3 1.81 µs1.83 µs 2.32 µs1.77 µs 89
collection: removeScratch()gpu 202 ns209 ns 287 ns200 ns 804
collection: component()v3 79.7 ms82.1 ms 90.1 ms75.0 ms 12
collection: component()gpu 1.84 ms2.09 ms 5.46 ms1.78 ms 329
collection: layoutDimensions()v3 618 ns625 ns 805 ns600 ns 270
collection: layoutDimensions()gpu 173 ns181 ns 322 ns168 ns 940
degree: maxIndegree + minOutdegree (2 calls)v3 8.87 ms9.57 ms 13.6 ms8.66 ms 69
degree: maxIndegree + minOutdegree (2 calls)gpu 353 µs367 µs 588 µs347 µs 1911
flags: grabbed + hidden + inactive (3 calls)v3 85.9 ns88.2 ns 137 ns81.2 ns 1946
flags: grabbed + hidden + inactive (3 calls)gpu 43.2 ns44.5 ns 58.5 ns40.3 ns 3842
curves: renderedSegmentPointsgpu 36.7 ns37.8 ns 73.9 ns35.6 ns 4526
layout contract: edgeSlots + endpoints + degreeOfgpu 34.6 µs36.7 µs 66.4 µs29.4 µs 18774
formats: isColumnarElements + isSerializedElements + isPackedIdsgpu 4.61 ns4.84 ns 9.04 ns4.60 ns 34855

compaction N=20,000 · 53.8 s

cpu pick: background miss (full highWater walk) — peak
223 µs
cpu pick: background miss (full highWater walk) — compacted
50.2 µs
cpu pick: node hit — peak
223 µs
cpu pick: node hit — compacted
50.2 µs
isCurrent: current ref (forwards present vs absent) — no forwards (peak)
5.88 ns
isCurrent: current ref (forwards present vs absent) — forwards present (compacted)
5.98 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — current (baseline alloc)
8.90 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — stale → repair
50.3 ns
control: nodes({ selected }) scan (order-list, expected parity) — peak
23.7 µs
control: nodes({ selected }) scan (order-list, expected parity) — compacted
22.8 µs
control: whole-graph boundingBox (expected parity) — peak
104 µs
control: whole-graph boundingBox (expected parity) — compacted
100 µs
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
cpu pick: background miss (full highWater walk)peak 223 µs228 µs 322 µs216 µs 3076
cpu pick: background miss (full highWater walk)compacted 50.2 µs50.5 µs 51.4 µs49.4 µs 12
cpu pick: node hitpeak 223 µs228 µs 277 µs221 µs 3084
cpu pick: node hitcompacted 50.2 µs51.3 µs 53.9 µs49.2 µs 12
isCurrent: current ref (forwards present vs absent)no forwards (peak) 5.88 ns6.07 ns 10.6 ns5.62 ns 27925
isCurrent: current ref (forwards present vs absent)forwards present (compacted) 5.98 ns6.25 ns 13.2 ns5.63 ns 27124
isCurrent: stale-ref repair (chase + rewrite, alloc included)current (baseline alloc) 8.90 ns9.70 ns 22.1 ns8.48 ns 17367
isCurrent: stale-ref repair (chase + rewrite, alloc included)stale → repair 50.3 ns56.0 ns 108 ns47.7 ns 3053
control: nodes({ selected }) scan (order-list, expected parity)peak 23.7 µs26.5 µs 33.6 µs21.6 µs 12
control: nodes({ selected }) scan (order-list, expected parity)compacted 22.8 µs23.9 µs 25.2 µs22.3 µs 12
control: whole-graph boundingBox (expected parity)peak 104 µs108 µs 171 µs101 µs 6423
control: whole-graph boundingBox (expected parity)compacted 100 µs102 µs 149 µs96.4 µs 6752

compound N=2,000 · 27.8 sv4 (gpu) v3

parent drag (shift subtree + bb settle)
185×
child drag (move + parent re-derive)
51×
reparent round-trip
76×
1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
parent drag (shift subtree + bb settle)v3 260 µs291 µs 696 µs246 µs 2387
parent drag (shift subtree + bb settle)gpu 1.40 µs1.42 µs 1.61 µs1.36 µs 112
child drag (move + parent re-derive)v3 81.7 µs89.6 µs 151 µs77.5 µs 7623
child drag (move + parent re-derive)gpu 1.59 µs1.61 µs 1.82 µs1.53 µs 101
reparent round-tripv3 84.6 µs93.3 µs 245 µs81.6 µs 7373
reparent round-tripgpu 1.11 µs1.13 µs 1.40 µs1.07 µs 142

curves N=2,000 · 1.7 s

curve premium: build (style apply + derivation) — curved
10.3 ms
curve premium: build (style apply + derivation) — straight
8.90 ms
curve premium: node.position x 1000 (drag) — curved
376 µs
curve premium: node.position x 1000 (drag) — straight
313 µs
curve premium: nodes().positions() (bulk move) — curved
302 µs
curve premium: nodes().positions() (bulk move) — straight
297 µs
curve premium: first read after a bulk move (cold) — curved
5.86 ms
curve premium: first read after a bulk move (cold) — straight
2.73 ms
curve premium: same read again (warm) — curved
2.21 ms
curve premium: same read again (warm) — straight
3.20 ms
curve premium: edge.midpoint x 4000 — curved
1.83 ms
curve premium: edge.midpoint x 4000 — straight
3.11 ms
curve premium: edge.controlPoints x 4000 — curved
1.95 ms
curve premium: edge.controlPoints x 4000 — straight
1.09 ms
curve premium: cy.elements().boundingBox() x 20 — curved
38.0 ms
curve premium: cy.elements().boundingBox() x 20 — straight
21.2 ms
curve premium: cy.fit() x 20 (store scan) — curved
3.84 ms
curve premium: cy.fit() x 20 (store scan) — straight
3.53 ms
curve premium: elementsInBox x 20 (half the graph) — curved
24.9 ms
curve premium: elementsInBox x 20 (half the graph) — straight
6.10 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — curved
3.88 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — straight
2.15 ms
100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
curve premium: build (style apply + derivation)curved 10.3 ms10.3 ms 10.3 ms10.3 ms 1
curve premium: build (style apply + derivation)straight 8.90 ms8.90 ms 8.90 ms8.90 ms 1
curve premium: node.position x 1000 (drag)curved 376 µs376 µs 376 µs376 µs 1
curve premium: node.position x 1000 (drag)straight 313 µs313 µs 313 µs313 µs 1
curve premium: nodes().positions() (bulk move)curved 302 µs302 µs 302 µs302 µs 1
curve premium: nodes().positions() (bulk move)straight 297 µs297 µs 297 µs297 µs 1
curve premium: first read after a bulk move (cold)curved 5.86 ms5.86 ms 5.86 ms5.86 ms 1
curve premium: first read after a bulk move (cold)straight 2.73 ms2.73 ms 2.73 ms2.73 ms 1
curve premium: same read again (warm)curved 2.21 ms2.21 ms 2.21 ms2.21 ms 1
curve premium: same read again (warm)straight 3.20 ms3.20 ms 3.20 ms3.20 ms 1
curve premium: edge.midpoint x 4000curved 1.83 ms1.83 ms 1.83 ms1.83 ms 1
curve premium: edge.midpoint x 4000straight 3.11 ms3.11 ms 3.11 ms3.11 ms 1
curve premium: edge.controlPoints x 4000curved 1.95 ms1.95 ms 1.95 ms1.95 ms 1
curve premium: edge.controlPoints x 4000straight 1.09 ms1.09 ms 1.09 ms1.09 ms 1
curve premium: cy.elements().boundingBox() x 20curved 38.0 ms38.0 ms 38.0 ms38.0 ms 1
curve premium: cy.elements().boundingBox() x 20straight 21.2 ms21.2 ms 21.2 ms21.2 ms 1
curve premium: cy.fit() x 20 (store scan)curved 3.84 ms3.84 ms 3.84 ms3.84 ms 1
curve premium: cy.fit() x 20 (store scan)straight 3.53 ms3.53 ms 3.53 ms3.53 ms 1
curve premium: elementsInBox x 20 (half the graph)curved 24.9 ms24.9 ms 24.9 ms24.9 ms 1
curve premium: elementsInBox x 20 (half the graph)straight 6.10 ms6.10 ms 6.10 ms6.10 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)curved 3.88 ms3.88 ms 3.88 ms3.88 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)straight 2.15 ms2.15 ms 2.15 ms2.15 ms 1

arrows N=2,000 · 8.8 s

arrow premium: build (style apply + arrow fold) — arrowed
5.91 ms
arrow premium: build (style apply + arrow fold) — none
5.95 ms
arrow premium: cy.style() re-apply x 4 — arrowed
8.08 ms
arrow premium: cy.style() re-apply x 4 — none
8.05 ms
arrow premium: node.position x 200000 (drag) — arrowed
22.1 ms
arrow premium: node.position x 200000 (drag) — none
22.2 ms
arrow premium: edge.sourceEndpoint x 200000 — arrowed
61.1 ms
arrow premium: edge.sourceEndpoint x 200000 — none
60.8 ms
arrow premium: edge.targetEndpoint x 200000 — arrowed
61.2 ms
arrow premium: edge.targetEndpoint x 200000 — none
60.0 ms
arrow premium: edge.midpoint x 200000 — arrowed
145 ms
arrow premium: edge.midpoint x 200000 — none
144 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — arrowed
32.8 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — none
27.8 ms
arrow premium: cy.elements().boundingBox() x 20 — arrowed
20.3 ms
arrow premium: cy.elements().boundingBox() x 20 — none
20.3 ms
arrow premium: elementsInBox x 20 (half the graph) — arrowed
6.54 ms
arrow premium: elementsInBox x 20 (half the graph) — none
5.71 ms
arrow premium: control: sourceEndpoint, bezier vs straight — arrowed
77.2 ms
arrow premium: control: sourceEndpoint, bezier vs straight — none
60.9 ms
arrow premium: edge column bytes — B/edge
156 ms
1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
arrow premium: build (style apply + arrow fold)arrowed 5.91 ms5.91 ms 5.91 ms5.91 ms 1
arrow premium: build (style apply + arrow fold)none 5.95 ms5.95 ms 5.95 ms5.95 ms 1
arrow premium: cy.style() re-apply x 4arrowed 8.08 ms8.08 ms 8.08 ms8.08 ms 1
arrow premium: cy.style() re-apply x 4none 8.05 ms8.05 ms 8.05 ms8.05 ms 1
arrow premium: node.position x 200000 (drag)arrowed 22.1 ms22.1 ms 22.1 ms22.1 ms 1
arrow premium: node.position x 200000 (drag)none 22.2 ms22.2 ms 22.2 ms22.2 ms 1
arrow premium: edge.sourceEndpoint x 200000arrowed 61.1 ms61.1 ms 61.1 ms61.1 ms 1
arrow premium: edge.sourceEndpoint x 200000none 60.8 ms60.8 ms 60.8 ms60.8 ms 1
arrow premium: edge.targetEndpoint x 200000arrowed 61.2 ms61.2 ms 61.2 ms61.2 ms 1
arrow premium: edge.targetEndpoint x 200000none 60.0 ms60.0 ms 60.0 ms60.0 ms 1
arrow premium: edge.midpoint x 200000arrowed 145 ms145 ms 145 ms145 ms 1
arrow premium: edge.midpoint x 200000none 144 ms144 ms 144 ms144 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000arrowed 32.8 ms32.8 ms 32.8 ms32.8 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000none 27.8 ms27.8 ms 27.8 ms27.8 ms 1
arrow premium: cy.elements().boundingBox() x 20arrowed 20.3 ms20.3 ms 20.3 ms20.3 ms 1
arrow premium: cy.elements().boundingBox() x 20none 20.3 ms20.3 ms 20.3 ms20.3 ms 1
arrow premium: elementsInBox x 20 (half the graph)arrowed 6.54 ms6.54 ms 6.54 ms6.54 ms 1
arrow premium: elementsInBox x 20 (half the graph)none 5.71 ms5.71 ms 5.71 ms5.71 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightarrowed 77.2 ms77.2 ms 77.2 ms77.2 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightnone 60.9 ms60.9 ms 60.9 ms60.9 ms 1
arrow premium: edge column bytesB/edge 156 ms156 ms 156 ms156 ms 1

labels N=20,000 · 1.6 s

labels: breakLines x 20000 — gpu
79.6 ms
labels: estimateBlock x 20000 — gpu
90.7 ms
labels: addNode x 20000 — gpu
30.5 ms
labels: setLabel (build) x 20000 — gpu
104 ms
labels: setLabel (rewrite) x 20000 — gpu
104 ms
labels: boundingBox with 20000 label terms — gpu
3.43 ms
1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
labels: breakLines x 20000gpu 79.6 ms79.6 ms 79.6 ms79.6 ms 1
labels: estimateBlock x 20000gpu 90.7 ms90.7 ms 90.7 ms90.7 ms 1
labels: addNode x 20000gpu 30.5 ms30.5 ms 30.5 ms30.5 ms 1
labels: setLabel (build) x 20000gpu 104 ms104 ms 104 ms104 ms 1
labels: setLabel (rewrite) x 20000gpu 104 ms104 ms 104 ms104 ms 1
labels: boundingBox with 20000 label termsgpu 3.43 ms3.43 ms 3.43 ms3.43 ms 1

transitions N=2,000 · 28.9 s

transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions off
1.15 ms
transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions on
3.65 ms
transition: bulk tween tick (2000 slots, one manager tick) — tick
122 µs
transition: explicit-domain write (O(changed) — one element) — transitions off
14.8 µs
transition: explicit-domain write (O(changed) — one element) — transitions on
19.0 µs
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions off
2.11 ms
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions on
4.85 ms
10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions off 1.15 ms1.20 ms 2.09 ms1.09 ms 576
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions on 3.65 ms3.85 ms 5.68 ms3.38 ms 177
transition: bulk tween tick (2000 slots, one manager tick)tick 122 µs127 µs 237 µs117 µs 5391
transition: explicit-domain write (O(changed) — one element)transitions off 14.8 µs15.7 µs 18.5 µs14.4 µs 12
transition: explicit-domain write (O(changed) — one element)transitions on 19.0 µs19.4 µs 19.8 µs18.4 µs 12
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions off 2.11 ms2.15 ms 2.56 ms2.05 ms 324
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions on 4.85 ms4.60 ms 6.69 ms3.52 ms 148

geometry-tween N=2,000 · 32.6 s

size tick: unlabelled (2000 slots) — tick
570 µs
size tick: labelled, center/center (re-anchor early-out) (2000 slots) — tick
605 µs
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots) — tick
1.25 ms
edge width tick (4000 slots) — bare
277 µs
edge width tick (4000 slots) — with rides (casing + match-line arrows)
690 µs
padding tick + auto-bounds flush (250 parents × 8 children) — tick + flush
176 µs
font-size tick (2000 labels) — wrap none (dims scale-patch)
368 µs
font-size tick (2000 labels) — wrapped (re-break per tick)
5.69 ms
baseline: paint (opacity) tick (2000 slots) — tick
141 µs
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
size tick: unlabelled (2000 slots)tick 570 µs598 µs 1.08 ms547 µs 1150
size tick: labelled, center/center (re-anchor early-out) (2000 slots)tick 605 µs637 µs 1.01 ms579 µs 1099
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots)tick 1.25 ms1.34 ms 2.27 ms1.10 ms 505
edge width tick (4000 slots)bare 277 µs287 µs 413 µs267 µs 2427
edge width tick (4000 slots)with rides (casing + match-line arrows) 690 µs719 µs 1.10 ms676 µs 971
padding tick + auto-bounds flush (250 parents × 8 children)tick + flush 176 µs186 µs 380 µs172 µs 3760
font-size tick (2000 labels)wrap none (dims scale-patch) 368 µs407 µs 928 µs345 µs 1699
font-size tick (2000 labels)wrapped (re-break per tick) 5.69 ms5.78 ms 6.48 ms5.38 ms 116
baseline: paint (opacity) tick (2000 slots)tick 141 µs145 µs 244 µs138 µs 4799