Cytoscape.js GPU benchmarks

v4 (src/) vs v3 (v3/src/) · Mitata · times are per-iteration p50 · 2026-08-13 00:24 · 0d3561de (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)
Commit0d3561de
merge: the round 69/70 algorithm matrix into v4
Machine id5cf3f79c
Median speedup (geo-mean) 11× 270 v3-vs-gpu comparisons
Biggest win 293822× sweep: edges() @ N=2k
v3 still ahead 2 comparisons
Total run time 44.9 min all profile

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

sweep: edges() @ 2k
293822×
sweep: nodes() @ 2k
181229×
core: edges() @ 2k
91943×
core: nodes() @ 2k
51330×
sweep: elements() @ 2k
32290×
core: elements() @ 2k
21595×
core: graph scratch() set + get (v3 restyles the graph) @ 2k
16693×
core: removeScratch() @ 2k
9502×
core: graph data() set + get (v3 restyles the graph) @ 2k
8305×
compare: same() @ 2k
8235×
trav: successors() @ 2k
756×
trav: predecessors() @ 2k
732×
mut-bulk: hide + show @ 2k
276×
flags: show + hide + visible @ 2k
226×
parent drag (shift subtree + bb settle) @ 2k
186×
compound: commonAncestors @ 2k
127×
degree: nodes.totalDegree() @ 2k
111×
mut-bulk: shift @ 2k
105×
viewport: reset() @ 2k
104×
degree: nodes.maxDegree() @ 2k
97×
flags: selectify + unselectify + selectable @ 2k
97×
layout: grid @ 2k
96×
flags: grabify + ungrabify + grabbable @ 2k
95×
flags: panify + unpanify + pannable @ 2k
94×
flags: lock + unlock + locked @ 2k
93×
core: options() @ 2k
85×
degree: node.degree() @ 2k
82×
reparent round-trip @ 2k
78×
degree: indegree + outdegree (2 calls) @ 2k
76×
collection: same + anySame + contains (3 calls) @ 2k
73×
algo: closenessCentrality (one root) @ 2k
71×
algo: pageRank (20 iters) @ 500
70×
algo: closenessCentrality (one root) @ 500
67×
dimensions: shift + silentShift (round-trip) @ 2k
62×
layout: preset (fn form) @ 2k
61×
algo: bfs (whole graph) @ 500
60×
sweep: nodes(":selected") vs nodes({selected}) @ 2k
59×
mut-bulk: positions(obj) @ 2k
59×
viewport: viewport({ zoom, pan }) @ 2k
59×
algo: dfs (whole graph) @ 2k
58×
algo: dfs (whole graph) @ 500
57×
algo: dijkstra + pathTo @ 2k
55×
algo: bfs (whole graph) @ 2k
55×
algo: closenessCentrality (weighted, one root) @ 500
54×
mut-bulk: lock + unlock @ 2k
53×
child drag (move + parent re-derive) @ 2k
52×
algo: dijkstra + pathTo @ 500
51×
dimensions: positions( fn ) over 100 @ 2k
50×
collection: component() @ 2k
44×
degree: minDegree + maxDegree (2 calls) @ 2k
42×
traverse: components() @ 2k
42×
layout: breadthfirst @ 2k
38×
algo: degreeCentralityNormalized @ 500
37×
algo: degreeCentralityNormalized @ 2k
37×
algo: degreeCentrality (one root) @ 500
36×
sweep: selected nodes ($("node:selected") vs filter({group, selected})) @ 2k
35×
algo: degreeCentrality (one root) @ 2k
34×
algo: tarjan SCC @ 2k
34×
algo: tarjan SCC @ 500
34×
query: structural, parents (:parent vs { parent: true }) @ 2k
33×
bounds: getFitViewport() (compute without committing) @ 2k
33×
bounds: cy.fit() (whole-graph scan) @ 2k
32×
query: structural, orphans (:orphan vs { child: false }) @ 2k
32×
collection: silentPositions( fn ) over 100 @ 2k
31×
collection: difference @ 2k
29×
collection: intersection @ 2k
28×
scn: select-all + fit (listeners on) @ 2k
27×
emit: position write, no listeners @ 2k
27×
set: difference() @ 2k
27×
load: init from the definition form (construct + dispose) @ 2k
27×
set: intersection() @ 2k
26×
layout: concentric @ 2k
26×
algo: kruskal @ 2k
26×
algo: hopcroft-tarjan biconnected @ 2k
26×
algo: kruskal @ 500
25×
algo: hopcroft-tarjan biconnected @ 500
25×
degree: minIndegree + maxOutdegree (2 calls) @ 2k
24×
degree: maxIndegree + minOutdegree (2 calls) @ 2k
24×
core: id lookup ($("#id") vs $id()) @ 2k
24×
trav: band roots() @ 2k
24×
mut-bulk: positions(fn) @ 2k
23×
mut: position set @ 2k
23×
data: bulk write, object column (plain-array fallback) @ 2k
21×
data: bulk write, numeric column @ 2k
21×
algo: bellmanFord @ 500
21×
algo: bellmanFord @ 2k
20×
layout: preset @ 2k
20×
viewport: center( eles ) @ 2k
19×
data: bulk write, one new dictionary entry per pass @ 2k
18×
core: add + remove @ 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×
core: forceRender() (headless no-op) @ 2k
16×
flags: select + unselect + selected (band) @ 2k
16×
collection: absoluteComplement @ 2k
16×
dimensions: silentPosition @ 2k
15×
query: membership ([bucket in ...] vs { in }) @ 2k
15×
flags: active/activate/unactivate (3 calls) @ 2k
15×
viewport: minZoom/maxZoom get (2 calls) @ 2k
15×
core: selected ($(":selected") vs filter({selected})) @ 2k
14×
style: renderedStyle (one prop) @ 2k
14×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } }) @ 2k
14×
dimensions: padding + paddedWidth + paddedHeight (3 calls) @ 2k
13×
sweep: selected ($(":selected") vs filter({selected})) @ 2k
13×
mut-bulk: data set @ 2k
13×
query: structural, childless (:childless vs { parent: false }) @ 2k
13×
traversal: roots + leaves (2 calls) @ 2k
13×
layout: circle @ 2k
12×
query: two keys AND-ed @ 2k
12×
collection: toArray() @ 2k
12×
algo: fuzzyCMeans @ 500
12×
algo: betweennessCentrality (unweighted) @ 2k
11×
algo: betweennessCentrality (unweighted) @ 500
11×
dimensions: relativePosition get @ 2k
11×
layout: random @ 2k
11×
query: data comparison ([weight > 3] vs { gt }) @ 2k
11×
layout: scope (eles.layout, 10% of nodes) @ 2k
9.9×
sweep: all nodes ($("node") vs filter({group})) @ 2k
9.9×
collection: removeScratch() @ 2k
8.8×
core: removeAllListeners() @ 2k
8.7×
core: batchData() @ 2k
8.7×
algo: betweennessCentrality (weighted) @ 500
8.6×
query: predicate function (both sides) @ 2k
8.6×
algo: hierarchicalClustering (threshold) @ 500
8.3×
emit: 1 core listener @ 2k
8.3×
emit: delegated (v3 selector vs v4 predicate) @ 2k
8.2×
data: removeData (whole collection) @ 2k
7.9×
mut-bulk: select + unselect @ 2k
7.9×
scn: explore (expand 2-hop + select + fit) @ 2k
7.7×
emit: 1 element (ref-qualified) listener @ 2k
7.7×
element data: scratch get + set @ 2k
7.6×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners) @ 2k
7.3×
core: collection() @ 2k
7.1×
compound: orphans + nonorphans (2 calls) @ 2k
7.0×
core: collection() @ 2k
7.0×
core: batch( fn ) (empty) @ 2k
6.4×
emit: 10 core listeners @ 2k
6.2×
mut-bulk: remove + re-add (256 nodes + cascade) @ 2k
6.2×
style: whole-object style() @ 2k
6.2×
core: startBatch + endBatch + batching @ 2k
6.0×
style: bypass set + removeStyle round-trip @ 2k
5.9×
collection: union @ 2k
5.9×
bounds: whole-graph boundingBox() @ 2k
5.8×
algo: kMedoids @ 500
5.7×
style: sheet swap (compile + applyAll) @ 2k
5.5×
traversal: allAreNeighbors @ 2k
5.4×
traverse: incomers() @ 2k
5.4×
traverse: outgoers() @ 2k
5.3×
set: union() @ 2k
5.2×
algo: hierholzer (directed) @ 500
5.1×
trav: outgoers() @ 2k
5.1×
algo: affinityPropagation @ 500
5.0×
trav: band neighborhood() @ 2k
4.9×
core: animated() @ 2k
4.9×
core: nodes ($("node") vs filter({group})) @ 2k
4.9×
trav: incomers() @ 2k
4.8×
compare: contains() @ 2k
4.8×
compound: children + descendants + siblings (3 calls) @ 2k
4.7×
algo: kMeans (fixed centroids) @ 500
4.6×
viewport: zoom() get @ 2k
4.6×
collection: length + empty + nonempty (3 calls) @ 2k
4.6×
mut: select + unselect @ 2k
4.2×
style: bypass set (ele.style name,value) @ 2k
4.1×
trav: neighborhood() @ 2k
3.9×
collection: symmetricDifference @ 2k
3.9×
viewport: width() + height() + size() (3 calls) @ 2k
3.8×
traverse: neighborhood() @ 2k
3.7×
compound: parent + parents + ancestors (3 calls) @ 2k
3.7×
traversal: parallelEdges + codirectedEdges (2 calls) @ 2k
3.6×
collection: layoutDimensions() @ 2k
3.6×
algo: aStar @ 500
3.5×
collection: cy() @ 2k
3.5×
traversal: connectedNodes @ 2k
3.4×
algo: aStar @ 2k
3.3×
collection: diff @ 2k
3.3×
traversal: sources + targets (2 calls) @ 2k
3.2×
dimensions: rendered dims (4 calls) @ 2k
3.1×
collection: byGroup @ 2k
3.1×
anim: start + stop, 512-node collection @ 2k
3.0×
traversal: openNeighborhood + closedNeighborhood (2 calls) @ 2k
3.0×
algo: hierholzer (directed) @ 2k
3.0×
collection: animated() @ 2k
2.9×
dimensions: width + height + outerWidth + outerHeight (4 calls) @ 2k
2.9×
style: numericStyle @ 2k
2.9×
anim: viewport animate + stop @ 2k
2.9×
iter: map() @ 2k
2.8×
flags: takesUpSpace + interactive + transparent (3 calls) @ 2k
2.8×
collection: delayAnimation() @ 2k
2.8×
core: window() @ 2k
2.8×
traverse: connectedEdges() @ 2k
2.8×
trav: band connectedNodes() @ 2k
2.8×
mut: data set @ 2k
2.8×
trav: closedNeighborhood() @ 2k
2.8×
load: cy.json() @ 2k
2.7×
core: container() @ 2k
2.6×
trav: connectedEdges() @ 2k
2.5×
dimensions: renderedPosition get @ 2k
2.5×
algo: closenessCentralityNormalized @ 500
2.4×
core: zoom set @ 2k
2.4×
collection: is (none match: the full walk) @ 2k
2.4×
core: onRender + offRender @ 2k
2.4×
traversal: isLoop + isSimple (2 calls) @ 2k
2.3×
core: resize() / invalidateSize() @ 2k
2.3×
data: read the whole object @ 2k
2.3×
core: destroyed() @ 2k
2.2×
style: read one prop (width) @ 2k
2.2×
core: isReady() @ 2k
2.2×
flags: grabbed + hidden + inactive (3 calls) @ 2k
2.2×
collection: slice() @ 2k
2.2×
emit: on() + off() round-trip @ 2k
2.1×
flags: effectiveOpacity @ 2k
2.1×
element data: json() one element @ 2k
2.0×
core: selectionType get @ 2k
2.00×
style: first apply on add (256-node band) @ 2k
1.96×
collection: min + max ( fn ) (2 calls) @ 2k
1.96×
element data: jsons() over 100 @ 2k
1.93×
json: element @ 2k
1.89×
collection: eq/first/last (3 calls) @ 2k
1.88×
core: gating setters round-trip (autolock/autoungrabify/autounselectify) @ 2k
1.86×
viewport: pan( p ) set @ 2k
1.85×
viewport: zoom( n ) set @ 2k
1.84×
dimensions: renderedBoundingBox @ 2k
1.83×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener) @ 2k
1.83×
iter: filter(fn) @ 2k
1.83×
algo: floydWarshall @ 500
1.77×
style: read one prop (color) @ 2k
1.77×
collection: indexOfId() @ 2k
1.76×
sweep: filter(fn) @ 2k
1.76×
style( 'text-wrap' ) (was #73 in the switch) @ 2k
1.76×
collection: element accessors (id/group/isNode/isEdge, 4 calls) @ 2k
1.74×
style( 'text-max-width' ) (was #74 in the switch) @ 2k
1.74×
load: add a 256-node band (add + remove) @ 2k
1.65×
viewport: panBy() @ 2k
1.63×
bounds: one node boundingBox() @ 2k
1.61×
collection: some + every (2 calls) @ 2k
1.59×
anim: delay() (no channels touched) @ 2k
1.58×
viewport: renderedExtent() @ 2k
1.58×
collection: sort( fn ) @ 2k
1.57×
compound: isParent/isChild/isChildless/isOrphan (4 calls) @ 2k
1.56×
viewport: extent() @ 2k
1.50×
trav: band sources() @ 2k
1.50×
collection: allAre (all match: the full walk) @ 2k
1.49×
position: get @ 2k
1.46×
trav: band connectedEdges() @ 2k
1.45×
collection: reduce( fn ) @ 2k
1.40×
traversal: source() + target() (2 calls) @ 2k
1.36×
core: mutableElements() (v4 materializes; v3 is O(1)) @ 2k
1.36×
collection: indexOf @ 2k
1.35×
data: read one string key (dictionary decode) @ 2k
1.35×
data: read one numeric key @ 2k
1.35×
core: pan() get (x32) @ 2k
1.32×
style( 'target-distance-from-node' ) (was #150 in the switch) @ 2k
1.29×
anim: start + stop, one element @ 2k
1.28×
style( 'taxi-radius' ) (was #142 in the switch) @ 2k
1.28×
traversal: edgesWith @ 2k
1.27×
traversal: edgesTo @ 2k
1.26×
core: instanceString + headless + styleEnabled (3 calls) @ 2k
1.25×
collection: removed() + inside() (2 calls) @ 2k
1.16×
core: gating getters (5 calls) @ 2k
1.15×
style( 'border-width' ) (was #6 in the switch) @ 2k
1.15×
core: hasElementWithId + hasCompoundNodes (2 calls) @ 2k
1.12×
viewport: pan() get @ 2k
1.10×
algo: markovClustering @ 500
1.10×
core: extent() @ 2k
1.09×
algo: kargerStein @ 500
1.07×
iter: forEach() @ 2k
1.05×
data: get @ 2k
1.05×
core: filter(fn) @ 2k
1.01×
core: getElementById() @ 2k
1.00×
style( 'background-color' ) (was #4 in the switch) @ 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)60×55×
algo: dfs (whole graph)57×58×
algo: dijkstra + pathTo51×55×
algo: aStar3.5×3.3×
algo: bellmanFord21×20×
algo: kruskal25×26×
algo: tarjan SCC34×34×
algo: hopcroft-tarjan biconnected25×26×
algo: hierholzer (directed)5.1×3.0×
algo: betweennessCentrality (unweighted)11×11×
algo: degreeCentralityNormalized37×37×
algo: closenessCentrality (one root)67×71×
algo: degreeCentrality (one root)36×34×
algo: pageRank (20 iters)70×
algo: closenessCentrality (weighted, one root)54×
algo: floydWarshall1.77×
algo: closenessCentralityNormalized2.4×
algo: markovClustering1.10×
algo: hierarchicalClustering (threshold)8.3×
algo: kMeans (fixed centroids)4.6×
algo: kMedoids5.7×
algo: fuzzyCMeans12×
algo: affinityPropagation5.0×
algo: kargerStein1.07×
algo: betweennessCentrality (weighted)8.6×

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

core: getElementById()
1.00×
core: id lookup ($("#id") vs $id())
24×
core: nodes()
51330×
core: edges()
91943×
core: elements()
21595×
core: nodes ($("node") vs filter({group}))
4.9×
core: selected ($(":selected") vs filter({selected}))
14×
core: filter(fn)
1.01×
core: collection()
7.1×
core: pan() get (x32)
1.32×
core: extent()
1.09×
core: add + remove
18×
core: zoom set
2.4×
traverse: neighborhood()
3.7×
traverse: connectedEdges()
2.8×
traverse: outgoers()
5.3×
traverse: incomers()
5.4×
traverse: components()
42×
degree: node.degree()
82×
degree: nodes.totalDegree()
111×
degree: nodes.maxDegree()
97×
data: get
1.05×
position: get
1.46×
json: element
1.89×
set: union()
5.2×
set: intersection()
26×
set: difference()
27×
iter: map()
2.8×
iter: forEach()
1.05×
iter: filter(fn)
1.83×
compare: same()
8235×
compare: contains()
4.8×
mut: data set
2.8×
mut: position set
23×
mut: select + unselect
4.2×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
core: getElementById()v3 90.8 ns93.7 ns 128 ns87.4 ns 1830
core: getElementById()gpu 91.2 ns95.0 ns 157 ns88.6 ns 1802
core: id lookup ($("#id") vs $id())v3 2.03 µs2.38 µs 3.63 µs1.89 µs 67
core: id lookup ($("#id") vs $id())gpu 84.5 ns87.5 ns 161 ns82.4 ns 1954
core: nodes()v3 421 µs436 µs 701 µs415 µs 1604
core: nodes()gpu 8.21 ns8.72 ns 18.8 ns8.12 ns 19429
core: edges()v3 727 µs751 µs 1.21 ms694 µs 931
core: edges()gpu 7.91 ns8.36 ns 15.5 ns7.72 ns 20283
core: elements()v3 149 µs159 µs 411 µs145 µs 4375
core: elements()gpu 6.89 ns7.29 ns 17.5 ns6.68 ns 23328
core: nodes ($("node") vs filter({group}))v3 550 µs576 µs 1.27 ms539 µs 1212
core: nodes ($("node") vs filter({group}))gpu 113 µs121 µs 323 µs82.7 µs 5706
core: selected ($(":selected") vs filter({selected}))v3 362 µs379 µs 726 µs355 µs 1836
core: selected ($(":selected") vs filter({selected}))gpu 25.0 µs25.5 µs 25.3 µs24.8 µs 12
core: filter(fn)v3 424 µs433 µs 583 µs415 µs 1613
core: filter(fn)gpu 419 µs450 µs 872 µs403 µs 1532
core: collection()v3 458 ns554 ns 1.57 µs447 ns 302
core: collection()gpu 64.8 ns68.4 ns 133 ns61.7 ns 2423
core: pan() get (x32)v3 44.5 ns46.9 ns 60.9 ns42.7 ns 3633
core: pan() get (x32)gpu 33.8 ns35.4 ns 50.8 ns32.8 ns 4829
core: extent()v3 22.6 ns40.6 ns 146 ns21.5 ns 4101
core: extent()gpu 20.6 ns29.7 ns 116 ns19.1 ns 5590
core: add + removev3 120 µs125 µs 262 µs111 µs 5565
core: add + removegpu 6.77 µs7.97 µs 25.7 µs6.38 µs 80653
core: zoom setv3 1.37 µs1.38 µs 1.53 µs1.24 µs 117
core: zoom setgpu 568 ns575 ns 697 ns546 ns 282
traverse: neighborhood()v3 3.64 µs3.82 µs 4.59 µs3.42 µs 41
traverse: neighborhood()gpu 972 ns976 ns 1.17 µs909 ns 162
traverse: connectedEdges()v3 1.06 µs1.16 µs 1.94 µs1.02 µs 142
traverse: connectedEdges()gpu 383 ns409 ns 1.34 µs373 ns 408
traverse: outgoers()v3 2.39 µs2.59 µs 3.56 µs2.30 µs 62
traverse: outgoers()gpu 451 ns561 ns 2.03 µs441 ns 289
traverse: incomers()v3 2.41 µs2.60 µs 3.46 µs2.28 µs 62
traverse: incomers()gpu 451 ns532 ns 2.02 µs441 ns 302
traverse: components()v3 81.1 ms83.5 ms 87.0 ms75.9 ms 12
traverse: components()gpu 1.94 ms2.05 ms 3.33 ms1.87 ms 326
degree: node.degree()v3 3.41 µs3.74 µs 4.98 µs3.17 µs 42
degree: node.degree()gpu 41.6 ns42.9 ns 73.7 ns39.4 ns 4001
degree: nodes.totalDegree()v3 7.12 ms7.83 ms 12.1 ms6.79 ms 84
degree: nodes.totalDegree()gpu 64.2 µs66.8 µs 130 µs61.0 µs 10313
degree: nodes.maxDegree()v3 7.19 ms8.03 ms 12.6 ms6.74 ms 83
degree: nodes.maxDegree()gpu 74.0 µs75.1 µs 114 µs69.9 µs 9335
data: getv3 30.5 ns31.5 ns 59.2 ns29.5 ns 5430
data: getgpu 29.1 ns30.3 ns 44.5 ns28.1 ns 5646
position: getv3 31.9 ns33.4 ns 72.0 ns30.9 ns 5123
position: getgpu 21.8 ns24.7 ns 48.8 ns21.0 ns 6745
json: elementv3 302 ns396 ns 3.53 µs295 ns 423
json: elementgpu 159 ns165 ns 239 ns155 ns 988
set: union()v3 93.0 µs103 µs 176 µs90.0 µs 6732
set: union()gpu 17.8 µs18.2 µs 18.9 µs17.3 µs 12
set: intersection()v3 92.0 µs108 µs 194 µs89.3 µs 6398
set: intersection()gpu 3.51 µs3.55 µs 3.93 µs3.40 µs 43
set: difference()v3 91.7 µs104 µs 179 µs89.5 µs 6534
set: difference()gpu 3.43 µs3.49 µs 3.97 µs3.35 µs 44
iter: map()v3 29.0 µs30.8 µs 77.5 µs28.0 µs 22410
iter: map()gpu 10.3 µs10.3 µs 10.4 µs10.2 µs 13
iter: forEach()v3 3.49 µs3.83 µs 7.92 µs3.43 µs 35
iter: forEach()gpu 3.32 µs3.36 µs 3.85 µs3.27 µs 45
iter: filter(fn)v3 242 µs249 µs 336 µs240 µs 2812
iter: filter(fn)gpu 133 µs137 µs 179 µs127 µs 5093
compare: same()v3 124 µs127 µs 199 µs121 µs 5518
compare: same()gpu 15.0 ns15.9 ns 33.6 ns14.3 ns 10737
compare: contains()v3 6.12 µs6.12 µs 6.25 µs6.01 µs 25
compare: contains()gpu 1.28 µs1.29 µs 1.40 µs1.25 µs 127
mut: data setv3 642 ns659 ns 783 ns630 ns 254
mut: data setgpu 233 ns239 ns 364 ns223 ns 700
mut: position setv3 1.23 µs1.25 µs 1.44 µs1.20 µs 133
mut: position setgpu 53.7 ns57.0 ns 105 ns52.7 ns 2915
mut: select + unselectv3 2.61 µs2.81 µs 3.60 µs2.49 µs 56
mut: select + unselectgpu 625 ns634 ns 743 ns609 ns 255

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

sweep: nodes()
181229×
sweep: edges()
293822×
sweep: elements()
32290×
sweep: all nodes ($("node") vs filter({group}))
9.9×
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.76×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
sweep: nodes()v3 437 µs454 µs 798 µs421 µs 1542
sweep: nodes()gpu 2.41 ns2.55 ns 5.38 ns2.30 ns 64642
sweep: edges()v3 739 µs757 µs 1.13 ms719 µs 923
sweep: edges()gpu 2.51 ns2.62 ns 5.11 ns2.46 ns 63345
sweep: elements()v3 157 µs163 µs 273 µs153 µs 4282
sweep: elements()gpu 4.85 ns5.24 ns 12.2 ns4.70 ns 32031
sweep: all nodes ($("node") vs filter({group}))v3 574 µs609 µs 924 µs554 µs 1147
sweep: all nodes ($("node") vs filter({group}))gpu 58.0 µs72.7 µs 166 µs53.9 µs 9534
sweep: selected ($(":selected") vs filter({selected}))v3 351 µs362 µs 568 µs344 µs 1932
sweep: selected ($(":selected") vs filter({selected}))gpu 26.4 µs26.8 µs 27.1 µs26.2 µs 12
sweep: selected nodes ($("node:selected") vs filter({group, selected}))v3 338 µs359 µs 609 µs327 µs 1933
sweep: selected nodes ($("node:selected") vs filter({group, selected}))gpu 9.52 µs9.61 µs 9.86 µs9.41 µs 14
sweep: nodes(":selected") vs nodes({selected})v3 556 µs572 µs 997 µs541 µs 1218
sweep: nodes(":selected") vs nodes({selected})gpu 9.37 µs9.37 µs 9.67 µs9.05 µs 15
sweep: filter(fn)v3 432 µs452 µs 824 µs427 µs 1548
sweep: filter(fn)gpu 246 µs269 µs 561 µs238 µs 2588

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

mut-bulk: select + unselect
7.9×
mut-bulk: hide + show
276×
mut-bulk: lock + unlock
53×
mut-bulk: positions(obj)
59×
mut-bulk: positions(fn)
23×
mut-bulk: shift
105×
mut-bulk: data set
13×
mut-bulk: remove + re-add (256 nodes + cascade)
6.2×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
mut-bulk: select + unselectv3 2.19 ms2.27 ms 3.76 ms2.11 ms 288
mut-bulk: select + unselectgpu 278 µs290 µs 439 µs273 µs 2417
mut-bulk: hide + showv3 59.6 ms64.1 ms 67.9 ms57.6 ms 12
mut-bulk: hide + showgpu 216 µs230 µs 717 µs210 µs 3019
mut-bulk: lock + unlockv3 2.04 ms2.13 ms 3.64 ms1.96 ms 324
mut-bulk: lock + unlockgpu 38.6 µs39.0 µs 39.6 µs38.2 µs 12
mut-bulk: positions(obj)v3 2.21 ms2.28 ms 3.49 ms2.14 ms 302
mut-bulk: positions(obj)gpu 37.5 µs39.3 µs 71.0 µs36.4 µs 17561
mut-bulk: positions(fn)v3 3.40 ms3.52 ms 5.01 ms3.24 ms 192
mut-bulk: positions(fn)gpu 146 µs152 µs 247 µs142 µs 4504
mut-bulk: shiftv3 3.41 ms3.56 ms 4.59 ms3.31 ms 187
mut-bulk: shiftgpu 32.3 µs33.3 µs 57.6 µs30.9 µs 20244
mut-bulk: data setv3 867 µs898 µs 1.52 ms834 µs 775
mut-bulk: data setgpu 65.6 µs68.7 µs 134 µs64.3 µs 10051
mut-bulk: remove + re-add (256 nodes + cascade)v3 40.4 ms44.2 ms 54.6 ms38.6 ms 12
mut-bulk: remove + re-add (256 nodes + cascade)gpu 6.47 ms6.57 ms 8.37 ms5.71 ms 100

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

scn: explore (expand 2-hop + select + fit)
7.7×
scn: select-all + fit (listeners on)
27×
scn: drag (select band of 100 + 8-step shift, position listener)
16×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)
7.3×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)
1.83×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
scn: explore (expand 2-hop + select + fit)v3 290 µs339 µs 927 µs275 µs 2048
scn: explore (expand 2-hop + select + fit)gpu 37.5 µs42.8 µs 177 µs34.1 µs 15952
scn: select-all + fit (listeners on)v3 25.1 ms25.0 ms 26.4 ms23.3 ms 23
scn: select-all + fit (listeners on)gpu 922 µs976 µs 1.51 ms859 µs 691
scn: drag (select band of 100 + 8-step shift, position listener)v3 1.64 ms1.69 ms 2.23 ms1.60 ms 397
scn: drag (select band of 100 + 8-step shift, position listener)gpu 102 µs105 µs 156 µs98.0 µs 6293
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)v3 47.4 ms47.3 ms 49.9 ms44.6 ms 11
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)gpu 6.51 ms6.60 ms 8.26 ms6.00 ms 99
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)v3 7.74 ms8.06 ms 10.4 ms7.12 ms 80
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)gpu 4.22 ms4.38 ms 6.98 ms3.77 ms 148

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

trav: neighborhood()
3.9×
trav: closedNeighborhood()
2.8×
trav: connectedEdges()
2.5×
trav: outgoers()
5.1×
trav: incomers()
4.8×
trav: successors()
756×
trav: predecessors()
732×
trav: band neighborhood()
4.9×
trav: band connectedEdges()
1.45×
trav: band roots()
24×
trav: band sources()
1.50×
trav: band connectedNodes()
2.8×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
trav: neighborhood()v3 3.99 µs4.09 µs 5.26 µs3.40 µs 37
trav: neighborhood()gpu 1.02 µs1.07 µs 2.02 µs847 ns 154
trav: closedNeighborhood()v3 5.87 µs5.83 µs 6.26 µs5.38 µs 26
trav: closedNeighborhood()gpu 2.13 µs2.31 µs 2.90 µs2.08 µs 68
trav: connectedEdges()v3 980 ns1.06 µs 1.80 µs943 ns 158
trav: connectedEdges()gpu 390 ns410 ns 928 ns386 ns 411
trav: outgoers()v3 2.33 µs2.47 µs 3.05 µs2.26 µs 65
trav: outgoers()gpu 456 ns536 ns 2.00 µs442 ns 309
trav: incomers()v3 2.33 µs2.47 µs 3.04 µs2.20 µs 65
trav: incomers()gpu 482 ns567 ns 2.12 µs453 ns 292
trav: successors()v3 439 ms439 ms 445 ms424 ms 12
trav: successors()gpu 581 µs626 µs 1.86 ms559 µs 1105
trav: predecessors()v3 437 ms437 ms 448 ms424 ms 12
trav: predecessors()gpu 597 µs632 µs 1.88 ms583 µs 1073
trav: band neighborhood()v3 186 µs198 µs 267 µs177 µs 3519
trav: band neighborhood()gpu 37.8 µs38.5 µs 40.9 µs37.0 µs 12
trav: band connectedEdges()v3 24.4 µs25.0 µs 26.6 µs24.2 µs 12
trav: band connectedEdges()gpu 16.8 µs17.4 µs 20.3 µs16.6 µs 12
trav: band roots()v3 108 µs118 µs 174 µs102 µs 5906
trav: band roots()gpu 4.53 µs4.55 µs 4.65 µs4.47 µs 33
trav: band sources()v3 6.67 µs6.69 µs 6.99 µs6.43 µs 22
trav: band sources()gpu 4.45 µs4.52 µs 5.07 µs4.36 µs 33
trav: band connectedNodes()v3 14.1 µs14.5 µs 14.4 µs13.9 µs 12
trav: band connectedNodes()gpu 5.10 µs5.14 µs 5.42 µs4.99 µs 29

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

algo: bfs (whole graph)
55×
algo: dfs (whole graph)
58×
algo: dijkstra + pathTo
55×
algo: aStar
3.3×
algo: bellmanFord
20×
algo: kruskal
26×
algo: tarjan SCC
34×
algo: hopcroft-tarjan biconnected
26×
algo: hierholzer (directed)
3.0×
algo: betweennessCentrality (unweighted)
11×
algo: degreeCentralityNormalized
37×
algo: closenessCentrality (one root)
71×
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 52.3 ms53.4 ms 56.5 ms50.3 ms 9
algo: bfs (whole graph)gpu 948 µs970 µs 1.43 ms890 µs 713
algo: dfs (whole graph)v3 50.3 ms50.7 ms 52.2 ms49.5 ms 10
algo: dfs (whole graph)gpu 868 µs899 µs 1.44 ms847 µs 764
algo: dijkstra + pathTov3 53.2 ms53.5 ms 54.3 ms52.6 ms 10
algo: dijkstra + pathTogpu 961 µs975 µs 1.22 ms934 µs 705
algo: aStarv3 1.70 ms1.75 ms 2.44 ms1.67 ms 396
algo: aStargpu 507 µs529 µs 898 µs492 µs 1319
algo: bellmanFordv3 236 ms235 ms 254 ms215 ms 12
algo: bellmanFordgpu 11.8 ms11.9 ms 12.5 ms11.6 ms 55
algo: kruskalv3 13.3 ms14.2 ms 17.3 ms12.8 ms 45
algo: kruskalgpu 510 µs523 µs 789 µs467 µs 1325
algo: tarjan SCCv3 23.1 ms24.3 ms 28.0 ms21.6 ms 25
algo: tarjan SCCgpu 672 µs848 µs 5.88 ms633 µs 798
algo: hopcroft-tarjan biconnectedv3 88.3 ms89.4 ms 98.3 ms82.7 ms 12
algo: hopcroft-tarjan biconnectedgpu 3.44 ms3.56 ms 4.67 ms3.32 ms 189
algo: hierholzer (directed)v3 23.1 ms23.6 ms 25.9 ms21.7 ms 26
algo: hierholzer (directed)gpu 7.79 ms7.87 ms 8.71 ms7.66 ms 76
algo: betweennessCentrality (unweighted)v3 4.08 s4.09 s 4.12 s4.01 s 12
algo: betweennessCentrality (unweighted)gpu 358 ms376 ms 443 ms349 ms 12
algo: degreeCentralityNormalizedv3 14.6 ms15.4 ms 18.3 ms13.7 ms 41
algo: degreeCentralityNormalizedgpu 392 µs408 µs 750 µs379 µs 1711
algo: closenessCentrality (one root)v3 60.4 ms64.0 ms 77.3 ms59.8 ms 12
algo: closenessCentrality (one root)gpu 848 µs871 µs 1.64 ms823 µs 796
algo: degreeCentrality (one root)v3 7.43 µs7.27 µs 7.92 µs6.71 µs 19
algo: degreeCentrality (one root)gpu 216 ns220 ns 256 ns214 ns 751

algorithms N=500 · 10.3 minv4 (gpu) v3

algo: bfs (whole graph)
60×
algo: dfs (whole graph)
57×
algo: dijkstra + pathTo
51×
algo: aStar
3.5×
algo: bellmanFord
21×
algo: kruskal
25×
algo: tarjan SCC
34×
algo: hopcroft-tarjan biconnected
25×
algo: hierholzer (directed)
5.1×
algo: betweennessCentrality (unweighted)
11×
algo: degreeCentralityNormalized
37×
algo: closenessCentrality (one root)
67×
algo: degreeCentrality (one root)
36×
algo: pageRank (20 iters)
70×
algo: closenessCentrality (weighted, one root)
54×
algo: floydWarshall
1.77×
algo: closenessCentralityNormalized
2.4×
algo: markovClustering
1.10×
algo: hierarchicalClustering (threshold)
8.3×
algo: kMeans (fixed centroids)
4.6×
algo: kMedoids
5.7×
algo: fuzzyCMeans
12×
algo: affinityPropagation
5.0×
algo: kargerStein
1.07×
algo: betweennessCentrality (weighted)
8.6×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 12.7 ms13.8 ms 18.5 ms11.5 ms 47
algo: bfs (whole graph)gpu 209 µs216 µs 323 µs203 µs 3234
algo: dfs (whole graph)v3 11.5 ms12.4 ms 15.9 ms10.9 ms 52
algo: dfs (whole graph)gpu 203 µs210 µs 282 µs198 µs 3322
algo: dijkstra + pathTov3 12.2 ms12.9 ms 17.4 ms11.5 ms 50
algo: dijkstra + pathTogpu 241 µs248 µs 332 µs229 µs 2820
algo: aStarv3 443 µs456 µs 621 µs423 µs 1535
algo: aStargpu 125 µs131 µs 199 µs119 µs 5353
algo: bellmanFordv3 17.1 ms17.3 ms 18.1 ms16.9 ms 37
algo: bellmanFordgpu 814 µs841 µs 2.04 ms785 µs 826
algo: kruskalv3 3.24 ms3.54 ms 6.90 ms3.16 ms 194
algo: kruskalgpu 128 µs135 µs 237 µs124 µs 5152
algo: tarjan SCCv3 5.39 ms5.92 ms 9.42 ms5.29 ms 113
algo: tarjan SCCgpu 158 µs174 µs 344 µs151 µs 3916
algo: hopcroft-tarjan biconnectedv3 20.3 ms21.3 ms 24.5 ms19.0 ms 29
algo: hopcroft-tarjan biconnectedgpu 817 µs845 µs 1.24 ms800 µs 825
algo: hierholzer (directed)v3 4.21 ms4.50 ms 7.55 ms4.13 ms 145
algo: hierholzer (directed)gpu 823 µs850 µs 1.22 ms796 µs 810
algo: betweennessCentrality (unweighted)v3 258 ms260 ms 264 ms256 ms 12
algo: betweennessCentrality (unweighted)gpu 24.0 ms24.2 ms 25.7 ms23.2 ms 25
algo: degreeCentralityNormalizedv3 3.56 ms3.90 ms 7.95 ms3.42 ms 175
algo: degreeCentralityNormalizedgpu 95.3 µs98.6 µs 178 µs93.7 µs 7087
algo: closenessCentrality (one root)v3 13.6 ms14.5 ms 18.0 ms13.1 ms 43
algo: closenessCentrality (one root)gpu 204 µs212 µs 382 µs196 µs 3302
algo: degreeCentrality (one root)v3 7.64 µs7.54 µs 8.45 µs6.77 µs 19
algo: degreeCentrality (one root)gpu 213 ns218 ns 271 ns205 ns 780
algo: pageRank (20 iters)v3 2.74 ms2.84 ms 6.20 ms2.65 ms 236
algo: pageRank (20 iters)gpu 39.2 µs44.4 µs 171 µs38.4 µs 15613
algo: closenessCentrality (weighted, one root)v3 13.9 ms14.7 ms 18.1 ms13.1 ms 44
algo: closenessCentrality (weighted, one root)gpu 257 µs262 µs 332 µs252 µs 2667
algo: floydWarshallv3 248 ms272 ms 384 ms245 ms 12
algo: floydWarshallgpu 140 ms141 ms 143 ms138 ms 12
algo: closenessCentralityNormalizedv3 272 ms274 ms 277 ms269 ms 12
algo: closenessCentralityNormalizedgpu 111 ms119 ms 144 ms111 ms 12
algo: markovClusteringv3 4.13 s4.38 s 4.65 s4.08 s 12
algo: markovClusteringgpu 3.77 s3.87 s 3.78 s3.73 s 12
algo: hierarchicalClustering (threshold)v3 34.7 ms34.9 ms 36.2 ms34.4 ms 16
algo: hierarchicalClustering (threshold)gpu 4.18 ms4.34 ms 5.65 ms4.12 ms 157
algo: kMeans (fixed centroids)v3 9.00 ms9.07 ms 9.83 ms8.72 ms 73
algo: kMeans (fixed centroids)gpu 1.94 ms2.01 ms 3.11 ms1.89 ms 345
algo: kMedoidsv3 232 ms298 ms 436 ms72.4 ms 12
algo: kMedoidsgpu 40.5 ms36.8 ms 44.8 ms16.0 ms 16
algo: fuzzyCMeansv3 78.6 ms79.7 ms 81.5 ms78.3 ms 12
algo: fuzzyCMeansgpu 6.79 ms6.86 ms 7.85 ms6.58 ms 99
algo: affinityPropagationv3 209 ms213 ms 219 ms201 ms 12
algo: affinityPropagationgpu 41.5 ms48.4 ms 44.7 ms40.1 ms 9
algo: kargerSteinv3 321 ms327 ms 356 ms307 ms 12
algo: kargerSteingpu 301 ms307 ms 328 ms295 ms 12
algo: betweennessCentrality (weighted)v3 712 ms714 ms 723 ms703 ms 12
algo: betweennessCentrality (weighted)gpu 83.2 ms84.7 ms 86.6 ms82.0 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.59 ms
mapper: bulk write, color + size — gpu color / cpu size
1.53 ms
mapper: bulk write, mapped labels (round-5 path) — label refresh
4.10 ms
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
mapper: bulk write, colorcpu eval 1.31 ms1.35 ms 2.00 ms1.29 ms 511
mapper: bulk write, colorgpu path 175 µs183 µs 314 µs172 µs 3820
mapper: bulk write, color + sizecpu eval 1.59 ms1.61 ms 1.85 ms1.56 ms 432
mapper: bulk write, color + sizegpu color / cpu size 1.53 ms1.57 ms 2.41 ms1.49 ms 443
mapper: bulk write, mapped labels (round-5 path)label refresh 4.10 ms4.31 ms 6.96 ms3.50 ms 157

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

layout: grid
96×
layout: preset
20×
layout: preset (fn form)
61×
layout: circle
12×
layout: concentric
26×
layout: breadthfirst
38×
layout: random
11×
layout: force (CPU executor, 20 iterations) — gpu
113 ms
layout: force seed — spectral vs scatter (20 iterations) — spectral (landmark MDS, the default)
113 ms
layout: force seed — spectral vs scatter (20 iterations) — scatter
56.8 ms
layout: plumbing (layoutPositions vs setPositions) — finisher
370 µs
layout: plumbing (layoutPositions vs setPositions) — bulk
31.5 µs
layout: contract fixed cost (empty impl vs bulk placement) — wrapper only
528 ns
layout: contract fixed cost (empty impl vs bulk placement) — wrapper + bulk write
39.4 µs
layout: scope (eles.layout, 10% of nodes)
9.9×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
layout: gridv3 12.3 ms12.7 ms 15.2 ms10.5 ms 50
layout: gridgpu 128 µs140 µs 514 µs79.1 µs 4720
layout: presetv3 5.80 ms6.09 ms 8.01 ms5.45 ms 105
layout: presetgpu 293 µs321 µs 732 µs287 µs 2159
layout: preset (fn form)v3 5.97 ms6.30 ms 9.30 ms5.43 ms 106
layout: preset (fn form)gpu 98.4 µs108 µs 375 µs95.6 µs 6372
layout: circlev3 9.84 ms10.3 ms 15.2 ms9.20 ms 63
layout: circlegpu 795 µs899 µs 2.80 ms771 µs 753
layout: concentricv3 31.9 ms31.6 ms 33.5 ms29.0 ms 17
layout: concentricgpu 1.22 ms1.45 ms 4.75 ms1.17 ms 466
layout: breadthfirstv3 414 ms422 ms 455 ms398 ms 12
layout: breadthfirstgpu 11.0 ms11.5 ms 17.0 ms10.0 ms 54
layout: randomv3 5.74 ms6.18 ms 10.1 ms5.42 ms 108
layout: randomgpu 533 µs587 µs 1.53 ms515 µs 1133
layout: force (CPU executor, 20 iterations)gpu 113 ms121 ms 140 ms102 ms 12
layout: force seed — spectral vs scatter (20 iterations)spectral (landmark MDS, the default) 113 ms112 ms 114 ms103 ms 12
layout: force seed — spectral vs scatter (20 iterations)scatter 56.8 ms59.8 ms 58.0 ms56.0 ms 12
layout: plumbing (layoutPositions vs setPositions)finisher 370 µs406 µs 947 µs360 µs 1672
layout: plumbing (layoutPositions vs setPositions)bulk 31.5 µs42.0 µs 255 µs29.9 µs 15839
layout: contract fixed cost (empty impl vs bulk placement)wrapper only 528 ns972 ns 4.08 µs520 ns 161
layout: contract fixed cost (empty impl vs bulk placement)wrapper + bulk write 39.4 µs41.4 µs 51.3 µs37.5 µs 12
layout: scope (eles.layout, 10% of nodes)v3 998 µs1.08 ms 2.20 ms965 µs 633
layout: scope (eles.layout, 10% of nodes)gpu 101 µs119 µs 272 µs97.2 µs 5809

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

style: sheet swap (compile + applyAll)
5.5×
style: compile vs compile + apply — compile only (in batch)
25.1 µs
style: compile vs compile + apply — compile + apply
2.30 ms
style: first apply on add (256-node band)
1.96×
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — flat
2.30 ms
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — compound
2.73 ms
style: applyAll — constant vs state-case (the 57.1d partition) — constant sheet
2.26 ms
style: applyAll — constant vs state-case (the 57.1d partition) — state-case sheet
2.28 ms
style: applyAll — state-case vs data-case (what the partition avoids) — state-case sheet
2.27 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.79 µs
style: select+unselect 256-band — constant vs state-case sheet — paint-only state sheet (round-61 diff path)
32.3 µs
style: select+unselect 256-band — constant vs state-case sheet — state-case sheet (all channels; full write)
376 µs
style: read one prop (color)
1.77×
style: read one prop (width)
2.2×
style: numericStyle
2.9×
style: renderedStyle (one prop)
14×
style: whole-object style()
6.2×
style: bypass set (ele.style name,value)
4.1×
style: bypass set + removeStyle round-trip
5.9×
style: select+unselect 256-band under the default sheet — bypass punch-out — no bypasses (diff path; the O(0) gate row)
33.4 µs
style: select+unselect 256-band under the default sheet — bypass punch-out — 128 of 256 bypassed (punched out to merged writes)
233 µs
style: sheet swap (applyAll) — 0 vs 128 bypasses — no bypasses
2.47 ms
style: sheet swap (applyAll) — 0 vs 128 bypasses — 128 bypassed
8.91 ms
10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
style: sheet swap (compile + applyAll)v3 12.7 ms13.0 ms 17.4 ms12.1 ms 46
style: sheet swap (compile + applyAll)gpu 2.32 ms2.36 ms 3.00 ms2.23 ms 282
style: compile vs compile + applycompile only (in batch) 25.1 µs27.7 µs 26.6 µs24.7 µs 12
style: compile vs compile + applycompile + apply 2.30 ms2.36 ms 3.29 ms2.21 ms 283
style: first apply on add (256-node band)v3 1.41 ms1.66 ms 7.22 ms1.17 ms 400
style: first apply on add (256-node band)gpu 717 µs836 µs 2.59 ms680 µs 825
style: applyAll, flat vs compound (100 parents — the 14.6 partition)flat 2.30 ms2.34 ms 2.85 ms2.22 ms 297
style: applyAll, flat vs compound (100 parents — the 14.6 partition)compound 2.73 ms2.83 ms 4.76 ms2.67 ms 243
style: applyAll — constant vs state-case (the 57.1d partition)constant sheet 2.26 ms2.30 ms 2.70 ms2.21 ms 301
style: applyAll — constant vs state-case (the 57.1d partition)state-case sheet 2.28 ms2.35 ms 3.13 ms2.24 ms 294
style: applyAll — state-case vs data-case (what the partition avoids)state-case sheet 2.27 ms2.31 ms 2.72 ms2.22 ms 297
style: applyAll — state-case vs data-case (what the partition avoids)data-case sheet 10.0 ms10.2 ms 11.0 ms9.78 ms 62
style: select+unselect 256-band — constant vs state-case sheetconstant sheet (skips restyle) 6.79 µs6.79 µs 6.89 µs6.67 µs 20
style: select+unselect 256-band — constant vs state-case sheetpaint-only state sheet (round-61 diff path) 32.3 µs33.1 µs 48.1 µs31.3 µs 19777
style: select+unselect 256-band — constant vs state-case sheetstate-case sheet (all channels; full write) 376 µs384 µs 486 µs371 µs 1749
style: read one prop (color)v3 96.0 ns108 ns 639 ns88.0 ns 2000298
style: read one prop (color)gpu 54.2 ns59.3 ns 99.2 ns53.0 ns 2868
style: read one prop (width)v3 115 ns124 ns 424 ns105 ns 1894145
style: read one prop (width)gpu 51.6 ns57.4 ns 111 ns48.7 ns 2967
style: numericStylev3 138 ns129 ns 356 ns82.0 ns 1794711
style: numericStylegpu 47.8 ns50.9 ns 112 ns46.4 ns 3375
style: renderedStyle (one prop)v3 910 ns979 ns 2.00 µs870 ns 538373
style: renderedStyle (one prop)gpu 63.6 ns67.9 ns 175 ns61.7 ns 2519
style: whole-object style()v3 85.8 µs92.3 µs 196 µs84.0 µs 7546
style: whole-object style()gpu 14.0 µs15.4 µs 50.3 µs13.3 µs 43802
style: bypass set (ele.style name,value)v3 10.2 µs10.3 µs 10.8 µs9.90 µs 11
style: bypass set (ele.style name,value)gpu 2.52 µs2.80 µs 4.04 µs2.40 µs 56
style: bypass set + removeStyle round-tripv3 21.1 µs22.6 µs 23.8 µs20.1 µs 12
style: bypass set + removeStyle round-tripgpu 3.56 µs3.90 µs 4.65 µs3.39 µs 39
style: select+unselect 256-band under the default sheet — bypass punch-outno bypasses (diff path; the O(0) gate row) 33.4 µs35.7 µs 80.1 µs32.2 µs 19159
style: select+unselect 256-band under the default sheet — bypass punch-out128 of 256 bypassed (punched out to merged writes) 233 µs250 µs 498 µs229 µs 2788
style: sheet swap (applyAll) — 0 vs 128 bypassesno bypasses 2.47 ms2.51 ms 3.07 ms2.39 ms 263
style: sheet swap (applyAll) — 0 vs 128 bypasses128 bypassed 8.91 ms9.17 ms 10.6 ms8.64 ms 71

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

style( 'background-color' ) (was #4 in the switch)
0.98×
style( 'border-width' ) (was #6 in the switch)
1.15×
style( 'text-wrap' ) (was #73 in the switch)
1.76×
style( 'text-max-width' ) (was #74 in the switch)
1.74×
style( 'taxi-radius' ) (was #142 in the switch)
1.28×
style( 'target-distance-from-node' ) (was #150 in the switch)
1.29×
whole-object style() (gpu-only: v3 returns a different shape) — gpu node
13.1 µs
whole-object style() (gpu-only: v3 returns a different shape) — gpu edge
14.5 µs
colour-valued vs numeric reads (the string build) — gpu background-color (colour)
78.3 ns
colour-valued vs numeric reads (the string build) — gpu border-color (colour)
70.5 ns
colour-valued vs numeric reads (the string build) — gpu border-width (number)
65.4 ns
colour-valued vs numeric reads (the string build) — gpu width (number)
62.2 ns
the getters that ride readProp — gpu numericStyle( width )
61.5 ns
the getters that ride readProp — gpu effectiveOpacity()
22.7 ns
the getters that ride readProp — gpu renderedStyle( width )
79.9 ns
10 ns100 ns1 µs10 µs100 µs
All stats (table view)
groupbenchp50avgp99minsamples
style( 'background-color' ) (was #4 in the switch)v3 59.2 ns61.1 ns 92.7 ns57.2 ns 2806
style( 'background-color' ) (was #4 in the switch)gpu 60.4 ns62.0 ns 75.3 ns59.8 ns 2763
style( 'border-width' ) (was #6 in the switch)v3 61.7 ns62.5 ns 74.6 ns58.5 ns 2748
style( 'border-width' ) (was #6 in the switch)gpu 53.7 ns54.7 ns 65.5 ns51.5 ns 3124
style( 'text-wrap' ) (was #73 in the switch)v3 61.7 ns62.7 ns 75.5 ns58.4 ns 2729
style( 'text-wrap' ) (was #73 in the switch)gpu 35.1 ns35.7 ns 46.1 ns34.0 ns 4787
style( 'text-max-width' ) (was #74 in the switch)v3 59.4 ns60.9 ns 76.7 ns56.8 ns 2823
style( 'text-max-width' ) (was #74 in the switch)gpu 34.2 ns34.9 ns 46.2 ns33.0 ns 4902
style( 'taxi-radius' ) (was #142 in the switch)v3 61.8 ns62.2 ns 73.4 ns58.7 ns 2764
style( 'taxi-radius' ) (was #142 in the switch)gpu 48.3 ns52.3 ns 95.3 ns46.4 ns 3257
style( 'target-distance-from-node' ) (was #150 in the switch)v3 61.3 ns63.0 ns 79.6 ns59.7 ns 2726
style( 'target-distance-from-node' ) (was #150 in the switch)gpu 47.6 ns49.0 ns 66.3 ns46.9 ns 3493
whole-object style() (gpu-only: v3 returns a different shape)gpu node 13.1 µs13.7 µs 27.8 µs12.3 µs 48880
whole-object style() (gpu-only: v3 returns a different shape)gpu edge 14.5 µs15.3 µs 37.6 µs13.8 µs 43989
colour-valued vs numeric reads (the string build)gpu background-color (colour) 78.3 ns80.8 ns 130 ns76.0 ns 2118
colour-valued vs numeric reads (the string build)gpu border-color (colour) 70.5 ns73.5 ns 107 ns68.3 ns 2326
colour-valued vs numeric reads (the string build)gpu border-width (number) 65.4 ns67.1 ns 88.7 ns63.1 ns 2549
colour-valued vs numeric reads (the string build)gpu width (number) 62.2 ns64.4 ns 108 ns60.5 ns 2657
the getters that ride readPropgpu numericStyle( width ) 61.5 ns62.3 ns 74.5 ns59.5 ns 2746
the getters that ride readPropgpu effectiveOpacity() 22.7 ns23.9 ns 36.1 ns21.9 ns 7160
the getters that ride readPropgpu renderedStyle( width ) 79.9 ns82.1 ns 110 ns78.9 ns 2083

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

load: init from the definition form (construct + dispose)
27×
load: v4 ingest forms (construct + dispose) — definition form
4.50 ms
load: v4 ingest forms (construct + dispose) — columnar form
3.34 ms
load: v4 ingest forms (construct + dispose) — wire buffer
2.89 ms
load: v4 ingest forms (construct + dispose) — def clone alone (control)
311 µs
load: conversion — toColumnarElements
708 µs
load: conversion — serializeElements (from columnar)
180 µs
load: conversion — serializeElements (from defs)
886 µs
load: conversion — deserializeElements
4.60 µs
load: export from a live graph — cy.serialize() (wire)
502 µs
load: export from a live graph — cy.json() (v4)
716 µs
load: cy.json()
2.7×
load: add a 256-node band (add + remove)
1.65×
load: add a 256-node band, v4 forms — definition form
2.29 ms
load: add a 256-node band, v4 forms — columnar form
1.94 ms
load: add a 256-node band, v4 forms — wire buffer
1.92 ms
1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
load: init from the definition form (construct + dispose)v3 134 ms147 ms 188 ms127 ms 12
load: init from the definition form (construct + dispose)gpu 5.03 ms6.62 ms 20.3 ms4.22 ms 97
load: v4 ingest forms (construct + dispose)definition form 4.50 ms6.50 ms 16.3 ms4.18 ms 102
load: v4 ingest forms (construct + dispose)columnar form 3.34 ms4.46 ms 13.5 ms3.23 ms 150
load: v4 ingest forms (construct + dispose)wire buffer 2.89 ms4.36 ms 13.0 ms2.79 ms 156
load: v4 ingest forms (construct + dispose)def clone alone (control) 311 µs619 µs 16.6 ms213 µs 1061
load: conversiontoColumnarElements 708 µs753 µs 1.15 ms689 µs 921
load: conversionserializeElements (from columnar) 180 µs369 µs 993 µs173 µs 1886
load: conversionserializeElements (from defs) 886 µs903 µs 1.31 ms852 µs 770
load: conversiondeserializeElements 4.60 µs4.34 µs 5.72 µs3.33 µs 30
load: export from a live graphcy.serialize() (wire) 502 µs577 µs 1.98 ms486 µs 1192
load: export from a live graphcy.json() (v4) 716 µs1.05 ms 6.79 ms687 µs 636
load: cy.json()v3 2.00 ms2.34 ms 6.88 ms1.94 ms 290
load: cy.json()gpu 739 µs839 µs 2.63 ms723 µs 828
load: add a 256-node band (add + remove)v3 3.65 ms4.36 ms 11.0 ms3.26 ms 151
load: add a 256-node band (add + remove)gpu 2.22 ms2.49 ms 7.48 ms1.48 ms 271
load: add a 256-node band, v4 formsdefinition form 2.29 ms2.30 ms 5.09 ms1.51 ms 297
load: add a 256-node band, v4 formscolumnar form 1.94 ms2.00 ms 3.58 ms1.31 ms 335
load: add a 256-node band, v4 formswire buffer 1.92 ms1.96 ms 3.54 ms1.28 ms 350

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

pick: hit (the walk; one inside-test) — zoom 1
20.8 µs
pick: hit (the walk; one inside-test) — zoom 2
21.1 µs
pick: miss walk — exact vs 24 px touch halo (57.9) — exact
46.6 µs
pick: miss walk — exact vs 24 px touch halo (57.9) — padPx 24
44.8 µs
pick: shape inside-test, 2000 coincident misses — ellipse
88.3 µs
pick: shape inside-test, 2000 coincident misses — star
235 µs
pick: shape inside-test, 2000 coincident misses — round-hexagon
794 µs
pick: shape inside-test, 2000 coincident misses — barrel
686 µs
pick: shape inside-test, 2000 coincident misses — cut-rectangle
100 µs
pick: shape inside-test, 2000 coincident misses — polygon
211 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 1
790 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 2
799 µs
pick: background miss (full highWater walk) — gpu
45.8 µs
pick: label box in the scan (text-events) — text-events: no
45.3 µs
pick: label box in the scan (text-events) — text-events: yes
126 µs
box: elementsInBox by covered fraction — 10%
148 µs
box: elementsInBox by covered fraction — 50%
193 µs
box: elementsInBox by covered fraction — 100%
321 µs
box: label containment (boxSelectionIncludesLabels) — off
228 µs
box: label containment (boxSelectionIncludesLabels) — on
263 µs
box: overlap vs contain (straight edges) — contain
235 µs
box: overlap vs contain (straight edges) — overlap
508 µ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.20 ms
bounds: whole-graph boundingBox()
5.8×
bounds: boundingBox, labels in vs out (v4) — includeLabels: true (default)
1.36 ms
bounds: boundingBox, labels in vs out (v4) — includeLabels: false
811 µs
bounds: cy.fit() (whole-graph scan)
32×
bounds: getFitViewport() (compute without committing)
33×
bounds: boundingBoxAt (v4 only) — gpu
2.65 ms
bounds: one node boundingBox()
1.61×
bounds: labelBoundingBox (v4 only) — gpu
427 ns
bounds: compound + taxi conservative scan (round 54, v4 only) — warm (curve bbs memoized)
75.4 µs
bounds: compound + taxi conservative scan (round 54, v4 only) — cold (geometry write per call)
149 µs
100 ns1 µs10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
pick: hit (the walk; one inside-test)zoom 1 20.8 µs21.6 µs 42.6 µs20.3 µs 31826
pick: hit (the walk; one inside-test)zoom 2 21.1 µs21.6 µs 21.9 µs20.9 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)exact 46.6 µs47.0 µs 47.5 µs46.0 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)padPx 24 44.8 µs46.2 µs 87.6 µs43.5 µs 15031
pick: shape inside-test, 2000 coincident missesellipse 88.3 µs90.5 µs 133 µs84.7 µs 7707
pick: shape inside-test, 2000 coincident missesstar 235 µs248 µs 414 µs229 µs 2812
pick: shape inside-test, 2000 coincident missesround-hexagon 794 µs811 µs 1.07 ms768 µs 863
pick: shape inside-test, 2000 coincident missesbarrel 686 µs706 µs 1.01 ms673 µs 988
pick: shape inside-test, 2000 coincident missescut-rectangle 100 µs103 µs 161 µs97.3 µs 6795
pick: shape inside-test, 2000 coincident missespolygon 211 µs217 µs 312 µs203 µs 3225
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 1 790 µs804 µs 953 µs769 µs 870
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 2 799 µs813 µs 1.27 ms777 µs 861
pick: background miss (full highWater walk)gpu 45.8 µs46.2 µs 47.3 µs44.8 µs 12
pick: label box in the scan (text-events)text-events: no 45.3 µs45.7 µs 46.2 µs44.7 µs 12
pick: label box in the scan (text-events)text-events: yes 126 µs130 µs 215 µs122 µs 5325
box: elementsInBox by covered fraction10% 148 µs153 µs 241 µs147 µs 4566
box: elementsInBox by covered fraction50% 193 µs201 µs 308 µs190 µs 3479
box: elementsInBox by covered fraction100% 321 µs337 µs 793 µs314 µs 2073
box: label containment (boxSelectionIncludesLabels)off 228 µs238 µs 402 µs225 µs 2941
box: label containment (boxSelectionIncludesLabels)on 263 µs274 µs 635 µs259 µs 2552
box: overlap vs contain (straight edges)contain 235 µs245 µs 362 µs231 µs 2855
box: overlap vs contain (straight edges)overlap 508 µs514 µs 896 µs447 µs 1356
box: overlap vs contain (curved edges — the segment walk)contain 1.28 ms1.28 ms 1.70 ms1.24 ms 544
box: overlap vs contain (curved edges — the segment walk)overlap 2.20 ms2.25 ms 2.94 ms2.18 ms 309
bounds: whole-graph boundingBox()v3 7.96 ms8.11 ms 9.60 ms7.58 ms 80
bounds: whole-graph boundingBox()gpu 1.38 ms1.41 ms 1.85 ms1.35 ms 471
bounds: boundingBox, labels in vs out (v4)includeLabels: true (default) 1.36 ms1.39 ms 2.00 ms1.35 ms 498
bounds: boundingBox, labels in vs out (v4)includeLabels: false 811 µs834 µs 1.26 ms789 µs 837
bounds: cy.fit() (whole-graph scan)v3 7.72 ms7.88 ms 9.43 ms7.32 ms 85
bounds: cy.fit() (whole-graph scan)gpu 238 µs248 µs 402 µs230 µs 2814
bounds: getFitViewport() (compute without committing)v3 7.76 ms7.88 ms 9.07 ms7.39 ms 85
bounds: getFitViewport() (compute without committing)gpu 236 µs245 µs 310 µs232 µs 2849
bounds: boundingBoxAt (v4 only)gpu 2.65 ms2.73 ms 3.83 ms2.60 ms 249
bounds: one node boundingBox()v3 1.64 µs1.66 µs 1.91 µs1.60 µs 98
bounds: one node boundingBox()gpu 1.01 µs1.03 µs 1.26 µs973 ns 158
bounds: labelBoundingBox (v4 only)gpu 427 ns453 ns 976 ns416 ns 371
bounds: compound + taxi conservative scan (round 54, v4 only)warm (curve bbs memoized) 75.4 µs78.3 µs 170 µs73.3 µs 8896
bounds: compound + taxi conservative scan (round 54, v4 only)cold (geometry write per call) 149 µs154 µs 240 µs144 µs 4552

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

data: bulk write, numeric column
21×
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)
7.9×
data: read one numeric key
1.35×
data: read one string key (dictionary decode)
1.35×
data: read the whole object
2.3×
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)
8.6×
query: structural, parents (:parent vs { parent: true })
33×
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.78 ms1.82 ms 3.15 ms1.70 ms 366
data: bulk write, numeric columngpu 84.2 µs87.7 µs 130 µs81.2 µs 7977
data: bulk write, dictionary string column (4 values)v3 1.77 ms1.80 ms 2.32 ms1.72 ms 372
data: bulk write, dictionary string column (4 values)gpu 108 µs113 µs 311 µs95.9 µs 6204
data: bulk write, one new dictionary entry per passv3 1.79 ms1.98 ms 3.33 ms1.77 ms 347
data: bulk write, one new dictionary entry per passgpu 101 µs105 µs 156 µs95.7 µs 6650
data: bulk write, object column (plain-array fallback)v3 1.78 ms1.84 ms 3.12 ms1.75 ms 377
data: bulk write, object column (plain-array fallback)gpu 83.3 µs85.4 µs 123 µs81.1 µs 8192
data: removeData (whole collection)v3 2.62 ms2.68 ms 3.95 ms2.51 ms 256
data: removeData (whole collection)gpu 330 µs344 µs 658 µs315 µs 1959
data: read one numeric keyv3 38.5 ns40.1 ns 90.1 ns37.2 ns 4280
data: read one numeric keygpu 28.6 ns30.1 ns 47.9 ns27.5 ns 5682
data: read one string key (dictionary decode)v3 42.0 ns43.6 ns 88.1 ns40.2 ns 3937
data: read one string key (dictionary decode)gpu 31.2 ns31.5 ns 47.6 ns27.0 ns 5433
data: read the whole objectv3 47.7 ns49.3 ns 77.9 ns45.5 ns 3486
data: read the whole objectgpu 21.0 ns22.4 ns 40.4 ns20.1 ns 7606
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })v3 656 µs681 µs 1.14 ms638 µs 1021
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })gpu 47.3 µs51.2 µs 125 µs41.8 µs 13491
query: data comparison ([weight > 3] vs { gt })v3 751 µs777 µs 1.21 ms719 µs 898
query: data comparison ([weight > 3] vs { gt })gpu 71.5 µs75.6 µs 181 µs58.1 µs 9190
query: two keys AND-edv3 824 µs876 µs 1.46 ms777 µs 795
query: two keys AND-edgpu 66.7 µs70.7 µs 137 µs64.3 µs 9828
query: membership ([bucket in ...] vs { in })v3 1.00 ms1.03 ms 1.46 ms961 µs 677
query: membership ([bucket in ...] vs { in })gpu 65.1 µs70.9 µs 154 µs62.2 µs 9770
query: predicate function (both sides)v3 651 µs673 µs 937 µs638 µs 1036
query: predicate function (both sides)gpu 76.1 µs79.3 µs 142 µs73.8 µs 8774
query: structural, parents (:parent vs { parent: true })v3 515 µs543 µs 1.07 ms508 µs 1288
query: structural, parents (:parent vs { parent: true })gpu 15.4 µs16.3 µs 19.1 µs15.1 µs 12
query: structural, childless (:childless vs { parent: false })v3 796 µs814 µs 981 µs784 µs 857
query: structural, childless (:childless vs { parent: false })gpu 61.4 µs78.4 µs 207 µs55.9 µs 8698
query: structural, orphans (:orphan vs { child: false })v3 488 µs499 µs 619 µs482 µs 1397
query: structural, orphans (:orphan vs { child: false })gpu 15.4 µs16.0 µs 16.3 µs15.2 µs 12

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

emit: position write, no listeners
27×
emit: 1 core listener
8.3×
emit: 1 element (ref-qualified) listener
7.7×
emit: delegated (v3 selector vs v4 predicate)
8.2×
emit: 10 core listeners
6.2×
emit: on() + off() round-trip
2.1×
emit: flat vs phased (compound bubbling, 14.5) — orphan (flat emit)
305 ns
emit: flat vs phased (compound bubbling, 14.5) — child of 2 ancestors (phased)
850 ns
emit: flat vs phased, no listeners — orphan (flat)
83.5 ns
emit: flat vs phased, no listeners — child (phased)
506 ns
anim: start + stop, one element
1.28×
anim: start against a running animation (round-21 eviction) — disjoint channels (composes)
1.26 µs
anim: start against a running animation (round-21 eviction) — overlapping channels (evicts)
813 ns
anim: start + stop, 512-node collection
3.0×
anim: delay() (no channels touched)
1.58×
anim: controls (v4 only) — pause + resume
456 ns
anim: controls (v4 only) — reverse
873 ns
anim: viewport animate + stop
2.9×
10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
emit: position write, no listenersv3 1.31 µs1.34 µs 1.64 µs1.27 µs 111
emit: position write, no listenersgpu 48.9 ns52.3 ns 99.5 ns46.9 ns 3009
emit: 1 core listenerv3 1.40 µs1.43 µs 1.93 µs1.36 µs 116
emit: 1 core listenergpu 169 ns179 ns 306 ns165 ns 893
emit: 1 element (ref-qualified) listenerv3 1.41 µs1.52 µs 2.27 µs1.37 µs 102
emit: 1 element (ref-qualified) listenergpu 183 ns202 ns 1.08 µs178 ns 783
emit: delegated (v3 selector vs v4 predicate)v3 1.50 µs1.57 µs 2.75 µs1.46 µs 103
emit: delegated (v3 selector vs v4 predicate)gpu 183 ns197 ns 437 ns181 ns 803
emit: 10 core listenersv3 1.97 µs2.03 µs 2.22 µs1.92 µs 77
emit: 10 core listenersgpu 316 ns323 ns 462 ns308 ns 497
emit: on() + off() round-tripv3 460 ns561 ns 1.45 µs422 ns 289
emit: on() + off() round-tripgpu 216 ns260 ns 913 ns183 ns 631
emit: flat vs phased (compound bubbling, 14.5)orphan (flat emit) 305 ns356 ns 1.97 µs280 ns 975657
emit: flat vs phased (compound bubbling, 14.5)child of 2 ancestors (phased) 850 ns923 ns 1.96 µs818 ns 171
emit: flat vs phased, no listenersorphan (flat) 83.5 ns93.8 ns 679 ns80.3 ns 1800
emit: flat vs phased, no listenerschild (phased) 506 ns579 ns 1.99 µs483 ns 285
anim: start + stop, one elementv3 824 ns1.25 µs 3.44 µs752 ns 421778
anim: start + stop, one elementgpu 642 ns1.06 µs 4.63 µs588 ns 459980
anim: start against a running animation (round-21 eviction)disjoint channels (composes) 1.26 µs1.94 µs 4.23 µs1.07 µs 81
anim: start against a running animation (round-21 eviction)overlapping channels (evicts) 813 ns1.41 µs 3.50 µs793 ns 106
anim: start + stop, 512-node collectionv3 299 µs434 µs 2.49 ms287 µs 1472
anim: start + stop, 512-node collectiongpu 100 µs112 µs 181 µs96.5 µs 5739
anim: delay() (no channels touched)v3 651 ns959 ns 3.40 µs631 ns 167
anim: delay() (no channels touched)gpu 411 ns723 ns 2.66 µs407 ns 224
anim: controls (v4 only)pause + resume 456 ns738 ns 2.55 µs452 ns 208
anim: controls (v4 only)reverse 873 ns1.50 µs 3.41 µs849 ns 99
anim: viewport animate + stopv3 572 ns804 ns 2.92 µs558 ns 192
anim: viewport animate + stopgpu 198 ns219 ns 575 ns194 ns 726

store N=2,000 · 1.0 min

id index: set x 2000 (build) — gpu
269 µs
id index: single-key operations — get (probe)
66.0 ns
id index: single-key operations — has
51.2 ns
id index: single-key operations — idAt (memoized hit)
8.97 ns
id index: single-key operations — hashAt
6.98 ns
id index: remove + re-set (churn, drives the round-11 reclaim) — gpu
231 ns
adjacency: rebuild (4000 edges, two counting passes) — gpu
39.1 µs
adjacency: reads — outDegree (O(1))
6.16 ns
adjacency: reads — outEdges
44.7 ns
adjacency: reads — connectedEdges
118 ns
adjacency: addEdge + removeEdge (the overlay path) — gpu
143 ns
blob: write x 2000 (build) — gpu
105 µs
blob: single-record operations — rewrite in place (same length)
30.1 ns
blob: single-record operations — offsetOf
4.37 ns
blob: single-record operations — free + rewrite
155 ns
dirty: mark (per-write span coalescing) — contiguous marks
12.9 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)
203 ns
images: registry bookkeeping — acquire (new url) + release
533 ns
charts: sheet apply, chart vs no chart — no chart
2.28 ms
charts: sheet apply, chart vs no chart — pie from data (blob record per node)
2.72 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 269 µs278 µs 412 µs254 µs 2526
id index: single-key operationsget (probe) 66.0 ns65.4 ns 112 ns53.5 ns 2609
id index: single-key operationshas 51.2 ns52.6 ns 78.0 ns49.5 ns 3248
id index: single-key operationsidAt (memoized hit) 8.97 ns9.27 ns 17.3 ns8.71 ns 18307
id index: single-key operationshashAt 6.98 ns7.21 ns 14.1 ns6.89 ns 23495
id index: remove + re-set (churn, drives the round-11 reclaim)gpu 231 ns237 ns 301 ns225 ns 708
adjacency: rebuild (4000 edges, two counting passes)gpu 39.1 µs47.1 µs 232 µs36.8 µs 14698
adjacency: readsoutDegree (O(1)) 6.16 ns6.36 ns 12.6 ns5.78 ns 26564
adjacency: readsoutEdges 44.7 ns45.8 ns 60.1 ns43.8 ns 3725
adjacency: readsconnectedEdges 118 ns181 ns 2.11 µs114 ns 923
adjacency: addEdge + removeEdge (the overlay path)gpu 143 ns147 ns 207 ns141 ns 1137
blob: write x 2000 (build)gpu 105 µs130 µs 851 µs101 µs 5344
blob: single-record operationsrewrite in place (same length) 30.1 ns31.0 ns 42.6 ns29.8 ns 5511
blob: single-record operationsoffsetOf 4.37 ns4.48 ns 7.54 ns4.18 ns 37472
blob: single-record operationsfree + rewrite 155 ns181 ns 587 ns147 ns 939
dirty: mark (per-write span coalescing)contiguous marks 12.9 ns13.3 ns 23.3 ns12.5 ns 12753
dirty: mark (per-write span coalescing)scattered marks 17.8 ns18.2 ns 28.1 ns17.2 ns 9347
dirty: take (a frame's drain)gpu 598 ns702 ns 1.20 µs583 ns 233
images: registry bookkeepingacquire (existing url) 203 ns204 ns 244 ns198 ns 834
images: registry bookkeepingacquire (new url) + release 533 ns597 ns 2.46 µs519 ns 277
charts: sheet apply, chart vs no chartno chart 2.28 ms2.37 ms 4.19 ms2.21 ms 284
charts: sheet apply, chart vs no chartpie from data (blob record per node) 2.72 ms2.77 ms 3.31 ms2.63 ms 246
charts: data write refreshing chart-valuesgpu 1.49 ms1.53 ms 1.91 ms1.44 ms 454

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

viewport: zoom() get
4.6×
viewport: zoom( n ) set
1.84×
viewport: pan() get
1.10×
viewport: pan( p ) set
1.85×
viewport: panBy()
1.63×
viewport: extent()
1.50×
viewport: renderedExtent()
1.58×
viewport: width() + height() + size() (3 calls)
3.8×
viewport: minZoom/maxZoom get (2 calls)
15×
viewport: center( eles )
19×
viewport: reset()
104×
viewport: viewport({ zoom, pan })
59×
viewport: getCenterPan( eles ) — gpu
6.62 µs
core: instanceString + headless + styleEnabled (3 calls)
1.25×
core: hasElementWithId + hasCompoundNodes (2 calls)
1.12×
core: options()
85×
core: mutableElements() (v4 materializes; v3 is O(1))
1.36×
core: gating getters (5 calls)
1.15×
core: gating setters round-trip (autolock/autoungrabify/autounselectify)
1.86×
core: interaction tuning getters (5 calls) — gpu
7.25 ns
core: graph data() set + get (v3 restyles the graph)
8305×
core: graph scratch() set + get (v3 restyles the graph)
16693×
core: batch( fn ) (empty)
6.4×
core: startBatch + endBatch + batching
6.0×
core: collection()
7.0×
core: compact() (no dead slots — the early-out) — gpu
16.7 µs
collection: element accessors (id/group/isNode/isEdge, 4 calls)
1.74×
collection: length + empty + nonempty (3 calls)
4.6×
collection: eq/first/last (3 calls)
1.88×
collection: slice()
2.2×
collection: toArray()
12×
collection: sort( fn )
1.57×
collection: reduce( fn )
1.40×
collection: min + max ( fn ) (2 calls)
1.96×
collection: some + every (2 calls)
1.59×
collection: same + anySame + contains (3 calls)
73×
collection: allAre (all match: the full walk)
1.49×
collection: is (none match: the full walk)
2.4×
collection: union
5.9×
collection: intersection
28×
collection: difference
29×
collection: symmetricDifference
3.9×
collection: absoluteComplement
16×
collection: byGroup
3.1×
collection: diff
3.3×
collection: indexOf
1.35×
traversal: openNeighborhood + closedNeighborhood (2 calls)
3.0×
traversal: connectedNodes
3.4×
traversal: sources + targets (2 calls)
3.2×
traversal: source() + target() (2 calls)
1.36×
traversal: edgesWith
1.27×
traversal: edgesTo
1.26×
traversal: parallelEdges + codirectedEdges (2 calls)
3.6×
traversal: roots + leaves (2 calls)
13×
traversal: allAreNeighbors
5.4×
traversal: isLoop + isSimple (2 calls)
2.3×
degree: indegree + outdegree (2 calls)
76×
degree: minDegree + maxDegree (2 calls)
42×
degree: minIndegree + maxOutdegree (2 calls)
24×
dimensions: renderedPosition get
2.5×
dimensions: relativePosition get
11×
dimensions: width + height + outerWidth + outerHeight (4 calls)
2.9×
dimensions: rendered dims (4 calls)
3.1×
dimensions: renderedBoundingBox
1.83×
dimensions: midpoint + renderedMidpoint (2 calls) — gpu
1.17 µs
dimensions: source/targetEndpoint (2 calls) — gpu
377 ns
dimensions: rendered source/targetEndpoint (2 calls) — gpu
399 ns
dimensions: shift + silentShift (round-trip)
62×
dimensions: silentPosition
15×
dimensions: positions( fn ) over 100
50×
dimensions: padding + paddedWidth + paddedHeight (3 calls)
13×
curves: isBundledBezier — gpu
33.5 ns
curves: controlPoints + renderedControlPoints (2 calls) — gpu
534 ns
curves: segmentPoints (undefined for bezier) — gpu
41.6 ns
compound: parent + parents + ancestors (3 calls)
3.7×
compound: children + descendants + siblings (3 calls)
4.7×
compound: orphans + nonorphans (2 calls)
7.0×
compound: commonAncestors
127×
compound: isParent/isChild/isChildless/isOrphan (4 calls)
1.56×
flags: select + unselect + selected (band)
16×
flags: selectify + unselectify + selectable
97×
flags: lock + unlock + locked
93×
flags: grabify + ungrabify + grabbable
95×
flags: show + hide + visible
226×
flags: active/activate/unactivate (3 calls)
15×
flags: panify + unpanify + pannable
94×
flags: takesUpSpace + interactive + transparent (3 calls)
2.8×
flags: effectiveOpacity
2.1×
element data: scratch get + set
7.6×
element data: json() one element
2.0×
element data: jsons() over 100
1.93×
element data: label() — gpu
15.1 ns
core: batchData()
8.7×
core: animated()
4.9×
core: zoomRange get — gpu
2.16 ns
core: forceRender() (headless no-op)
16×
core: resize() / invalidateSize()
2.3×
core: onRender + offRender
2.4×
core: removeScratch()
9502×
core: selectionType get
2.00×
core: isReady()
2.2×
core: window()
2.8×
core: container()
2.6×
core: destroyed()
2.2×
core: removeAllListeners()
8.7×
collection: cy()
3.5×
collection: indexOfId()
1.76×
collection: removed() + inside() (2 calls)
1.16×
collection: silentPositions( fn ) over 100
31×
collection: animated()
2.9×
collection: delayAnimation()
2.8×
collection: removeScratch()
8.8×
collection: component()
44×
collection: layoutDimensions()
3.6×
degree: maxIndegree + minOutdegree (2 calls)
24×
flags: grabbed + hidden + inactive (3 calls)
2.2×
curves: renderedSegmentPoints — gpu
36.2 ns
layout contract: edgeSlots + endpoints + degreeOf — gpu
34.7 µ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.59 ns5.73 ns 10.9 ns5.40 ns 29387
viewport: zoom() getgpu 1.21 ns1.23 ns 1.29 ns1.21 ns 129473
viewport: zoom( n ) setv3 602 ns613 ns 811 ns565 ns 270
viewport: zoom( n ) setgpu 326 ns331 ns 392 ns315 ns 507
viewport: pan() getv3 5.39 ns5.53 ns 6.54 ns5.28 ns 30478
viewport: pan() getgpu 4.91 ns5.03 ns 9.08 ns4.80 ns 33540
viewport: pan( p ) setv3 610 ns613 ns 679 ns583 ns 273
viewport: pan( p ) setgpu 331 ns337 ns 397 ns322 ns 501
viewport: panBy()v3 561 ns569 ns 676 ns546 ns 296
viewport: panBy()gpu 343 ns348 ns 508 ns308 ns 483
viewport: extent()v3 29.3 ns44.1 ns 206 ns28.2 ns 3837
viewport: extent()gpu 19.5 ns26.0 ns 106 ns18.4 ns 6460
viewport: renderedExtent()v3 26.8 ns28.2 ns 51.7 ns25.7 ns 6007
viewport: renderedExtent()gpu 17.0 ns23.8 ns 106 ns15.7 ns 7066
viewport: width() + height() + size() (3 calls)v3 20.9 ns21.9 ns 44.6 ns20.0 ns 7763
viewport: width() + height() + size() (3 calls)gpu 5.55 ns5.84 ns 11.3 ns5.38 ns 28838
viewport: minZoom/maxZoom get (2 calls)v3 14.8 ns15.4 ns 25.9 ns14.1 ns 11063
viewport: minZoom/maxZoom get (2 calls)gpu 0.999 ns1.05 ns 1.84 ns0.977 ns 149337
viewport: center( eles )v3 122 µs128 µs 227 µs117 µs 5432
viewport: center( eles )gpu 6.51 µs6.57 µs 6.88 µs6.43 µs 22
viewport: reset()v3 927 ns1.02 µs 1.56 µs894 ns 162
viewport: reset()gpu 8.95 ns9.31 ns 17.8 ns8.51 ns 18156
viewport: viewport({ zoom, pan })v3 929 ns1.02 µs 1.60 µs897 ns 164
viewport: viewport({ zoom, pan })gpu 15.9 ns16.6 ns 38.7 ns15.1 ns 10246
viewport: getCenterPan( eles )gpu 6.62 µs6.60 µs 6.74 µs6.46 µs 22
core: instanceString + headless + styleEnabled (3 calls)v3 32.3 ns33.9 ns 62.5 ns31.0 ns 5028
core: instanceString + headless + styleEnabled (3 calls)gpu 25.8 ns26.9 ns 41.4 ns25.1 ns 6334
core: hasElementWithId + hasCompoundNodes (2 calls)v3 35.8 ns36.6 ns 47.1 ns34.5 ns 4690
core: hasElementWithId + hasCompoundNodes (2 calls)gpu 32.0 ns33.6 ns 59.5 ns31.1 ns 5073
core: options()v3 90.6 ns94.2 ns 171 ns89.1 ns 1810
core: options()gpu 1.07 ns1.10 ns 1.53 ns1.03 ns 144392
core: mutableElements() (v4 materializes; v3 is O(1))v3 3.19 ns3.35 ns 6.56 ns3.14 ns 49737
core: mutableElements() (v4 materializes; v3 is O(1))gpu 2.35 ns2.47 ns 6.14 ns2.20 ns 66894
core: gating getters (5 calls)v3 15.5 ns16.2 ns 28.7 ns14.8 ns 10566
core: gating getters (5 calls)gpu 13.5 ns14.0 ns 25.8 ns12.7 ns 12199
core: gating setters round-trip (autolock/autoungrabify/autounselectify)v3 11.2 ns11.6 ns 19.8 ns10.8 ns 14707
core: gating setters round-trip (autolock/autoungrabify/autounselectify)gpu 6.00 ns6.18 ns 12.8 ns5.74 ns 27354
core: interaction tuning getters (5 calls)gpu 7.25 ns7.51 ns 13.7 ns7.00 ns 22619
core: graph data() set + get (v3 restyles the graph)v3 2.74 ms2.78 ms 3.29 ms2.63 ms 247
core: graph data() set + get (v3 restyles the graph)gpu 330 ns338 ns 428 ns317 ns 501
core: graph scratch() set + get (v3 restyles the graph)v3 2.77 ms2.91 ms 5.41 ms2.65 ms 236
core: graph scratch() set + get (v3 restyles the graph)gpu 166 ns172 ns 276 ns161 ns 992
core: batch( fn ) (empty)v3 533 ns638 ns 1.56 µs499 ns 264
core: batch( fn ) (empty)gpu 83.7 ns88.1 ns 156 ns82.1 ns 1927
core: startBatch + endBatch + batchingv3 540 ns653 ns 1.62 µs516 ns 258
core: startBatch + endBatch + batchinggpu 90.4 ns162 ns 2.85 µs87.5 ns 1022
core: collection()v3 451 ns527 ns 1.53 µs440 ns 318
core: collection()gpu 64.6 ns67.8 ns 112 ns61.7 ns 2504
core: compact() (no dead slots — the early-out)gpu 16.7 µs21.1 µs 96.1 µs16.4 µs 32389
collection: element accessors (id/group/isNode/isEdge, 4 calls)v3 60.6 ns63.4 ns 95.8 ns58.1 ns 2678
collection: element accessors (id/group/isNode/isEdge, 4 calls)gpu 34.8 ns37.5 ns 135 ns33.3 ns 4526
collection: length + empty + nonempty (3 calls)v3 6.68 ns6.88 ns 11.8 ns6.47 ns 24680
collection: length + empty + nonempty (3 calls)gpu 1.47 ns1.52 ns 2.20 ns1.47 ns 106622
collection: eq/first/last (3 calls)v3 15.2 ns15.7 ns 26.5 ns14.7 ns 10858
collection: eq/first/last (3 calls)gpu 8.09 ns8.40 ns 15.7 ns7.93 ns 20168
collection: slice()v3 3.71 µs3.80 µs 4.22 µs3.61 µs 40
collection: slice()gpu 1.70 µs1.71 µs 1.80 µs1.64 µs 95
collection: toArray()v3 8.80 µs8.97 µs 9.89 µs8.63 µs 15
collection: toArray()gpu 754 ns770 ns 944 ns733 ns 212
collection: sort( fn )v3 14.2 µs14.8 µs 14.9 µs14.0 µs 12
collection: sort( fn )gpu 9.06 µs9.10 µs 9.25 µs8.98 µs 15
collection: reduce( fn )v3 157 ns160 ns 184 ns120 ns 1064
collection: reduce( fn )gpu 112 ns114 ns 131 ns110 ns 1504
collection: min + max ( fn ) (2 calls)v3 11.0 µs11.0 µs 11.4 µs10.8 µs 12
collection: min + max ( fn ) (2 calls)gpu 5.60 µs5.66 µs 6.00 µs5.52 µs 25
collection: some + every (2 calls)v3 894 ns912 ns 1.23 µs874 ns 182
collection: some + every (2 calls)gpu 562 ns567 ns 623 ns555 ns 299
collection: same + anySame + contains (3 calls)v3 7.33 µs7.35 µs 7.50 µs7.21 µs 20
collection: same + anySame + contains (3 calls)gpu 100 ns103 ns 142 ns97.1 ns 1663
collection: allAre (all match: the full walk)v3 3.66 µs3.65 µs 3.96 µs3.39 µs 42
collection: allAre (all match: the full walk)gpu 2.45 µs2.51 µs 2.89 µs2.41 µs 63
collection: is (none match: the full walk)v3 5.66 µs5.67 µs 6.04 µs5.36 µs 26
collection: is (none match: the full walk)gpu 2.38 µs2.42 µs 2.94 µs2.33 µs 65
collection: unionv3 95.3 µs105 µs 152 µs93.2 µs 6587
collection: uniongpu 16.2 µs16.4 µs 16.5 µs15.7 µs 12
collection: intersectionv3 90.4 µs100 µs 149 µs87.0 µs 6932
collection: intersectiongpu 3.20 µs3.24 µs 3.52 µs3.14 µs 48
collection: differencev3 92.3 µs105 µs 203 µs89.4 µs 6614
collection: differencegpu 3.16 µs3.18 µs 3.45 µs3.08 µs 50
collection: symmetricDifferencev3 25.7 µs26.2 µs 27.1 µs25.2 µs 12
collection: symmetricDifferencegpu 6.67 µs6.70 µs 7.00 µs6.56 µs 21
collection: absoluteComplementv3 6.37 ms6.93 ms 10.7 ms6.18 ms 97
collection: absoluteComplementgpu 409 µs419 µs 538 µs398 µs 1670
collection: byGroupv3 1.00 ms1.02 ms 1.17 ms984 µs 685
collection: byGroupgpu 326 µs336 µs 549 µs321 µs 2080
collection: diffv3 37.7 µs38.2 µs 39.9 µs36.3 µs 12
collection: diffgpu 11.4 µs11.4 µs 11.8 µs9.83 µs 12
collection: indexOfv3 31.6 ns33.0 ns 65.9 ns31.0 ns 5199
collection: indexOfgpu 23.4 ns24.2 ns 36.6 ns22.6 ns 7062
traversal: openNeighborhood + closedNeighborhood (2 calls)v3 9.45 µs9.58 µs 10.1 µs9.31 µs 14
traversal: openNeighborhood + closedNeighborhood (2 calls)gpu 3.17 µs3.39 µs 3.98 µs3.04 µs 46
traversal: connectedNodesv3 1.01 µs1.10 µs 1.85 µs986 ns 151
traversal: connectedNodesgpu 301 ns307 ns 371 ns291 ns 552
traversal: sources + targets (2 calls)v3 1.69 µs1.88 µs 2.84 µs1.64 µs 87
traversal: sources + targets (2 calls)gpu 520 ns740 ns 2.50 µs508 ns 226
traversal: source() + target() (2 calls)v3 77.3 ns80.0 ns 132 ns62.2 ns 2136
traversal: source() + target() (2 calls)gpu 56.8 ns58.8 ns 88.9 ns54.7 ns 2906
traversal: edgesWithv3 67.7 µs69.1 µs 104 µs65.6 µs 10079
traversal: edgesWithgpu 53.2 µs53.6 µs 55.2 µs51.8 µs 12
traversal: edgesTov3 67.6 µs69.7 µs 113 µs65.4 µs 9990
traversal: edgesTogpu 53.7 µs54.6 µs 55.8 µs52.6 µs 12
traversal: parallelEdges + codirectedEdges (2 calls)v3 3.59 µs3.83 µs 4.61 µs3.36 µs 41
traversal: parallelEdges + codirectedEdges (2 calls)gpu 988 ns1.20 µs 2.00 µs978 ns 139
traversal: roots + leaves (2 calls)v3 5.04 ms5.43 ms 8.86 ms4.89 ms 125
traversal: roots + leaves (2 calls)gpu 392 µs402 µs 607 µs382 µs 1740
traversal: allAreNeighborsv3 202 µs218 µs 318 µs197 µs 3174
traversal: allAreNeighborsgpu 37.3 µs37.7 µs 38.3 µs36.9 µs 12
traversal: isLoop + isSimple (2 calls)v3 135 ns139 ns 211 ns131 ns 1233
traversal: isLoop + isSimple (2 calls)gpu 58.7 ns60.7 ns 96.3 ns57.5 ns 2818
degree: indegree + outdegree (2 calls)v3 3.51 µs3.84 µs 5.40 µs3.31 µs 40
degree: indegree + outdegree (2 calls)gpu 46.4 ns48.2 ns 80.0 ns45.0 ns 3536
degree: minDegree + maxDegree (2 calls)v3 16.4 ms17.4 ms 20.5 ms15.2 ms 36
degree: minDegree + maxDegree (2 calls)gpu 388 µs398 µs 591 µs376 µs 1760
degree: minIndegree + maxOutdegree (2 calls)v3 9.17 ms10.0 ms 13.6 ms8.78 ms 66
degree: minIndegree + maxOutdegree (2 calls)gpu 376 µs386 µs 516 µs370 µs 1823
dimensions: renderedPosition getv3 74.5 ns79.7 ns 184 ns73.0 ns 2127
dimensions: renderedPosition getgpu 29.8 ns33.4 ns 105 ns29.0 ns 5050
dimensions: relativePosition getv3 838 ns847 ns 956 ns817 ns 196
dimensions: relativePosition getgpu 77.9 ns82.1 ns 159 ns74.5 ns 2061
dimensions: width + height + outerWidth + outerHeight (4 calls)v3 611 ns613 ns 662 ns609 ns 277
dimensions: width + height + outerWidth + outerHeight (4 calls)gpu 212 ns216 ns 242 ns211 ns 785
dimensions: rendered dims (4 calls)v3 707 ns716 ns 943 ns692 ns 235
dimensions: rendered dims (4 calls)gpu 228 ns233 ns 274 ns227 ns 729
dimensions: renderedBoundingBoxv3 1.71 µs1.75 µs 2.11 µs1.66 µs 92
dimensions: renderedBoundingBoxgpu 935 ns935 ns 993 ns895 ns 177
dimensions: midpoint + renderedMidpoint (2 calls)gpu 1.17 µs1.18 µs 1.24 µs1.14 µs 136
dimensions: source/targetEndpoint (2 calls)gpu 377 ns385 ns 444 ns375 ns 440
dimensions: rendered source/targetEndpoint (2 calls)gpu 399 ns403 ns 467 ns391 ns 421
dimensions: shift + silentShift (round-trip)v3 299 µs309 µs 611 µs294 µs 2259
dimensions: shift + silentShift (round-trip)gpu 4.82 µs4.84 µs 4.98 µs4.77 µs 31
dimensions: silentPositionv3 874 ns884 ns 990 ns843 ns 190
dimensions: silentPositiongpu 56.6 ns59.3 ns 96.7 ns54.4 ns 2874
dimensions: positions( fn ) over 100v3 178 µs183 µs 269 µs175 µs 3820
dimensions: positions( fn ) over 100gpu 3.53 µs3.54 µs 3.75 µs3.45 µs 44
dimensions: padding + paddedWidth + paddedHeight (3 calls)v3 2.04 µs2.06 µs 2.26 µs1.98 µs 80
dimensions: padding + paddedWidth + paddedHeight (3 calls)gpu 153 ns156 ns 248 ns148 ns 1097
curves: isBundledBeziergpu 33.5 ns35.0 ns 62.8 ns20.9 ns 4873
curves: controlPoints + renderedControlPoints (2 calls)gpu 534 ns543 ns 719 ns513 ns 302
curves: segmentPoints (undefined for bezier)gpu 41.6 ns42.8 ns 54.4 ns36.7 ns 4007
compound: parent + parents + ancestors (3 calls)v3 2.91 µs3.31 µs 4.45 µs2.81 µs 48
compound: parent + parents + ancestors (3 calls)gpu 792 ns1.11 µs 2.44 µs769 ns 145
compound: children + descendants + siblings (3 calls)v3 8.60 µs8.53 µs 8.81 µs7.71 µs 16
compound: children + descendants + siblings (3 calls)gpu 1.81 µs2.33 µs 3.74 µs1.73 µs 68
compound: orphans + nonorphans (2 calls)v3 3.67 µs3.94 µs 4.72 µs3.54 µs 39
compound: orphans + nonorphans (2 calls)gpu 523 ns769 ns 3.18 µs521 ns 210
compound: commonAncestorsv3 9.61 µs9.66 µs 9.90 µs9.32 µs 14
compound: commonAncestorsgpu 75.6 ns78.9 ns 134 ns74.1 ns 2159
compound: isParent/isChild/isChildless/isOrphan (4 calls)v3 70.6 ns72.2 ns 83.9 ns61.3 ns 2368
compound: isParent/isChild/isChildless/isOrphan (4 calls)gpu 45.1 ns45.9 ns 57.8 ns44.2 ns 3715
flags: select + unselect + selected (band)v3 196 µs203 µs 330 µs189 µs 3448
flags: select + unselect + selected (band)gpu 12.5 µs12.5 µs 12.6 µs12.5 µs 10
flags: selectify + unselectify + selectablev3 196 µs207 µs 398 µs190 µs 3381
flags: selectify + unselectify + selectablegpu 2.03 µs2.04 µs 2.15 µs1.99 µs 79
flags: lock + unlock + lockedv3 190 µs198 µs 317 µs186 µs 3530
flags: lock + unlock + lockedgpu 2.04 µs2.05 µs 2.17 µs2.01 µs 80
flags: grabify + ungrabify + grabbablev3 192 µs200 µs 392 µs188 µs 3492
flags: grabify + ungrabify + grabbablegpu 2.03 µs2.04 µs 2.20 µs2.00 µs 81
flags: show + hide + visiblev3 2.57 ms2.74 ms 4.60 ms2.47 ms 251
flags: show + hide + visiblegpu 11.4 µs11.4 µs 11.8 µs11.2 µs 11
flags: active/activate/unactivate (3 calls)v3 196 µs201 µs 408 µs194 µs 3475
flags: active/activate/unactivate (3 calls)gpu 13.1 µs13.1 µs 13.2 µs13.0 µs 9
flags: panify + unpanify + pannablev3 190 µs195 µs 289 µs187 µs 3567
flags: panify + unpanify + pannablegpu 2.02 µs2.03 µs 2.22 µs1.97 µs 81
flags: takesUpSpace + interactive + transparent (3 calls)v3 195 ns201 ns 246 ns195 ns 853
flags: takesUpSpace + interactive + transparent (3 calls)gpu 69.7 ns72.0 ns 93.0 ns68.1 ns 2376
flags: effectiveOpacityv3 51.6 ns53.2 ns 98.0 ns47.7 ns 3225
flags: effectiveOpacitygpu 25.1 ns25.7 ns 38.6 ns24.1 ns 6677
element data: scratch get + setv3 1.31 µs1.33 µs 1.46 µs1.28 µs 125
element data: scratch get + setgpu 171 ns175 ns 237 ns170 ns 978
element data: json() one elementv3 301 ns387 ns 3.56 µs293 ns 422
element data: json() one elementgpu 150 ns194 ns 538 ns147 ns 825
element data: jsons() over 100v3 39.8 µs40.3 µs 42.9 µs36.3 µs 12
element data: jsons() over 100gpu 20.6 µs21.3 µs 24.4 µs16.0 µs 12
element data: label()gpu 15.1 ns15.9 ns 27.6 ns14.6 ns 10734
core: batchData()v3 2.47 µs2.57 µs 3.18 µs2.35 µs 61
core: batchData()gpu 285 ns376 ns 2.27 µs281 ns 437
core: animated()v3 7.53 ns7.89 ns 14.4 ns7.22 ns 21457
core: animated()gpu 1.53 ns1.61 ns 2.57 ns1.50 ns 102339
core: zoomRange getgpu 2.16 ns2.29 ns 6.15 ns2.01 ns 72839
core: forceRender() (headless no-op)v3 23.3 ns23.9 ns 36.8 ns22.5 ns 7151
core: forceRender() (headless no-op)gpu 1.48 ns1.55 ns 2.10 ns1.45 ns 106429
core: resize() / invalidateSize()v3 286 ns289 ns 357 ns280 ns 586
core: resize() / invalidateSize()gpu 125 ns130 ns 197 ns124 ns 1311
core: onRender + offRenderv3 454 ns474 ns 827 ns441 ns 354
core: onRender + offRendergpu 192 ns234 ns 685 ns187 ns 716
core: removeScratch()v3 2.64 ms2.70 ms 3.17 ms2.62 ms 253
core: removeScratch()gpu 278 ns284 ns 356 ns272 ns 599
core: selectionType getv3 4.51 ns4.82 ns 9.05 ns4.35 ns 35091
core: selectionType getgpu 2.26 ns2.40 ns 6.24 ns2.10 ns 69540
core: isReady()v3 3.26 ns3.40 ns 6.69 ns3.18 ns 49427
core: isReady()gpu 1.48 ns1.55 ns 2.49 ns1.48 ns 105505
core: window()v3 4.10 ns4.34 ns 8.04 ns4.10 ns 38817
core: window()gpu 1.48 ns1.54 ns 2.23 ns1.48 ns 107089
core: container()v3 3.93 ns4.06 ns 7.55 ns3.82 ns 41546
core: container()gpu 1.51 ns1.59 ns 3.02 ns1.48 ns 103395
core: destroyed()v3 3.31 ns3.42 ns 7.11 ns3.19 ns 49128
core: destroyed()gpu 1.48 ns1.53 ns 2.42 ns1.48 ns 107443
core: removeAllListeners()v3 13.8 ns14.6 ns 30.2 ns13.3 ns 11659
core: removeAllListeners()gpu 1.58 ns1.67 ns 3.03 ns1.58 ns 99000
collection: cy()v3 7.58 ns8.14 ns 15.3 ns7.32 ns 20893
collection: cy()gpu 2.16 ns2.40 ns 6.09 ns2.10 ns 69440
collection: indexOfId()v3 66.0 ns69.0 ns 122 ns64.5 ns 2482
collection: indexOfId()gpu 37.5 ns38.5 ns 54.7 ns36.2 ns 4444
collection: removed() + inside() (2 calls)v3 17.7 ns18.6 ns 31.5 ns17.0 ns 9199
collection: removed() + inside() (2 calls)gpu 15.2 ns15.8 ns 26.7 ns14.6 ns 10840
collection: silentPositions( fn ) over 100v3 111 µs116 µs 233 µs109 µs 6035
collection: silentPositions( fn ) over 100gpu 3.58 µs3.61 µs 3.80 µs3.51 µs 43
collection: animated()v3 12.2 ns12.6 ns 22.8 ns11.9 ns 13639
collection: animated()gpu 4.19 ns4.34 ns 7.96 ns4.08 ns 39006
collection: delayAnimation()v3 456 ns592 ns 2.10 µs453 ns 282
collection: delayAnimation()gpu 164 ns171 ns 285 ns158 ns 983
collection: removeScratch()v3 1.81 µs1.84 µs 2.11 µs1.76 µs 87
collection: removeScratch()gpu 205 ns209 ns 299 ns197 ns 815
collection: component()v3 80.4 ms82.8 ms 85.7 ms76.0 ms 12
collection: component()gpu 1.83 ms2.07 ms 5.36 ms1.78 ms 334
collection: layoutDimensions()v3 624 ns638 ns 864 ns609 ns 265
collection: layoutDimensions()gpu 174 ns181 ns 316 ns170 ns 939
degree: maxIndegree + minOutdegree (2 calls)v3 9.23 ms10.1 ms 14.3 ms8.78 ms 66
degree: maxIndegree + minOutdegree (2 calls)gpu 381 µs390 µs 583 µs371 µs 1789
flags: grabbed + hidden + inactive (3 calls)v3 85.1 ns88.2 ns 177 ns80.5 ns 1939
flags: grabbed + hidden + inactive (3 calls)gpu 38.8 ns40.2 ns 63.8 ns36.2 ns 4264
curves: renderedSegmentPointsgpu 36.2 ns37.4 ns 69.1 ns34.6 ns 4578
layout contract: edgeSlots + endpoints + degreeOfgpu 34.7 µs36.9 µs 64.8 µs29.7 µs 18648
formats: isColumnarElements + isSerializedElements + isPackedIdsgpu 4.61 ns4.80 ns 8.96 ns4.51 ns 35261

compaction N=20,000 · 54.3 s

cpu pick: background miss (full highWater walk) — peak
222 µs
cpu pick: background miss (full highWater walk) — compacted
50.3 µs
cpu pick: node hit — peak
222 µs
cpu pick: node hit — compacted
49.7 µs
isCurrent: current ref (forwards present vs absent) — no forwards (peak)
5.95 ns
isCurrent: current ref (forwards present vs absent) — forwards present (compacted)
5.93 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — current (baseline alloc)
8.89 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — stale → repair
48.3 ns
control: nodes({ selected }) scan (order-list, expected parity) — peak
23.6 µs
control: nodes({ selected }) scan (order-list, expected parity) — compacted
22.1 µs
control: whole-graph boundingBox (expected parity) — peak
111 µs
control: whole-graph boundingBox (expected parity) — compacted
110 µs
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
cpu pick: background miss (full highWater walk)peak 222 µs225 µs 269 µs216 µs 3119
cpu pick: background miss (full highWater walk)compacted 50.3 µs50.7 µs 51.5 µs49.7 µs 12
cpu pick: node hitpeak 222 µs228 µs 276 µs221 µs 3082
cpu pick: node hitcompacted 49.7 µs50.6 µs 55.1 µs49.1 µs 12
isCurrent: current ref (forwards present vs absent)no forwards (peak) 5.95 ns6.10 ns 10.6 ns5.74 ns 27746
isCurrent: current ref (forwards present vs absent)forwards present (compacted) 5.93 ns6.10 ns 10.4 ns5.69 ns 27759
isCurrent: stale-ref repair (chase + rewrite, alloc included)current (baseline alloc) 8.89 ns9.85 ns 23.7 ns8.43 ns 17110
isCurrent: stale-ref repair (chase + rewrite, alloc included)stale → repair 48.3 ns50.1 ns 78.5 ns47.6 ns 3412
control: nodes({ selected }) scan (order-list, expected parity)peak 23.6 µs26.8 µs 34.6 µs21.2 µs 12
control: nodes({ selected }) scan (order-list, expected parity)compacted 22.1 µs22.9 µs 24.7 µs21.2 µs 12
control: whole-graph boundingBox (expected parity)peak 111 µs117 µs 232 µs110 µs 5982
control: whole-graph boundingBox (expected parity)compacted 110 µs115 µs 207 µs106 µs 6094

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

parent drag (shift subtree + bb settle)
186×
child drag (move + parent re-derive)
52×
reparent round-trip
78×
1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
parent drag (shift subtree + bb settle)v3 256 µs289 µs 719 µs237 µs 2408
parent drag (shift subtree + bb settle)gpu 1.37 µs1.44 µs 2.21 µs1.33 µs 110
child drag (move + parent re-derive)v3 81.4 µs85.6 µs 134 µs77.5 µs 8036
child drag (move + parent re-derive)gpu 1.57 µs1.59 µs 1.91 µs1.53 µs 101
reparent round-tripv3 84.4 µs91.4 µs 163 µs81.9 µs 7534
reparent round-tripgpu 1.08 µs1.09 µs 1.24 µs1.05 µs 147

curves N=2,000 · 1.7 s

curve premium: build (style apply + derivation) — curved
11.1 ms
curve premium: build (style apply + derivation) — straight
8.03 ms
curve premium: node.position x 1000 (drag) — curved
388 µs
curve premium: node.position x 1000 (drag) — straight
299 µs
curve premium: nodes().positions() (bulk move) — curved
313 µs
curve premium: nodes().positions() (bulk move) — straight
296 µs
curve premium: first read after a bulk move (cold) — curved
5.95 ms
curve premium: first read after a bulk move (cold) — straight
2.88 ms
curve premium: same read again (warm) — curved
2.19 ms
curve premium: same read again (warm) — straight
1.39 ms
curve premium: edge.midpoint x 4000 — curved
2.16 ms
curve premium: edge.midpoint x 4000 — straight
4.16 ms
curve premium: edge.controlPoints x 4000 — curved
2.20 ms
curve premium: edge.controlPoints x 4000 — straight
1.39 ms
curve premium: cy.elements().boundingBox() x 20 — curved
35.6 ms
curve premium: cy.elements().boundingBox() x 20 — straight
21.7 ms
curve premium: cy.fit() x 20 (store scan) — curved
3.88 ms
curve premium: cy.fit() x 20 (store scan) — straight
3.61 ms
curve premium: elementsInBox x 20 (half the graph) — curved
24.6 ms
curve premium: elementsInBox x 20 (half the graph) — straight
5.91 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — curved
3.81 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — straight
2.24 ms
100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
curve premium: build (style apply + derivation)curved 11.1 ms11.1 ms 11.1 ms11.1 ms 1
curve premium: build (style apply + derivation)straight 8.03 ms8.03 ms 8.03 ms8.03 ms 1
curve premium: node.position x 1000 (drag)curved 388 µs388 µs 388 µs388 µs 1
curve premium: node.position x 1000 (drag)straight 299 µs299 µs 299 µs299 µs 1
curve premium: nodes().positions() (bulk move)curved 313 µs313 µs 313 µs313 µs 1
curve premium: nodes().positions() (bulk move)straight 296 µs296 µs 296 µs296 µs 1
curve premium: first read after a bulk move (cold)curved 5.95 ms5.95 ms 5.95 ms5.95 ms 1
curve premium: first read after a bulk move (cold)straight 2.88 ms2.88 ms 2.88 ms2.88 ms 1
curve premium: same read again (warm)curved 2.19 ms2.19 ms 2.19 ms2.19 ms 1
curve premium: same read again (warm)straight 1.39 ms1.39 ms 1.39 ms1.39 ms 1
curve premium: edge.midpoint x 4000curved 2.16 ms2.16 ms 2.16 ms2.16 ms 1
curve premium: edge.midpoint x 4000straight 4.16 ms4.16 ms 4.16 ms4.16 ms 1
curve premium: edge.controlPoints x 4000curved 2.20 ms2.20 ms 2.20 ms2.20 ms 1
curve premium: edge.controlPoints x 4000straight 1.39 ms1.39 ms 1.39 ms1.39 ms 1
curve premium: cy.elements().boundingBox() x 20curved 35.6 ms35.6 ms 35.6 ms35.6 ms 1
curve premium: cy.elements().boundingBox() x 20straight 21.7 ms21.7 ms 21.7 ms21.7 ms 1
curve premium: cy.fit() x 20 (store scan)curved 3.88 ms3.88 ms 3.88 ms3.88 ms 1
curve premium: cy.fit() x 20 (store scan)straight 3.61 ms3.61 ms 3.61 ms3.61 ms 1
curve premium: elementsInBox x 20 (half the graph)curved 24.6 ms24.6 ms 24.6 ms24.6 ms 1
curve premium: elementsInBox x 20 (half the graph)straight 5.91 ms5.91 ms 5.91 ms5.91 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)curved 3.81 ms3.81 ms 3.81 ms3.81 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)straight 2.24 ms2.24 ms 2.24 ms2.24 ms 1

arrows N=2,000 · 8.7 s

arrow premium: build (style apply + arrow fold) — arrowed
5.77 ms
arrow premium: build (style apply + arrow fold) — none
6.48 ms
arrow premium: cy.style() re-apply x 4 — arrowed
8.14 ms
arrow premium: cy.style() re-apply x 4 — none
7.82 ms
arrow premium: node.position x 200000 (drag) — arrowed
21.6 ms
arrow premium: node.position x 200000 (drag) — none
21.6 ms
arrow premium: edge.sourceEndpoint x 200000 — arrowed
60.5 ms
arrow premium: edge.sourceEndpoint x 200000 — none
58.5 ms
arrow premium: edge.targetEndpoint x 200000 — arrowed
60.4 ms
arrow premium: edge.targetEndpoint x 200000 — none
59.3 ms
arrow premium: edge.midpoint x 200000 — arrowed
144 ms
arrow premium: edge.midpoint x 200000 — none
138 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — arrowed
33.7 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — none
28.3 ms
arrow premium: cy.elements().boundingBox() x 20 — arrowed
21.0 ms
arrow premium: cy.elements().boundingBox() x 20 — none
21.0 ms
arrow premium: elementsInBox x 20 (half the graph) — arrowed
5.84 ms
arrow premium: elementsInBox x 20 (half the graph) — none
5.76 ms
arrow premium: control: sourceEndpoint, bezier vs straight — arrowed
75.2 ms
arrow premium: control: sourceEndpoint, bezier vs straight — none
59.3 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.77 ms5.77 ms 5.77 ms5.77 ms 1
arrow premium: build (style apply + arrow fold)none 6.48 ms6.48 ms 6.48 ms6.48 ms 1
arrow premium: cy.style() re-apply x 4arrowed 8.14 ms8.14 ms 8.14 ms8.14 ms 1
arrow premium: cy.style() re-apply x 4none 7.82 ms7.82 ms 7.82 ms7.82 ms 1
arrow premium: node.position x 200000 (drag)arrowed 21.6 ms21.6 ms 21.6 ms21.6 ms 1
arrow premium: node.position x 200000 (drag)none 21.6 ms21.6 ms 21.6 ms21.6 ms 1
arrow premium: edge.sourceEndpoint x 200000arrowed 60.5 ms60.5 ms 60.5 ms60.5 ms 1
arrow premium: edge.sourceEndpoint x 200000none 58.5 ms58.5 ms 58.5 ms58.5 ms 1
arrow premium: edge.targetEndpoint x 200000arrowed 60.4 ms60.4 ms 60.4 ms60.4 ms 1
arrow premium: edge.targetEndpoint x 200000none 59.3 ms59.3 ms 59.3 ms59.3 ms 1
arrow premium: edge.midpoint x 200000arrowed 144 ms144 ms 144 ms144 ms 1
arrow premium: edge.midpoint x 200000none 138 ms138 ms 138 ms138 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000arrowed 33.7 ms33.7 ms 33.7 ms33.7 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000none 28.3 ms28.3 ms 28.3 ms28.3 ms 1
arrow premium: cy.elements().boundingBox() x 20arrowed 21.0 ms21.0 ms 21.0 ms21.0 ms 1
arrow premium: cy.elements().boundingBox() x 20none 21.0 ms21.0 ms 21.0 ms21.0 ms 1
arrow premium: elementsInBox x 20 (half the graph)arrowed 5.84 ms5.84 ms 5.84 ms5.84 ms 1
arrow premium: elementsInBox x 20 (half the graph)none 5.76 ms5.76 ms 5.76 ms5.76 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightarrowed 75.2 ms75.2 ms 75.2 ms75.2 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightnone 59.3 ms59.3 ms 59.3 ms59.3 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
84.9 ms
labels: estimateBlock x 20000 — gpu
94.3 ms
labels: addNode x 20000 — gpu
29.4 ms
labels: setLabel (build) x 20000 — gpu
98.3 ms
labels: setLabel (rewrite) x 20000 — gpu
101 ms
labels: boundingBox with 20000 label terms — gpu
3.01 ms
1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
labels: breakLines x 20000gpu 84.9 ms84.9 ms 84.9 ms84.9 ms 1
labels: estimateBlock x 20000gpu 94.3 ms94.3 ms 94.3 ms94.3 ms 1
labels: addNode x 20000gpu 29.4 ms29.4 ms 29.4 ms29.4 ms 1
labels: setLabel (build) x 20000gpu 98.3 ms98.3 ms 98.3 ms98.3 ms 1
labels: setLabel (rewrite) x 20000gpu 101 ms101 ms 101 ms101 ms 1
labels: boundingBox with 20000 label termsgpu 3.01 ms3.01 ms 3.01 ms3.01 ms 1

transitions N=2,000 · 28.8 s

transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions off
1.16 ms
transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions on
3.66 ms
transition: bulk tween tick (2000 slots, one manager tick) — tick
130 µs
transition: explicit-domain write (O(changed) — one element) — transitions off
15.1 µs
transition: explicit-domain write (O(changed) — one element) — transitions on
18.5 µs
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions off
2.12 ms
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions on
4.91 ms
10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions off 1.16 ms1.20 ms 2.18 ms1.13 ms 574
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions on 3.66 ms3.85 ms 5.53 ms3.43 ms 175
transition: bulk tween tick (2000 slots, one manager tick)tick 130 µs134 µs 240 µs127 µs 5194
transition: explicit-domain write (O(changed) — one element)transitions off 15.1 µs16.0 µs 20.2 µs14.5 µs 12
transition: explicit-domain write (O(changed) — one element)transitions on 18.5 µs18.7 µs 19.4 µs17.8 µs 12
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions off 2.12 ms2.14 ms 2.49 ms2.06 ms 323
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions on 4.91 ms4.51 ms 6.70 ms3.50 ms 149

geometry-tween N=2,000 · 32.7 s

size tick: unlabelled (2000 slots) — tick
544 µs
size tick: labelled, center/center (re-anchor early-out) (2000 slots) — tick
589 µs
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots) — tick
1.22 ms
edge width tick (4000 slots) — bare
290 µs
edge width tick (4000 slots) — with rides (casing + match-line arrows)
753 µs
padding tick + auto-bounds flush (250 parents × 8 children) — tick + flush
173 µs
font-size tick (2000 labels) — wrap none (dims scale-patch)
359 µs
font-size tick (2000 labels) — wrapped (re-break per tick)
5.75 ms
baseline: paint (opacity) tick (2000 slots) — tick
137 µs
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
size tick: unlabelled (2000 slots)tick 544 µs570 µs 884 µs519 µs 1207
size tick: labelled, center/center (re-anchor early-out) (2000 slots)tick 589 µs612 µs 940 µs562 µs 1145
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots)tick 1.22 ms1.31 ms 2.20 ms1.10 ms 515
edge width tick (4000 slots)bare 290 µs303 µs 553 µs279 µs 2298
edge width tick (4000 slots)with rides (casing + match-line arrows) 753 µs768 µs 1.04 ms723 µs 904
padding tick + auto-bounds flush (250 parents × 8 children)tick + flush 173 µs182 µs 376 µs168 µs 3840
font-size tick (2000 labels)wrap none (dims scale-patch) 359 µs399 µs 903 µs345 µs 1737
font-size tick (2000 labels)wrapped (re-break per tick) 5.75 ms5.83 ms 6.52 ms5.47 ms 115
baseline: paint (opacity) tick (2000 slots)tick 137 µs142 µs 241 µs134 µs 4909