Cytoscape.js GPU benchmarks

v4 (src/) vs v3 (v3/src/) · Mitata · times are per-iteration p50 · 2026-08-10 18:46 · 1f324088 (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)
Commit1f324088
fix(65.9b): style-bundle.mjs has been a module-level SyntaxError since round 42 — every all-profile run published it as a failure
Machine id5cf3f79c
Median speedup (geo-mean) 10× 270 v3-vs-gpu comparisons
Biggest win 304501× sweep: edges() @ N=2k
v3 still ahead 0 comparisons
Total run time 18.4 min all profile

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

sweep: edges() @ 2k
304501×
sweep: nodes() @ 2k
167819×
core: edges() @ 2k
93617×
core: nodes() @ 2k
51120×
sweep: elements() @ 2k
29945×
core: elements() @ 2k
23406×
core: graph scratch() set + get (v3 restyles the graph) @ 2k
17043×
core: removeScratch() @ 2k
9536×
core: graph data() set + get (v3 restyles the graph) @ 2k
8273×
compare: same() @ 2k
7609×
trav: successors() @ 2k
757×
trav: predecessors() @ 2k
736×
mut-bulk: hide + show @ 2k
283×
flags: show + hide + visible @ 2k
208×
parent drag (shift subtree + bb settle) @ 2k
186×
degree: nodes.totalDegree() @ 2k
167×
layout: grid @ 2k
154×
degree: nodes.maxDegree() @ 2k
141×
compound: commonAncestors @ 2k
128×
degree: node.degree() @ 2k
119×
viewport: reset() @ 2k
109×
mut-bulk: positions(obj) @ 2k
105×
mut-bulk: shift @ 2k
100×
mut-bulk: positions(fn) @ 2k
99×
flags: panify + unpanify + pannable @ 2k
97×
flags: grabify + ungrabify + grabbable @ 2k
96×
flags: selectify + unselectify + selectable @ 2k
96×
flags: lock + unlock + locked @ 2k
94×
core: options() @ 2k
84×
collection: same + anySame + contains (3 calls) @ 2k
75×
algo: closenessCentrality (one root) @ 500
75×
reparent round-trip @ 2k
74×
algo: closenessCentrality (one root) @ 2k
74×
degree: indegree + outdegree (2 calls) @ 2k
70×
algo: bfs (whole graph) @ 500
65×
algo: dfs (whole graph) @ 500
63×
algo: bfs (whole graph) @ 2k
62×
dimensions: shift + silentShift (round-trip) @ 2k
62×
viewport: viewport({ zoom, pan }) @ 2k
61×
algo: dfs (whole graph) @ 2k
61×
sweep: nodes(":selected") vs nodes({selected}) @ 2k
59×
layout: preset (fn form) @ 2k
57×
algo: closenessCentrality (weighted, one root) @ 500
57×
dimensions: positions( fn ) over 100 @ 2k
57×
algo: dijkstra + pathTo @ 2k
57×
algo: dijkstra + pathTo @ 500
55×
mut-bulk: lock + unlock @ 2k
52×
child drag (move + parent re-derive) @ 2k
51×
collection: component() @ 2k
42×
traverse: components() @ 2k
40×
degree: minDegree + maxDegree (2 calls) @ 2k
40×
algo: degreeCentralityNormalized @ 500
40×
algo: tarjan SCC @ 500
38×
algo: tarjan SCC @ 2k
38×
algo: degreeCentralityNormalized @ 2k
38×
layout: breadthfirst @ 2k
37×
sweep: selected nodes ($("node:selected") vs filter({group, selected})) @ 2k
35×
query: structural, parents (:parent vs { parent: true }) @ 2k
34×
collection: silentPositions( fn ) over 100 @ 2k
34×
query: structural, orphans (:orphan vs { child: false }) @ 2k
33×
algo: degreeCentrality (one root) @ 500
32×
bounds: getFitViewport() (compute without committing) @ 2k
32×
bounds: cy.fit() (whole-graph scan) @ 2k
31×
algo: degreeCentrality (one root) @ 2k
30×
set: difference() @ 2k
29×
collection: difference @ 2k
28×
collection: intersection @ 2k
28×
algo: kruskal @ 2k
27×
set: intersection() @ 2k
27×
algo: hopcroft-tarjan biconnected @ 500
26×
scn: select-all + fit (listeners on) @ 2k
26×
core: id lookup ($("#id") vs $id()) @ 2k
26×
algo: hopcroft-tarjan biconnected @ 2k
26×
layout: concentric @ 2k
26×
algo: kruskal @ 500
25×
emit: position write, no listeners @ 2k
24×
degree: maxIndegree + minOutdegree (2 calls) @ 2k
24×
mut: position set @ 2k
24×
trav: band roots() @ 2k
22×
degree: minIndegree + maxOutdegree (2 calls) @ 2k
21×
algo: bellmanFord @ 500
21×
algo: bellmanFord @ 2k
20×
data: bulk write, object column (plain-array fallback) @ 2k
19×
data: bulk write, numeric column @ 2k
19×
viewport: center( eles ) @ 2k
19×
layout: preset @ 2k
18×
core: add + remove @ 2k
17×
query: membership ([bucket in ...] vs { in }) @ 2k
17×
data: bulk write, one new dictionary entry per pass @ 2k
16×
data: bulk write, dictionary string column (4 values) @ 2k
16×
scn: drag (select band of 100 + 8-step shift, position listener) @ 2k
16×
flags: select + unselect + selected (band) @ 2k
16×
core: forceRender() (headless no-op) @ 2k
16×
dimensions: silentPosition @ 2k
15×
flags: active/activate/unactivate (3 calls) @ 2k
15×
viewport: minZoom/maxZoom get (2 calls) @ 2k
15×
traversal: roots + leaves (2 calls) @ 2k
15×
core: selected ($(":selected") vs filter({selected})) @ 2k
14×
style: renderedStyle (one prop) @ 2k
14×
mut-bulk: data set @ 2k
14×
collection: absoluteComplement @ 2k
13×
query: structural, childless (:childless vs { parent: false }) @ 2k
13×
sweep: selected ($(":selected") vs filter({selected})) @ 2k
13×
dimensions: padding + paddedWidth + paddedHeight (3 calls) @ 2k
13×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } }) @ 2k
13×
query: data comparison ([weight > 3] vs { gt }) @ 2k
12×
layout: circle @ 2k
12×
collection: toArray() @ 2k
12×
query: two keys AND-ed @ 2k
12×
dimensions: relativePosition get @ 2k
11×
algo: betweennessCentrality (unweighted) @ 2k
11×
algo: betweennessCentrality (unweighted) @ 500
11×
layout: random @ 2k
11×
collection: removeScratch() @ 2k
9.6×
layout: scope (eles.layout, 10% of nodes) @ 2k
9.5×
sweep: all nodes ($("node") vs filter({group})) @ 2k
9.4×
algo: betweennessCentrality (weighted) @ 500
9.0×
core: removeAllListeners() @ 2k
8.7×
algo: kMedoids @ 500
8.7×
core: batchData() @ 2k
8.6×
algo: fuzzyCMeans @ 500
8.6×
query: predicate function (both sides) @ 2k
8.5×
scn: explore (expand 2-hop + select + fit) @ 2k
8.2×
emit: 1 core listener @ 2k
8.1×
element data: scratch get + set @ 2k
7.8×
emit: delegated (v3 selector vs v4 predicate) @ 2k
7.7×
core: collection() @ 2k
7.3×
emit: 1 element (ref-qualified) listener @ 2k
7.3×
data: removeData (whole collection) @ 2k
7.2×
core: collection() @ 2k
7.1×
mut-bulk: select + unselect @ 2k
7.1×
compound: orphans + nonorphans (2 calls) @ 2k
7.0×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners) @ 2k
6.7×
core: batch( fn ) (empty) @ 2k
6.5×
collection: union @ 2k
6.3×
emit: 10 core listeners @ 2k
6.3×
style: whole-object style() @ 2k
6.2×
load: init from the definition form (construct + dispose) @ 2k
6.2×
mut-bulk: remove + re-add (256 nodes + cascade) @ 2k
6.2×
bounds: whole-graph boundingBox() @ 2k
6.0×
core: startBatch + endBatch + batching @ 2k
5.8×
core: nodes ($("node") vs filter({group})) @ 2k
5.6×
algo: hierholzer (directed) @ 500
5.4×
traverse: incomers() @ 2k
5.3×
trav: outgoers() @ 2k
5.3×
algo: affinityPropagation @ 500
5.2×
traverse: outgoers() @ 2k
5.2×
set: union() @ 2k
5.2×
trav: incomers() @ 2k
5.1×
traversal: allAreNeighbors @ 2k
5.0×
compound: children + descendants + siblings (3 calls) @ 2k
4.9×
core: animated() @ 2k
4.9×
trav: band neighborhood() @ 2k
4.9×
compare: contains() @ 2k
4.7×
viewport: zoom() get @ 2k
4.6×
collection: length + empty + nonempty (3 calls) @ 2k
4.6×
style: bypass set + removeStyle round-trip @ 2k
4.3×
mut: data set @ 2k
4.2×
trav: neighborhood() @ 2k
4.0×
algo: kMeans (fixed centroids) @ 500
3.9×
viewport: width() + height() + size() (3 calls) @ 2k
3.9×
traverse: neighborhood() @ 2k
3.8×
mut: select + unselect @ 2k
3.8×
collection: symmetricDifference @ 2k
3.8×
algo: aStar @ 500
3.6×
collection: cy() @ 2k
3.6×
compound: parent + parents + ancestors (3 calls) @ 2k
3.5×
algo: aStar @ 2k
3.4×
traversal: sources + targets (2 calls) @ 2k
3.3×
traversal: connectedNodes @ 2k
3.3×
collection: diff @ 2k
3.2×
style: bypass set (ele.style name,value) @ 2k
3.2×
traversal: parallelEdges + codirectedEdges (2 calls) @ 2k
3.1×
collection: layoutDimensions() @ 2k
3.1×
anim: start + stop, 512-node collection @ 2k
3.0×
algo: hierholzer (directed) @ 2k
3.0×
collection: animated() @ 2k
2.9×
dimensions: rendered dims (4 calls) @ 2k
2.9×
traversal: openNeighborhood + closedNeighborhood (2 calls) @ 2k
2.8×
trav: band connectedNodes() @ 2k
2.8×
anim: viewport animate + stop @ 2k
2.8×
core: window() @ 2k
2.8×
collection: delayAnimation() @ 2k
2.8×
flags: takesUpSpace + interactive + transparent (3 calls) @ 2k
2.7×
load: cy.json() @ 2k
2.7×
collection: byGroup @ 2k
2.7×
trav: connectedEdges() @ 2k
2.6×
core: container() @ 2k
2.6×
dimensions: width + height + outerWidth + outerHeight (4 calls) @ 2k
2.6×
traverse: connectedEdges() @ 2k
2.6×
flags: effectiveOpacity @ 2k
2.6×
trav: closedNeighborhood() @ 2k
2.5×
collection: is (none match: the full walk) @ 2k
2.5×
traversal: isLoop + isSimple (2 calls) @ 2k
2.5×
algo: hierarchicalClustering (threshold) @ 500
2.5×
core: resize() / invalidateSize() @ 2k
2.5×
iter: map() @ 2k
2.4×
core: onRender + offRender @ 2k
2.3×
data: read the whole object @ 2k
2.3×
dimensions: renderedPosition get @ 2k
2.2×
collection: slice() @ 2k
2.2×
core: destroyed() @ 2k
2.2×
element data: json() one element @ 2k
2.2×
core: isReady() @ 2k
2.2×
emit: on() + off() round-trip @ 2k
2.2×
style: read one prop (width) @ 2k
2.1×
flags: grabbed + hidden + inactive (3 calls) @ 2k
2.1×
style: numericStyle @ 2k
2.00×
core: selectionType get @ 2k
1.99×
viewport: zoom( n ) set @ 2k
1.99×
collection: min + max ( fn ) (2 calls) @ 2k
1.96×
json: element @ 2k
1.93×
algo: pageRank (20 iters) @ 500
1.92×
iter: filter(fn) @ 2k
1.87×
core: gating setters round-trip (autolock/autoungrabify/autounselectify) @ 2k
1.87×
dimensions: renderedBoundingBox @ 2k
1.86×
collection: eq/first/last (3 calls) @ 2k
1.85×
viewport: pan( p ) set @ 2k
1.84×
core: zoom set @ 2k
1.79×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener) @ 2k
1.78×
element data: jsons() over 100 @ 2k
1.75×
collection: element accessors (id/group/isNode/isEdge, 4 calls) @ 2k
1.75×
viewport: panBy() @ 2k
1.70×
style( 'text-max-width' ) (was #74 in the switch) @ 2k
1.69×
sweep: filter(fn) @ 2k
1.68×
algo: closenessCentralityNormalized @ 500
1.68×
style( 'text-wrap' ) (was #73 in the switch) @ 2k
1.67×
viewport: renderedExtent() @ 2k
1.65×
collection: indexOfId() @ 2k
1.63×
bounds: one node boundingBox() @ 2k
1.62×
style: first apply on add (256-node band) @ 2k
1.61×
collection: some + every (2 calls) @ 2k
1.61×
algo: floydWarshall @ 500
1.60×
trav: band sources() @ 2k
1.60×
collection: sort( fn ) @ 2k
1.60×
anim: delay() (no channels touched) @ 2k
1.56×
compound: isParent/isChild/isChildless/isOrphan (4 calls) @ 2k
1.56×
viewport: extent() @ 2k
1.52×
position: get @ 2k
1.51×
style: read one prop (color) @ 2k
1.48×
collection: allAre (all match: the full walk) @ 2k
1.47×
anim: start + stop, one element @ 2k
1.46×
trav: band connectedEdges() @ 2k
1.42×
collection: reduce( fn ) @ 2k
1.40×
core: hasElementWithId + hasCompoundNodes (2 calls) @ 2k
1.36×
core: mutableElements() (v4 materializes; v3 is O(1)) @ 2k
1.36×
data: read one numeric key @ 2k
1.35×
core: pan() get (x32) @ 2k
1.34×
load: add a 256-node band (add + remove) @ 2k
1.33×
data: read one string key (dictionary decode) @ 2k
1.31×
collection: indexOf @ 2k
1.29×
traversal: source() + target() (2 calls) @ 2k
1.27×
core: instanceString + headless + styleEnabled (3 calls) @ 2k
1.27×
traversal: edgesWith @ 2k
1.25×
traversal: edgesTo @ 2k
1.24×
style( 'target-distance-from-node' ) (was #150 in the switch) @ 2k
1.22×
style( 'taxi-radius' ) (was #142 in the switch) @ 2k
1.22×
style( 'border-width' ) (was #6 in the switch) @ 2k
1.19×
core: filter(fn) @ 2k
1.18×
collection: removed() + inside() (2 calls) @ 2k
1.17×
data: get @ 2k
1.16×
style: sheet swap (compile + applyAll) @ 2k
1.14×
core: getElementById() @ 2k
1.14×
style( 'background-color' ) (was #4 in the switch) @ 2k
1.14×
core: gating getters (5 calls) @ 2k
1.14×
algo: markovClustering @ 500
1.10×
core: extent() @ 2k
1.10×
viewport: pan() get @ 2k
1.08×
iter: forEach() @ 2k
1.04×
algo: kargerStein @ 500
1.03×
10×100×1000×10000×100000×1000000×

Scaling speedup vs graph size

algorithms

group× @ N=500× @ N=2k
algo: bfs (whole graph)65×62×
algo: dfs (whole graph)63×61×
algo: dijkstra + pathTo55×57×
algo: aStar3.6×3.4×
algo: bellmanFord21×20×
algo: kruskal25×27×
algo: tarjan SCC38×38×
algo: hopcroft-tarjan biconnected26×26×
algo: hierholzer (directed)5.4×3.0×
algo: betweennessCentrality (unweighted)11×11×
algo: degreeCentralityNormalized40×38×
algo: closenessCentrality (one root)75×74×
algo: degreeCentrality (one root)32×30×
algo: pageRank (20 iters)1.92×
algo: closenessCentrality (weighted, one root)57×
algo: floydWarshall1.60×
algo: closenessCentralityNormalized1.68×
algo: markovClustering1.10×
algo: hierarchicalClustering (threshold)2.5×
algo: kMeans (fixed centroids)3.9×
algo: kMedoids8.7×
algo: fuzzyCMeans8.6×
algo: affinityPropagation5.2×
algo: kargerStein1.03×
algo: betweennessCentrality (weighted)9.0×

core+collection N=2,000 · 58.4 sv4 (gpu) v3

core: getElementById()
1.14×
core: id lookup ($("#id") vs $id())
26×
core: nodes()
51120×
core: edges()
93617×
core: elements()
23406×
core: nodes ($("node") vs filter({group}))
5.6×
core: selected ($(":selected") vs filter({selected}))
14×
core: filter(fn)
1.18×
core: collection()
7.1×
core: pan() get (x32)
1.34×
core: extent()
1.10×
core: add + remove
17×
core: zoom set
1.79×
traverse: neighborhood()
3.8×
traverse: connectedEdges()
2.6×
traverse: outgoers()
5.2×
traverse: incomers()
5.3×
traverse: components()
40×
degree: node.degree()
119×
degree: nodes.totalDegree()
167×
degree: nodes.maxDegree()
141×
data: get
1.16×
position: get
1.51×
json: element
1.93×
set: union()
5.2×
set: intersection()
27×
set: difference()
29×
iter: map()
2.4×
iter: forEach()
1.04×
iter: filter(fn)
1.87×
compare: same()
7609×
compare: contains()
4.7×
mut: data set
4.2×
mut: position set
24×
mut: select + unselect
3.8×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
core: getElementById()v3 95.0 ns96.8 ns 117 ns91.5 ns 1772
core: getElementById()gpu 83.1 ns86.1 ns 126 ns80.8 ns 1990
core: id lookup ($("#id") vs $id())v3 2.03 µs2.37 µs 3.57 µs1.93 µs 65
core: id lookup ($("#id") vs $id())gpu 78.4 ns84.1 ns 161 ns76.3 ns 2032
core: nodes()v3 419 µs439 µs 806 µs413 µs 1591
core: nodes()gpu 8.20 ns8.76 ns 17.0 ns7.88 ns 19358
core: edges()v3 742 µs755 µs 934 µs722 µs 925
core: edges()gpu 7.93 ns8.28 ns 15.9 ns7.57 ns 20572
core: elements()v3 162 µs169 µs 284 µs160 µs 4130
core: elements()gpu 6.94 ns7.28 ns 23.9 ns6.63 ns 23274
core: nodes ($("node") vs filter({group}))v3 562 µs589 µs 1.25 ms548 µs 1185
core: nodes ($("node") vs filter({group}))gpu 100 µs106 µs 262 µs71.0 µs 6439
core: selected ($(":selected") vs filter({selected}))v3 364 µs380 µs 697 µs345 µs 1830
core: selected ($(":selected") vs filter({selected}))gpu 25.6 µs26.3 µs 26.5 µs25.3 µs 12
core: filter(fn)v3 415 µs429 µs 640 µs408 µs 1629
core: filter(fn)gpu 351 µs384 µs 857 µs343 µs 1796
core: collection()v3 476 ns576 ns 1.71 µs448 ns 290
core: collection()gpu 67.4 ns73.5 ns 288 ns65.6 ns 2298
core: pan() get (x32)v3 45.6 ns45.7 ns 48.4 ns43.4 ns 3617
core: pan() get (x32)gpu 34.1 ns36.4 ns 55.2 ns33.1 ns 4698
core: extent()v3 22.8 ns39.1 ns 144 ns21.8 ns 4271
core: extent()gpu 20.8 ns28.0 ns 111 ns19.5 ns 5922
core: add + removev3 130 µs137 µs 278 µs121 µs 5034
core: add + removegpu 7.56 µs8.57 µs 22.5 µs7.02 µs 73631
core: zoom setv3 1.26 µs1.28 µs 1.46 µs1.20 µs 128
core: zoom setgpu 704 ns712 ns 931 ns645 ns 228
traverse: neighborhood()v3 3.60 µs3.82 µs 4.62 µs3.39 µs 40
traverse: neighborhood()gpu 942 ns1.01 µs 1.66 µs906 ns 156
traverse: connectedEdges()v3 1.01 µs1.11 µs 1.90 µs974 ns 147
traverse: connectedEdges()gpu 388 ns410 ns 1.24 µs378 ns 405
traverse: outgoers()v3 2.35 µs2.54 µs 3.40 µs2.22 µs 63
traverse: outgoers()gpu 453 ns540 ns 2.06 µs441 ns 300
traverse: incomers()v3 2.44 µs2.62 µs 3.35 µs2.27 µs 61
traverse: incomers()gpu 462 ns582 ns 2.15 µs453 ns 278
traverse: components()v3 82.5 ms85.8 ms 95.1 ms80.0 ms 12
traverse: components()gpu 2.04 ms2.17 ms 3.61 ms2.00 ms 307
degree: node.degree()v3 3.37 µs3.65 µs 4.37 µs3.24 µs 42
degree: node.degree()gpu 28.3 ns29.5 ns 40.0 ns27.2 ns 5788
degree: nodes.totalDegree()v3 7.29 ms8.16 ms 11.6 ms6.95 ms 82
degree: nodes.totalDegree()gpu 43.6 µs44.8 µs 79.7 µs42.4 µs 15391
degree: nodes.maxDegree()v3 7.26 ms8.44 ms 13.2 ms6.92 ms 79
degree: nodes.maxDegree()gpu 51.6 µs52.9 µs 88.2 µs50.6 µs 12735
data: getv3 30.0 ns30.9 ns 48.7 ns28.6 ns 5535
data: getgpu 26.0 ns26.7 ns 36.9 ns24.9 ns 6411
position: getv3 31.4 ns33.5 ns 126 ns31.0 ns 5110
position: getgpu 20.8 ns25.2 ns 71.1 ns20.1 ns 6540
json: elementv3 294 ns392 ns 3.62 µs287 ns 423
json: elementgpu 152 ns160 ns 338 ns148 ns 1018
set: union()v3 94.2 µs110 µs 223 µs92.5 µs 6115
set: union()gpu 18.3 µs19.1 µs 19.2 µs17.4 µs 12
set: intersection()v3 91.4 µs103 µs 157 µs89.6 µs 6596
set: intersection()gpu 3.41 µs3.45 µs 3.69 µs3.38 µs 43
set: difference()v3 99.0 µs114 µs 176 µs95.0 µs 6021
set: difference()gpu 3.41 µs3.45 µs 3.90 µs3.34 µs 45
iter: map()v3 23.9 µs25.3 µs 26.2 µs23.7 µs 12
iter: map()gpu 10.1 µs10.2 µs 10.2 µs10.1 µs 13
iter: forEach()v3 3.44 µs3.78 µs 4.74 µs3.43 µs 36
iter: forEach()gpu 3.31 µs3.34 µs 3.60 µs3.27 µs 45
iter: filter(fn)v3 240 µs248 µs 338 µs237 µs 2823
iter: filter(fn)gpu 128 µs133 µs 212 µs125 µs 5273
compare: same()v3 113 µs116 µs 171 µs108 µs 6035
compare: same()gpu 14.8 ns16.0 ns 30.2 ns14.3 ns 10690
compare: contains()v3 6.07 µs6.16 µs 6.44 µs5.98 µs 24
compare: contains()gpu 1.29 µs1.30 µs 1.40 µs1.24 µs 125
mut: data setv3 454 ns472 ns 702 ns451 ns 354
mut: data setgpu 109 ns112 ns 152 ns107 ns 1481
mut: position setv3 1.22 µs1.25 µs 1.36 µs1.20 µs 132
mut: position setgpu 50.7 ns53.8 ns 102 ns49.4 ns 3150
mut: select + unselectv3 2.54 µs2.71 µs 3.24 µs2.46 µs 57
mut: select + unselectgpu 670 ns733 ns 1.29 µs619 ns 697576

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

sweep: nodes()
167819×
sweep: edges()
304501×
sweep: elements()
29945×
sweep: all nodes ($("node") vs filter({group}))
9.4×
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.68×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
sweep: nodes()v3 413 µs425 µs 548 µs407 µs 1651
sweep: nodes()gpu 2.46 ns2.68 ns 5.61 ns2.40 ns 61454
sweep: edges()v3 781 µs808 µs 1.19 ms729 µs 864
sweep: edges()gpu 2.56 ns2.66 ns 4.94 ns2.40 ns 62241
sweep: elements()v3 144 µs151 µs 230 µs142 µs 4602
sweep: elements()gpu 4.80 ns4.98 ns 11.4 ns4.60 ns 33808
sweep: all nodes ($("node") vs filter({group}))v3 550 µs574 µs 854 µs536 µs 1215
sweep: all nodes ($("node") vs filter({group}))gpu 58.5 µs73.5 µs 184 µs54.3 µs 9416
sweep: selected ($(":selected") vs filter({selected}))v3 345 µs354 µs 564 µs333 µs 1971
sweep: selected ($(":selected") vs filter({selected}))gpu 26.5 µs26.8 µs 27.8 µs26.1 µs 12
sweep: selected nodes ($("node:selected") vs filter({group, selected}))v3 332 µs342 µs 578 µs324 µs 2043
sweep: selected nodes ($("node:selected") vs filter({group, selected}))gpu 9.53 µs9.63 µs 10.1 µs9.41 µs 14
sweep: nodes(":selected") vs nodes({selected})v3 532 µs550 µs 913 µs524 µs 1273
sweep: nodes(":selected") vs nodes({selected})gpu 9.04 µs9.08 µs 9.41 µs8.94 µs 15
sweep: filter(fn)v3 415 µs424 µs 593 µs401 µs 1650
sweep: filter(fn)gpu 246 µs265 µs 553 µs240 µs 2621

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

mut-bulk: select + unselect
7.1×
mut-bulk: hide + show
283×
mut-bulk: lock + unlock
52×
mut-bulk: positions(obj)
105×
mut-bulk: positions(fn)
99×
mut-bulk: shift
100×
mut-bulk: data set
14×
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 1.89 ms1.94 ms 3.10 ms1.75 ms 342
mut-bulk: select + unselectgpu 267 µs276 µs 397 µs259 µs 2543
mut-bulk: hide + showv3 60.3 ms66.6 ms 70.7 ms59.3 ms 12
mut-bulk: hide + showgpu 213 µs221 µs 391 µs207 µs 3071
mut-bulk: lock + unlockv3 2.00 ms2.08 ms 3.50 ms1.94 ms 332
mut-bulk: lock + unlockgpu 38.5 µs38.9 µs 39.3 µs38.1 µs 12
mut-bulk: positions(obj)v3 2.17 ms2.25 ms 4.65 ms2.09 ms 303
mut-bulk: positions(obj)gpu 20.6 µs22.4 µs 36.7 µs19.6 µs 30758
mut-bulk: positions(fn)v3 3.45 ms3.65 ms 5.87 ms3.32 ms 188
mut-bulk: positions(fn)gpu 34.7 µs37.2 µs 88.5 µs32.8 µs 18292
mut-bulk: shiftv3 3.41 ms3.61 ms 6.13 ms3.30 ms 188
mut-bulk: shiftgpu 34.0 µs36.2 µs 69.8 µs32.8 µs 18994
mut-bulk: data setv3 850 µs893 µs 1.55 ms837 µs 766
mut-bulk: data setgpu 62.3 µs63.6 µs 102 µs60.0 µs 10640
mut-bulk: remove + re-add (256 nodes + cascade)v3 41.4 ms43.4 ms 49.4 ms40.5 ms 12
mut-bulk: remove + re-add (256 nodes + cascade)gpu 6.73 ms6.84 ms 8.05 ms6.00 ms 96

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

scn: explore (expand 2-hop + select + fit)
8.2×
scn: select-all + fit (listeners on)
26×
scn: drag (select band of 100 + 8-step shift, position listener)
16×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)
6.7×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)
1.78×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
scn: explore (expand 2-hop + select + fit)v3 307 µs364 µs 1.15 ms277 µs 1900
scn: explore (expand 2-hop + select + fit)gpu 37.6 µs42.6 µs 182 µs34.1 µs 16039
scn: select-all + fit (listeners on)v3 23.9 ms24.0 ms 26.1 ms22.4 ms 25
scn: select-all + fit (listeners on)gpu 910 µs963 µs 1.49 ms868 µs 699
scn: drag (select band of 100 + 8-step shift, position listener)v3 1.64 ms1.70 ms 2.30 ms1.57 ms 395
scn: drag (select band of 100 + 8-step shift, position listener)gpu 102 µs106 µs 176 µs100 µs 6324
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)v3 47.2 ms47.2 ms 49.4 ms44.1 ms 11
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)gpu 7.09 ms7.17 ms 8.65 ms6.33 ms 89
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)v3 7.53 ms8.10 ms 12.7 ms7.00 ms 80
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)gpu 4.22 ms4.35 ms 7.10 ms3.73 ms 148

traversal N=2,000 · 40.1 sv4 (gpu) v3

trav: neighborhood()
4.0×
trav: closedNeighborhood()
2.5×
trav: connectedEdges()
2.6×
trav: outgoers()
5.3×
trav: incomers()
5.1×
trav: successors()
757×
trav: predecessors()
736×
trav: band neighborhood()
4.9×
trav: band connectedEdges()
1.42×
trav: band roots()
22×
trav: band sources()
1.60×
trav: band connectedNodes()
2.8×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
trav: neighborhood()v3 4.04 µs4.04 µs 5.03 µs3.38 µs 38
trav: neighborhood()gpu 1.02 µs1.08 µs 2.15 µs842 ns 153
trav: closedNeighborhood()v3 5.55 µs5.65 µs 6.18 µs5.18 µs 26
trav: closedNeighborhood()gpu 2.20 µs2.37 µs 3.01 µs2.12 µs 67
trav: connectedEdges()v3 1.04 µs1.15 µs 2.18 µs986 ns 142
trav: connectedEdges()gpu 397 ns415 ns 705 ns385 ns 405
trav: outgoers()v3 2.32 µs2.47 µs 3.05 µs2.23 µs 65
trav: outgoers()gpu 439 ns523 ns 2.01 µs429 ns 317
trav: incomers()v3 2.26 µs2.41 µs 3.07 µs2.19 µs 66
trav: incomers()gpu 442 ns530 ns 2.04 µs431 ns 311
trav: successors()v3 428 ms429 ms 433 ms424 ms 12
trav: successors()gpu 565 µs593 µs 1.90 ms545 µs 1151
trav: predecessors()v3 432 ms432 ms 439 ms425 ms 12
trav: predecessors()gpu 587 µs623 µs 1.93 ms565 µs 1093
trav: band neighborhood()v3 182 µs197 µs 356 µs178 µs 3531
trav: band neighborhood()gpu 37.3 µs38.2 µs 39.9 µs37.0 µs 12
trav: band connectedEdges()v3 24.0 µs24.1 µs 24.5 µs23.4 µs 12
trav: band connectedEdges()gpu 16.9 µs17.6 µs 19.2 µs16.5 µs 12
trav: band roots()v3 109 µs117 µs 162 µs102 µs 5905
trav: band roots()gpu 4.90 µs4.94 µs 5.17 µs4.79 µs 31
trav: band sources()v3 7.01 µs7.03 µs 7.36 µs6.55 µs 21
trav: band sources()gpu 4.39 µs4.42 µs 4.73 µs4.30 µs 34
trav: band connectedNodes()v3 14.1 µs14.4 µs 14.3 µs13.8 µs 12
trav: band connectedNodes()gpu 4.96 µs5.02 µs 5.31 µs4.85 µs 30

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

algo: bfs (whole graph)
62×
algo: dfs (whole graph)
61×
algo: dijkstra + pathTo
57×
algo: aStar
3.4×
algo: bellmanFord
20×
algo: kruskal
27×
algo: tarjan SCC
38×
algo: hopcroft-tarjan biconnected
26×
algo: hierholzer (directed)
3.0×
algo: betweennessCentrality (unweighted)
11×
algo: degreeCentralityNormalized
38×
algo: closenessCentrality (one root)
74×
algo: degreeCentrality (one root)
30×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 56.7 ms55.7 ms 60.2 ms50.7 ms 9
algo: bfs (whole graph)gpu 918 µs940 µs 1.53 ms854 µs 737
algo: dfs (whole graph)v3 50.2 ms51.0 ms 51.9 ms49.6 ms 10
algo: dfs (whole graph)gpu 828 µs856 µs 1.26 ms803 µs 796
algo: dijkstra + pathTov3 52.6 ms54.1 ms 58.4 ms52.1 ms 9
algo: dijkstra + pathTogpu 931 µs947 µs 1.18 ms910 µs 725
algo: aStarv3 1.74 ms1.80 ms 2.56 ms1.65 ms 384
algo: aStargpu 507 µs521 µs 695 µs496 µs 1339
algo: bellmanFordv3 233 ms230 ms 251 ms211 ms 12
algo: bellmanFordgpu 11.7 ms12.0 ms 14.7 ms11.6 ms 54
algo: kruskalv3 13.8 ms14.7 ms 18.4 ms12.9 ms 43
algo: kruskalgpu 503 µs527 µs 870 µs468 µs 1304
algo: tarjan SCCv3 24.4 ms24.1 ms 27.6 ms21.4 ms 25
algo: tarjan SCCgpu 647 µs816 µs 5.34 ms615 µs 827
algo: hopcroft-tarjan biconnectedv3 87.8 ms88.9 ms 92.9 ms83.1 ms 12
algo: hopcroft-tarjan biconnectedgpu 3.43 ms3.54 ms 4.55 ms3.34 ms 191
algo: hierholzer (directed)v3 23.2 ms24.0 ms 26.9 ms22.0 ms 25
algo: hierholzer (directed)gpu 7.75 ms7.93 ms 9.50 ms7.64 ms 78
algo: betweennessCentrality (unweighted)v3 4.07 s4.08 s 4.15 s4.02 s 12
algo: betweennessCentrality (unweighted)gpu 359 ms380 ms 449 ms351 ms 12
algo: degreeCentralityNormalizedv3 15.1 ms15.7 ms 18.5 ms13.9 ms 40
algo: degreeCentralityNormalizedgpu 401 µs411 µs 656 µs386 µs 1694
algo: closenessCentrality (one root)v3 60.3 ms62.9 ms 68.1 ms58.5 ms 12
algo: closenessCentrality (one root)gpu 816 µs836 µs 1.21 ms782 µs 837
algo: degreeCentrality (one root)v3 7.39 µs7.18 µs 7.69 µs6.59 µs 20
algo: degreeCentrality (one root)gpu 244 ns249 ns 301 ns239 ns 678

algorithms N=500 · 6.9 minv4 (gpu) v3

algo: bfs (whole graph)
65×
algo: dfs (whole graph)
63×
algo: dijkstra + pathTo
55×
algo: aStar
3.6×
algo: bellmanFord
21×
algo: kruskal
25×
algo: tarjan SCC
38×
algo: hopcroft-tarjan biconnected
26×
algo: hierholzer (directed)
5.4×
algo: betweennessCentrality (unweighted)
11×
algo: degreeCentralityNormalized
40×
algo: closenessCentrality (one root)
75×
algo: degreeCentrality (one root)
32×
algo: pageRank (20 iters)
1.92×
algo: closenessCentrality (weighted, one root)
57×
algo: floydWarshall
1.60×
algo: closenessCentralityNormalized
1.68×
algo: markovClustering
1.10×
algo: hierarchicalClustering (threshold)
2.5×
algo: kMeans (fixed centroids)
3.9×
algo: kMedoids
8.7×
algo: fuzzyCMeans
8.6×
algo: affinityPropagation
5.2×
algo: kargerStein
1.03×
algo: betweennessCentrality (weighted)
9.0×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 12.8 ms13.6 ms 19.5 ms11.4 ms 47
algo: bfs (whole graph)gpu 198 µs212 µs 397 µs193 µs 3305
algo: dfs (whole graph)v3 11.8 ms12.8 ms 16.7 ms11.4 ms 51
algo: dfs (whole graph)gpu 186 µs191 µs 248 µs183 µs 3663
algo: dijkstra + pathTov3 12.4 ms13.4 ms 16.8 ms12.0 ms 48
algo: dijkstra + pathTogpu 227 µs236 µs 336 µs221 µs 2966
algo: aStarv3 434 µs443 µs 522 µs424 µs 1580
algo: aStargpu 119 µs122 µs 165 µs116 µs 5721
algo: bellmanFordv3 17.3 ms17.4 ms 18.1 ms17.0 ms 36
algo: bellmanFordgpu 805 µs836 µs 1.91 ms800 µs 832
algo: kruskalv3 3.31 ms3.58 ms 6.88 ms3.19 ms 191
algo: kruskalgpu 132 µs140 µs 242 µs127 µs 4954
algo: tarjan SCCv3 5.63 ms6.04 ms 9.10 ms5.45 ms 111
algo: tarjan SCCgpu 147 µs156 µs 264 µs144 µs 4490
algo: hopcroft-tarjan biconnectedv3 21.6 ms22.2 ms 25.4 ms20.0 ms 28
algo: hopcroft-tarjan biconnectedgpu 818 µs838 µs 1.20 ms792 µs 831
algo: hierholzer (directed)v3 4.33 ms4.60 ms 7.79 ms4.20 ms 145
algo: hierholzer (directed)gpu 801 µs825 µs 1.18 ms788 µs 835
algo: betweennessCentrality (unweighted)v3 264 ms265 ms 274 ms259 ms 12
algo: betweennessCentrality (unweighted)gpu 24.2 ms24.3 ms 25.7 ms23.0 ms 25
algo: degreeCentralityNormalizedv3 3.69 ms4.00 ms 7.49 ms3.57 ms 171
algo: degreeCentralityNormalizedgpu 92.7 µs95.7 µs 148 µs89.5 µs 7294
algo: closenessCentrality (one root)v3 14.7 ms15.8 ms 20.1 ms14.0 ms 40
algo: closenessCentrality (one root)gpu 197 µs206 µs 296 µs191 µs 3396
algo: degreeCentrality (one root)v3 7.72 µs7.56 µs 8.13 µs6.91 µs 19
algo: degreeCentrality (one root)gpu 241 ns247 ns 375 ns230 ns 688
algo: pageRank (20 iters)v3 2.76 ms2.90 ms 6.35 ms2.69 ms 237
algo: pageRank (20 iters)gpu 1.44 ms1.67 ms 3.78 ms1.42 ms 414
algo: closenessCentrality (weighted, one root)v3 14.3 ms15.5 ms 18.8 ms13.8 ms 40
algo: closenessCentrality (weighted, one root)gpu 249 µs256 µs 334 µs241 µs 2734
algo: floydWarshallv3 247 ms273 ms 379 ms244 ms 12
algo: floydWarshallgpu 154 ms159 ms 209 ms139 ms 12
algo: closenessCentralityNormalizedv3 274 ms281 ms 297 ms270 ms 12
algo: closenessCentralityNormalizedgpu 163 ms165 ms 166 ms162 ms 12
algo: markovClusteringv3 4.14 s4.38 s 4.66 s4.08 s 12
algo: markovClusteringgpu 3.76 s3.76 s 3.77 s3.74 s 12
algo: hierarchicalClustering (threshold)v3 35.3 ms35.4 ms 36.0 ms34.6 ms 16
algo: hierarchicalClustering (threshold)gpu 14.2 ms14.8 ms 20.1 ms13.8 ms 42
algo: kMeans (fixed centroids)v3 9.12 ms9.20 ms 9.86 ms8.90 ms 72
algo: kMeans (fixed centroids)gpu 2.32 ms2.39 ms 3.42 ms2.28 ms 289
algo: kMedoidsv3 363 ms290 ms 376 ms70.4 ms 12
algo: kMedoidsgpu 41.9 ms42.6 ms 57.5 ms22.2 ms 13
algo: fuzzyCMeansv3 78.1 ms79.6 ms 85.0 ms77.1 ms 12
algo: fuzzyCMeansgpu 9.11 ms9.18 ms 9.69 ms8.80 ms 72
algo: affinityPropagationv3 209 ms211 ms 216 ms202 ms 12
algo: affinityPropagationgpu 40.0 ms41.4 ms 45.1 ms39.0 ms 10
algo: kargerSteinv3 317 ms322 ms 334 ms313 ms 12
algo: kargerSteingpu 308 ms309 ms 317 ms300 ms 12
algo: betweennessCentrality (weighted)v3 720 ms725 ms 738 ms712 ms 12
algo: betweennessCentrality (weighted)gpu 79.8 ms81.9 ms 83.6 ms78.3 ms 12

mappers N=2,000 · 8.2 s

mapper: bulk write, color — cpu eval
2.77 ms
mapper: bulk write, color — gpu path
175 µs
mapper: bulk write, color + size — cpu eval
3.14 ms
mapper: bulk write, color + size — gpu color / cpu size
2.79 ms
mapper: bulk write, mapped labels (round-5 path) — label refresh
3.95 ms
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
mapper: bulk write, colorcpu eval 2.77 ms2.86 ms 4.59 ms2.66 ms 239
mapper: bulk write, colorgpu path 175 µs182 µs 270 µs169 µs 3856
mapper: bulk write, color + sizecpu eval 3.14 ms3.17 ms 3.63 ms3.02 ms 215
mapper: bulk write, color + sizegpu color / cpu size 2.79 ms2.85 ms 3.70 ms2.68 ms 242
mapper: bulk write, mapped labels (round-5 path)label refresh 3.95 ms4.16 ms 6.80 ms3.48 ms 163

layouts N=2,000 · 30.9 sv4 (gpu) v3

layout: grid
154×
layout: preset
18×
layout: preset (fn form)
57×
layout: circle
12×
layout: concentric
26×
layout: breadthfirst
37×
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)
111 ms
layout: force seed — spectral vs scatter (20 iterations) — scatter
55.9 ms
layout: plumbing (layoutPositions vs setPositions) — finisher
360 µs
layout: plumbing (layoutPositions vs setPositions) — bulk
31.1 µs
layout: contract fixed cost (empty impl vs bulk placement) — wrapper only
529 ns
layout: contract fixed cost (empty impl vs bulk placement) — wrapper + bulk write
39.9 µs
layout: scope (eles.layout, 10% of nodes)
9.5×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
layout: gridv3 11.6 ms12.3 ms 18.7 ms9.93 ms 51
layout: gridgpu 75.5 µs81.3 µs 359 µs72.9 µs 7877
layout: presetv3 5.83 ms6.44 ms 11.8 ms5.51 ms 103
layout: presetgpu 329 µs349 µs 773 µs292 µs 1874
layout: preset (fn form)v3 5.56 ms5.90 ms 9.25 ms5.22 ms 113
layout: preset (fn form)gpu 96.9 µs108 µs 391 µs94.1 µs 6387
layout: circlev3 9.58 ms10.1 ms 14.8 ms9.01 ms 65
layout: circlegpu 800 µs896 µs 2.93 ms762 µs 755
layout: concentricv3 31.0 ms31.9 ms 37.9 ms28.2 ms 18
layout: concentricgpu 1.21 ms1.40 ms 4.91 ms1.19 ms 484
layout: breadthfirstv3 410 ms413 ms 437 ms393 ms 12
layout: breadthfirstgpu 11.2 ms12.2 ms 18.8 ms10.4 ms 51
layout: randomv3 5.33 ms5.64 ms 9.49 ms5.17 ms 118
layout: randomgpu 497 µs549 µs 1.49 ms478 µs 1254
layout: force (CPU executor, 20 iterations)gpu 113 ms129 ms 143 ms103 ms 12
layout: force seed — spectral vs scatter (20 iterations)spectral (landmark MDS, the default) 111 ms111 ms 119 ms103 ms 12
layout: force seed — spectral vs scatter (20 iterations)scatter 55.9 ms56.5 ms 56.7 ms55.5 ms 9
layout: plumbing (layoutPositions vs setPositions)finisher 360 µs394 µs 861 µs350 µs 1756
layout: plumbing (layoutPositions vs setPositions)bulk 31.1 µs37.8 µs 66.8 µs29.3 µs 16741
layout: contract fixed cost (empty impl vs bulk placement)wrapper only 529 ns978 ns 4.00 µs511 ns 166
layout: contract fixed cost (empty impl vs bulk placement)wrapper + bulk write 39.9 µs41.9 µs 48.8 µs37.4 µs 12
layout: scope (eles.layout, 10% of nodes)v3 969 µs1.05 ms 2.16 ms948 µs 648
layout: scope (eles.layout, 10% of nodes)gpu 102 µs118 µs 262 µs99.0 µs 5796

style N=2,000 · 34.7 sv4 (gpu) v3

style: sheet swap (compile + applyAll)
1.14×
style: compile vs compile + apply — compile only (in batch)
32.6 µs
style: compile vs compile + apply — compile + apply
10.5 ms
style: first apply on add (256-node band)
1.61×
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — flat
10.7 ms
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — compound
11.3 ms
style: applyAll — constant vs state-case (the 57.1d partition) — constant sheet
10.5 ms
style: applyAll — constant vs state-case (the 57.1d partition) — state-case sheet
10.6 ms
style: applyAll — state-case vs data-case (what the partition avoids) — state-case sheet
10.8 ms
style: applyAll — state-case vs data-case (what the partition avoids) — data-case sheet
14.3 ms
style: select+unselect 256-band — constant vs state-case sheet — constant sheet (skips restyle)
6.77 µs
style: select+unselect 256-band — constant vs state-case sheet — paint-only state sheet (round-61 diff path)
34.4 µs
style: select+unselect 256-band — constant vs state-case sheet — state-case sheet (all channels; full write)
573 µs
style: read one prop (color)
1.48×
style: read one prop (width)
2.1×
style: numericStyle
2.00×
style: renderedStyle (one prop)
14×
style: whole-object style()
6.2×
style: bypass set (ele.style name,value)
3.2×
style: bypass set + removeStyle round-trip
4.3×
style: select+unselect 256-band under the default sheet — bypass punch-out — no bypasses (diff path; the O(0) gate row)
35.2 µs
style: select+unselect 256-band under the default sheet — bypass punch-out — 128 of 256 bypassed (punched out to merged writes)
343 µs
style: sheet swap (applyAll) — 0 vs 128 bypasses — no bypasses
11.0 ms
style: sheet swap (applyAll) — 0 vs 128 bypasses — 128 bypassed
11.5 ms
10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
style: sheet swap (compile + applyAll)v3 12.4 ms12.8 ms 16.7 ms11.7 ms 47
style: sheet swap (compile + applyAll)gpu 10.8 ms11.2 ms 13.6 ms10.5 ms 58
style: compile vs compile + applycompile only (in batch) 32.6 µs35.5 µs 41.5 µs28.8 µs 12
style: compile vs compile + applycompile + apply 10.5 ms10.8 ms 13.5 ms10.3 ms 60
style: first apply on add (256-node band)v3 1.32 ms1.56 ms 6.79 ms1.10 ms 432
style: first apply on add (256-node band)gpu 820 µs928 µs 2.84 ms785 µs 744
style: applyAll, flat vs compound (100 parents — the 14.6 partition)flat 10.7 ms10.9 ms 13.0 ms10.4 ms 61
style: applyAll, flat vs compound (100 parents — the 14.6 partition)compound 11.3 ms11.4 ms 13.8 ms10.9 ms 57
style: applyAll — constant vs state-case (the 57.1d partition)constant sheet 10.5 ms10.7 ms 11.5 ms10.3 ms 60
style: applyAll — constant vs state-case (the 57.1d partition)state-case sheet 10.6 ms10.8 ms 13.1 ms10.3 ms 59
style: applyAll — state-case vs data-case (what the partition avoids)state-case sheet 10.8 ms11.0 ms 13.0 ms10.5 ms 60
style: applyAll — state-case vs data-case (what the partition avoids)data-case sheet 14.3 ms14.5 ms 15.7 ms13.9 ms 42
style: select+unselect 256-band — constant vs state-case sheetconstant sheet (skips restyle) 6.77 µs6.81 µs 6.99 µs6.70 µs 20
style: select+unselect 256-band — constant vs state-case sheetpaint-only state sheet (round-61 diff path) 34.4 µs35.6 µs 62.5 µs32.7 µs 18358
style: select+unselect 256-band — constant vs state-case sheetstate-case sheet (all channels; full write) 573 µs605 µs 1.07 ms554 µs 1146
style: read one prop (color)v3 91.0 ns95.7 ns 172 ns81.0 ns 2078250
style: read one prop (color)gpu 61.3 ns67.8 ns 122 ns59.1 ns 2505
style: read one prop (width)v3 109 ns120 ns 521 ns98.0 ns 1938820
style: read one prop (width)gpu 51.6 ns56.4 ns 307 ns49.4 ns 3021
style: numericStylev3 98.0 ns105 ns 367 ns83.0 ns 2018194
style: numericStylegpu 49.0 ns52.0 ns 116 ns47.8 ns 3283
style: renderedStyle (one prop)v3 903 ns971 ns 1.96 µs851 ns 540257
style: renderedStyle (one prop)gpu 64.5 ns68.1 ns 214 ns61.4 ns 2511
style: whole-object style()v3 87.3 µs92.4 µs 182 µs83.9 µs 7532
style: whole-object style()gpu 14.0 µs15.4 µs 52.2 µs13.4 µs 43844
style: bypass set (ele.style name,value)v3 9.97 µs10.0 µs 10.1 µs9.68 µs 11
style: bypass set (ele.style name,value)gpu 3.15 µs3.44 µs 4.34 µs3.03 µs 43
style: bypass set + removeStyle round-tripv3 21.7 µs24.1 µs 48.6 µs20.8 µs 27716
style: bypass set + removeStyle round-tripgpu 5.00 µs5.25 µs 6.37 µs4.75 µs 28
style: select+unselect 256-band under the default sheet — bypass punch-outno bypasses (diff path; the O(0) gate row) 35.2 µs36.6 µs 68.7 µs34.1 µs 18163
style: select+unselect 256-band under the default sheet — bypass punch-out128 of 256 bypassed (punched out to merged writes) 343 µs359 µs 563 µs327 µs 1940
style: sheet swap (applyAll) — 0 vs 128 bypassesno bypasses 11.0 ms11.1 ms 12.8 ms10.7 ms 56
style: sheet swap (applyAll) — 0 vs 128 bypasses128 bypassed 11.5 ms11.7 ms 14.5 ms11.0 ms 53

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

style( 'background-color' ) (was #4 in the switch)
1.14×
style( 'border-width' ) (was #6 in the switch)
1.19×
style( 'text-wrap' ) (was #73 in the switch)
1.67×
style( 'text-max-width' ) (was #74 in the switch)
1.69×
style( 'taxi-radius' ) (was #142 in the switch)
1.22×
style( 'target-distance-from-node' ) (was #150 in the switch)
1.22×
whole-object style() (gpu-only: v3 returns a different shape) — gpu node
13.4 µs
whole-object style() (gpu-only: v3 returns a different shape) — gpu edge
14.5 µs
colour-valued vs numeric reads (the string build) — gpu background-color (colour)
70.2 ns
colour-valued vs numeric reads (the string build) — gpu border-color (colour)
74.0 ns
colour-valued vs numeric reads (the string build) — gpu border-width (number)
63.2 ns
colour-valued vs numeric reads (the string build) — gpu width (number)
59.6 ns
the getters that ride readProp — gpu numericStyle( width )
60.0 ns
the getters that ride readProp — gpu effectiveOpacity()
20.7 ns
the getters that ride readProp — gpu renderedStyle( width )
78.6 ns
10 ns100 ns1 µs10 µs100 µs
All stats (table view)
groupbenchp50avgp99minsamples
style( 'background-color' ) (was #4 in the switch)v3 59.6 ns61.0 ns 82.5 ns56.5 ns 2808
style( 'background-color' ) (was #4 in the switch)gpu 52.3 ns54.9 ns 95.5 ns49.8 ns 3105
style( 'border-width' ) (was #6 in the switch)v3 60.3 ns62.4 ns 97.5 ns58.5 ns 2745
style( 'border-width' ) (was #6 in the switch)gpu 50.6 ns51.8 ns 64.2 ns49.6 ns 3292
style( 'text-wrap' ) (was #73 in the switch)v3 61.3 ns64.1 ns 112 ns60.1 ns 2661
style( 'text-wrap' ) (was #73 in the switch)gpu 36.6 ns38.1 ns 65.3 ns35.6 ns 4499
style( 'text-max-width' ) (was #74 in the switch)v3 58.6 ns59.9 ns 77.8 ns57.1 ns 2853
style( 'text-max-width' ) (was #74 in the switch)gpu 34.6 ns35.7 ns 58.0 ns33.3 ns 4793
style( 'taxi-radius' ) (was #142 in the switch)v3 59.6 ns61.3 ns 79.6 ns57.8 ns 2801
style( 'taxi-radius' ) (was #142 in the switch)gpu 48.9 ns52.3 ns 75.6 ns47.4 ns 3253
style( 'target-distance-from-node' ) (was #150 in the switch)v3 59.5 ns61.0 ns 75.5 ns57.2 ns 2809
style( 'target-distance-from-node' ) (was #150 in the switch)gpu 48.7 ns50.2 ns 64.8 ns47.5 ns 3407
whole-object style() (gpu-only: v3 returns a different shape)gpu node 13.4 µs14.4 µs 33.9 µs12.7 µs 46925
whole-object style() (gpu-only: v3 returns a different shape)gpu edge 14.5 µs15.8 µs 40.6 µs13.8 µs 42830
colour-valued vs numeric reads (the string build)gpu background-color (colour) 70.2 ns72.0 ns 88.9 ns69.1 ns 2367
colour-valued vs numeric reads (the string build)gpu border-color (colour) 74.0 ns76.5 ns 115 ns73.2 ns 2234
colour-valued vs numeric reads (the string build)gpu border-width (number) 63.2 ns65.2 ns 82.8 ns61.9 ns 2618
colour-valued vs numeric reads (the string build)gpu width (number) 59.6 ns60.9 ns 77.9 ns57.7 ns 2802
the getters that ride readPropgpu numericStyle( width ) 60.0 ns61.4 ns 75.2 ns58.9 ns 2784
the getters that ride readPropgpu effectiveOpacity() 20.7 ns21.2 ns 32.9 ns19.8 ns 8071
the getters that ride readPropgpu renderedStyle( width ) 78.6 ns79.5 ns 90.0 ns77.0 ns 2149

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

load: init from the definition form (construct + dispose)
6.2×
load: v4 ingest forms (construct + dispose) — definition form
21.3 ms
load: v4 ingest forms (construct + dispose) — columnar form
12.5 ms
load: v4 ingest forms (construct + dispose) — wire buffer
12.1 ms
load: v4 ingest forms (construct + dispose) — def clone alone (control)
304 µs
load: conversion — toColumnarElements
708 µs
load: conversion — serializeElements (from columnar)
204 µs
load: conversion — serializeElements (from defs)
886 µs
load: conversion — deserializeElements
4.63 µs
load: export from a live graph — cy.serialize() (wire)
492 µs
load: export from a live graph — cy.json() (v4)
737 µs
load: cy.json()
2.7×
load: add a 256-node band (add + remove)
1.33×
load: add a 256-node band, v4 forms — definition form
2.61 ms
load: add a 256-node band, v4 forms — columnar form
2.28 ms
load: add a 256-node band, v4 forms — wire buffer
2.26 ms
1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
load: init from the definition form (construct + dispose)v3 132 ms143 ms 174 ms127 ms 12
load: init from the definition form (construct + dispose)gpu 21.3 ms23.3 ms 29.1 ms19.8 ms 25
load: v4 ingest forms (construct + dispose)definition form 21.3 ms21.9 ms 25.0 ms18.9 ms 28
load: v4 ingest forms (construct + dispose)columnar form 12.5 ms13.6 ms 24.9 ms12.1 ms 46
load: v4 ingest forms (construct + dispose)wire buffer 12.1 ms13.4 ms 24.4 ms11.7 ms 47
load: v4 ingest forms (construct + dispose)def clone alone (control) 304 µs640 µs 13.6 ms211 µs 1037
load: conversiontoColumnarElements 708 µs780 µs 1.43 ms700 µs 885
load: conversionserializeElements (from columnar) 204 µs379 µs 1.04 ms171 µs 1824
load: conversionserializeElements (from defs) 886 µs947 µs 1.87 ms861 µs 733
load: conversiondeserializeElements 4.63 µs4.38 µs 6.32 µs3.32 µs 30
load: export from a live graphcy.serialize() (wire) 492 µs563 µs 2.00 ms484 µs 1221
load: export from a live graphcy.json() (v4) 737 µs1.08 ms 6.54 ms704 µs 615
load: cy.json()v3 2.00 ms2.32 ms 5.24 ms1.94 ms 293
load: cy.json()gpu 742 µs823 µs 2.70 ms733 µs 845
load: add a 256-node band (add + remove)v3 3.58 ms4.25 ms 10.6 ms3.22 ms 155
load: add a 256-node band (add + remove)gpu 2.69 ms2.96 ms 7.24 ms2.13 ms 227
load: add a 256-node band, v4 formsdefinition form 2.61 ms2.64 ms 4.53 ms2.06 ms 259
load: add a 256-node band, v4 formscolumnar form 2.28 ms2.34 ms 2.99 ms1.88 ms 288
load: add a 256-node band, v4 formswire buffer 2.26 ms2.33 ms 3.03 ms1.88 ms 294

spatial N=2,000 · 37.6 sv4 (gpu) v3

pick: hit (the walk; one inside-test) — zoom 1
20.5 µ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
45.9 µs
pick: miss walk — exact vs 24 px touch halo (57.9) — padPx 24
44.3 µs
pick: shape inside-test, 2000 coincident misses — ellipse
87.5 µs
pick: shape inside-test, 2000 coincident misses — star
233 µs
pick: shape inside-test, 2000 coincident misses — round-hexagon
829 µs
pick: shape inside-test, 2000 coincident misses — barrel
689 µs
pick: shape inside-test, 2000 coincident misses — cut-rectangle
99.6 µs
pick: shape inside-test, 2000 coincident misses — polygon
228 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 1
827 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 2
811 µs
pick: background miss (full highWater walk) — gpu
45.4 µs
pick: label box in the scan (text-events) — text-events: no
45.2 µs
pick: label box in the scan (text-events) — text-events: yes
125 µs
box: elementsInBox by covered fraction — 10%
148 µs
box: elementsInBox by covered fraction — 50%
197 µs
box: elementsInBox by covered fraction — 100%
344 µs
box: label containment (boxSelectionIncludesLabels) — off
231 µs
box: label containment (boxSelectionIncludesLabels) — on
261 µs
box: overlap vs contain (straight edges) — contain
241 µs
box: overlap vs contain (straight edges) — overlap
473 µs
box: overlap vs contain (curved edges — the segment walk) — contain
1.24 ms
box: overlap vs contain (curved edges — the segment walk) — overlap
2.13 ms
bounds: whole-graph boundingBox()
6.0×
bounds: boundingBox, labels in vs out (v4) — includeLabels: true (default)
1.26 ms
bounds: boundingBox, labels in vs out (v4) — includeLabels: false
693 µs
bounds: cy.fit() (whole-graph scan)
31×
bounds: getFitViewport() (compute without committing)
32×
bounds: boundingBoxAt (v4 only) — gpu
2.71 ms
bounds: one node boundingBox()
1.62×
bounds: labelBoundingBox (v4 only) — gpu
419 ns
bounds: compound + taxi conservative scan (round 54, v4 only) — warm (curve bbs memoized)
74.4 µs
bounds: compound + taxi conservative scan (round 54, v4 only) — cold (geometry write per call)
148 µs
100 ns1 µs10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
pick: hit (the walk; one inside-test)zoom 1 20.5 µs21.2 µs 40.7 µs20.0 µs 32390
pick: hit (the walk; one inside-test)zoom 2 21.1 µs21.6 µs 21.9 µs20.8 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)exact 45.9 µs46.7 µs 49.7 µs45.5 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)padPx 24 44.3 µs46.1 µs 87.5 µs42.3 µs 15082
pick: shape inside-test, 2000 coincident missesellipse 87.5 µs91.4 µs 190 µs85.1 µs 7640
pick: shape inside-test, 2000 coincident missesstar 233 µs244 µs 436 µs225 µs 2858
pick: shape inside-test, 2000 coincident missesround-hexagon 829 µs851 µs 1.28 ms823 µs 821
pick: shape inside-test, 2000 coincident missesbarrel 689 µs712 µs 1.10 ms680 µs 978
pick: shape inside-test, 2000 coincident missescut-rectangle 99.6 µs103 µs 181 µs95.6 µs 6809
pick: shape inside-test, 2000 coincident missespolygon 228 µs238 µs 407 µs212 µs 2935
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 1 827 µs830 µs 1.08 ms787 µs 842
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 2 811 µs821 µs 989 µs785 µs 852
pick: background miss (full highWater walk)gpu 45.4 µs45.8 µs 46.0 µs45.0 µs 12
pick: label box in the scan (text-events)text-events: no 45.2 µs45.5 µs 45.9 µs44.9 µs 12
pick: label box in the scan (text-events)text-events: yes 125 µs129 µs 210 µs121 µs 5361
box: elementsInBox by covered fraction10% 148 µs153 µs 248 µs147 µs 4562
box: elementsInBox by covered fraction50% 197 µs201 µs 249 µs191 µs 3442
box: elementsInBox by covered fraction100% 344 µs356 µs 814 µs325 µs 1954
box: label containment (boxSelectionIncludesLabels)off 231 µs238 µs 353 µs227 µs 2929
box: label containment (boxSelectionIncludesLabels)on 261 µs270 µs 354 µs257 µs 2538
box: overlap vs contain (straight edges)contain 241 µs251 µs 603 µs235 µs 2778
box: overlap vs contain (straight edges)overlap 473 µs497 µs 882 µs409 µs 1404
box: overlap vs contain (curved edges — the segment walk)contain 1.24 ms1.26 ms 1.73 ms1.21 ms 554
box: overlap vs contain (curved edges — the segment walk)overlap 2.13 ms2.17 ms 2.89 ms2.04 ms 320
bounds: whole-graph boundingBox()v3 7.54 ms7.73 ms 9.14 ms7.16 ms 85
bounds: whole-graph boundingBox()gpu 1.26 ms1.29 ms 1.70 ms1.21 ms 537
bounds: boundingBox, labels in vs out (v4)includeLabels: true (default) 1.26 ms1.29 ms 1.87 ms1.21 ms 539
bounds: boundingBox, labels in vs out (v4)includeLabels: false 693 µs713 µs 1.08 ms667 µs 981
bounds: cy.fit() (whole-graph scan)v3 7.46 ms7.57 ms 8.46 ms7.23 ms 89
bounds: cy.fit() (whole-graph scan)gpu 237 µs245 µs 348 µs233 µs 2841
bounds: getFitViewport() (compute without committing)v3 7.40 ms7.60 ms 9.16 ms7.20 ms 88
bounds: getFitViewport() (compute without committing)gpu 233 µs241 µs 328 µs226 µs 2894
bounds: boundingBoxAt (v4 only)gpu 2.71 ms2.78 ms 3.62 ms2.65 ms 244
bounds: one node boundingBox()v3 1.61 µs1.63 µs 2.13 µs1.58 µs 100
bounds: one node boundingBox()gpu 996 ns1.01 µs 1.19 µs981 ns 161
bounds: labelBoundingBox (v4 only)gpu 419 ns450 ns 827 ns409 ns 371
bounds: compound + taxi conservative scan (round 54, v4 only)warm (curve bbs memoized) 74.4 µs78.0 µs 186 µs73.8 µs 8930
bounds: compound + taxi conservative scan (round 54, v4 only)cold (geometry write per call) 148 µs154 µs 299 µs141 µs 4537

data N=2,000 · 28.4 sv4 (gpu) v3

data: bulk write, numeric column
19×
data: bulk write, dictionary string column (4 values)
16×
data: bulk write, one new dictionary entry per pass
16×
data: bulk write, object column (plain-array fallback)
19×
data: removeData (whole collection)
7.2×
data: read one numeric key
1.35×
data: read one string key (dictionary decode)
1.31×
data: read the whole object
2.3×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })
13×
query: data comparison ([weight > 3] vs { gt })
12×
query: two keys AND-ed
12×
query: membership ([bucket in ...] vs { in })
17×
query: predicate function (both sides)
8.5×
query: structural, parents (:parent vs { parent: true })
34×
query: structural, childless (:childless vs { parent: false })
13×
query: structural, orphans (:orphan vs { child: false })
33×
10 ns100 ns1 µs10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
data: bulk write, numeric columnv3 1.64 ms1.68 ms 2.80 ms1.56 ms 399
data: bulk write, numeric columngpu 84.3 µs87.4 µs 129 µs80.9 µs 8001
data: bulk write, dictionary string column (4 values)v3 1.64 ms1.68 ms 2.25 ms1.60 ms 397
data: bulk write, dictionary string column (4 values)gpu 101 µs107 µs 312 µs94.8 µs 6520
data: bulk write, one new dictionary entry per passv3 1.65 ms1.73 ms 2.89 ms1.58 ms 395
data: bulk write, one new dictionary entry per passgpu 100 µs105 µs 179 µs96.4 µs 6683
data: bulk write, object column (plain-array fallback)v3 1.66 ms1.74 ms 2.98 ms1.61 ms 397
data: bulk write, object column (plain-array fallback)gpu 84.9 µs86.6 µs 117 µs81.0 µs 8079
data: removeData (whole collection)v3 2.42 ms2.49 ms 4.21 ms2.36 ms 275
data: removeData (whole collection)gpu 336 µs347 µs 592 µs326 µs 1971
data: read one numeric keyv3 38.5 ns40.1 ns 66.1 ns37.3 ns 4266
data: read one numeric keygpu 28.6 ns30.0 ns 43.1 ns27.8 ns 5695
data: read one string key (dictionary decode)v3 41.6 ns43.3 ns 82.9 ns40.3 ns 3969
data: read one string key (dictionary decode)gpu 31.7 ns32.9 ns 70.1 ns30.6 ns 5223
data: read the whole objectv3 48.0 ns49.2 ns 72.4 ns45.7 ns 3493
data: read the whole objectgpu 21.0 ns22.3 ns 43.5 ns20.2 ns 7639
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })v3 656 µs682 µs 1.14 ms637 µs 1023
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })gpu 52.0 µs56.1 µs 129 µs46.0 µs 12236
query: data comparison ([weight > 3] vs { gt })v3 758 µs779 µs 1.06 ms751 µs 893
query: data comparison ([weight > 3] vs { gt })gpu 61.7 µs71.0 µs 152 µs57.4 µs 9517
query: two keys AND-edv3 791 µs816 µs 1.31 ms770 µs 855
query: two keys AND-edgpu 68.5 µs70.9 µs 112 µs65.7 µs 9538
query: membership ([bucket in ...] vs { in })v3 1.11 ms1.15 ms 1.63 ms1.01 ms 604
query: membership ([bucket in ...] vs { in })gpu 66.6 µs70.8 µs 144 µs62.9 µs 9564
query: predicate function (both sides)v3 653 µs667 µs 914 µs637 µs 1047
query: predicate function (both sides)gpu 76.6 µs79.9 µs 150 µs75.3 µs 8714
query: structural, parents (:parent vs { parent: true })v3 532 µs541 µs 719 µs519 µs 1291
query: structural, parents (:parent vs { parent: true })gpu 15.5 µs17.6 µs 23.4 µs15.4 µs 12
query: structural, childless (:childless vs { parent: false })v3 802 µs823 µs 1.28 ms781 µs 847
query: structural, childless (:childless vs { parent: false })gpu 60.1 µs68.0 µs 185 µs56.5 µs 9861
query: structural, orphans (:orphan vs { child: false })v3 509 µs518 µs 730 µs496 µs 1348
query: structural, orphans (:orphan vs { child: false })gpu 15.5 µs16.7 µs 20.4 µs15.3 µs 12

events N=2,000 · 27.0 sv4 (gpu) v3

emit: position write, no listeners
24×
emit: 1 core listener
8.1×
emit: 1 element (ref-qualified) listener
7.3×
emit: delegated (v3 selector vs v4 predicate)
7.7×
emit: 10 core listeners
6.3×
emit: on() + off() round-trip
2.2×
emit: flat vs phased (compound bubbling, 14.5) — orphan (flat emit)
297 ns
emit: flat vs phased (compound bubbling, 14.5) — child of 2 ancestors (phased)
834 ns
emit: flat vs phased, no listeners — orphan (flat)
80.2 ns
emit: flat vs phased, no listeners — child (phased)
487 ns
anim: start + stop, one element
1.46×
anim: start against a running animation (round-21 eviction) — disjoint channels (composes)
1.35 µs
anim: start against a running animation (round-21 eviction) — overlapping channels (evicts)
839 ns
anim: start + stop, 512-node collection
3.0×
anim: delay() (no channels touched)
1.56×
anim: controls (v4 only) — pause + resume
449 ns
anim: controls (v4 only) — reverse
849 ns
anim: viewport animate + stop
2.8×
10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
emit: position write, no listenersv3 1.28 µs1.30 µs 1.48 µs1.24 µs 116
emit: position write, no listenersgpu 52.3 ns55.2 ns 122 ns49.6 ns 3088
emit: 1 core listenerv3 1.38 µs1.40 µs 1.58 µs1.35 µs 112
emit: 1 core listenergpu 171 ns181 ns 274 ns167 ns 890
emit: 1 element (ref-qualified) listenerv3 1.38 µs1.44 µs 2.19 µs1.34 µs 108
emit: 1 element (ref-qualified) listenergpu 189 ns205 ns 1.03 µs184 ns 788
emit: delegated (v3 selector vs v4 predicate)v3 1.46 µs1.52 µs 2.69 µs1.42 µs 107
emit: delegated (v3 selector vs v4 predicate)gpu 191 ns209 ns 893 ns186 ns 775
emit: 10 core listenersv3 1.92 µs1.93 µs 2.09 µs1.88 µs 80
emit: 10 core listenersgpu 304 ns306 ns 365 ns297 ns 500
emit: on() + off() round-tripv3 462 ns549 ns 1.45 µs427 ns 290
emit: on() + off() round-tripgpu 215 ns258 ns 886 ns182 ns 638
emit: flat vs phased (compound bubbling, 14.5)orphan (flat emit) 297 ns378 ns 2.88 µs276 ns 905069
emit: flat vs phased (compound bubbling, 14.5)child of 2 ancestors (phased) 834 ns858 ns 1.30 µs812 ns 178
emit: flat vs phased, no listenersorphan (flat) 80.2 ns87.2 ns 150 ns78.9 ns 1883
emit: flat vs phased, no listenerschild (phased) 487 ns528 ns 1.66 µs475 ns 315
anim: start + stop, one elementv3 923 ns1.28 µs 3.38 µs850 ns 402206
anim: start + stop, one elementgpu 634 ns1.05 µs 4.60 µs590 ns 464452
anim: start against a running animation (round-21 eviction)disjoint channels (composes) 1.35 µs1.93 µs 3.84 µs1.15 µs 78
anim: start against a running animation (round-21 eviction)overlapping channels (evicts) 839 ns1.46 µs 3.61 µs822 ns 106
anim: start + stop, 512-node collectionv3 296 µs422 µs 1.02 ms288 µs 1511
anim: start + stop, 512-node collectiongpu 98.4 µs112 µs 273 µs95.2 µs 5729
anim: delay() (no channels touched)v3 637 ns934 ns 3.20 µs619 ns 173
anim: delay() (no channels touched)gpu 408 ns708 ns 2.67 µs403 ns 226
anim: controls (v4 only)pause + resume 449 ns732 ns 2.57 µs444 ns 210
anim: controls (v4 only)reverse 849 ns1.47 µs 3.42 µs837 ns 104
anim: viewport animate + stopv3 545 ns809 ns 3.01 µs532 ns 196
anim: viewport animate + stopgpu 193 ns224 ns 1.43 µs191 ns 739

store N=2,000 · 20.9 s

id index: set x 2000 (build) — gpu
285 µs
id index: single-key operations — get (probe)
57.3 ns
id index: single-key operations — has
51.0 ns
id index: single-key operations — idAt (memoized hit)
8.97 ns
id index: single-key operations — hashAt
6.97 ns
id index: remove + re-set (churn, drives the round-11 reclaim) — gpu
235 ns
adjacency: rebuild (4000 edges, two counting passes) — gpu
56.8 µs
adjacency: reads — outDegree (O(1))
6.24 ns
adjacency: reads — outEdges
45.4 ns
adjacency: reads — connectedEdges
119 ns
adjacency: addEdge + removeEdge (the overlay path) — gpu
137 ns
blob: write x 2000 (build) — gpu
105 µs
blob: single-record operations — rewrite in place (same length)
29.9 ns
blob: single-record operations — offsetOf
4.24 ns
blob: single-record operations — free + rewrite
153 ns
dirty: mark (per-write span coalescing) — contiguous marks
12.8 ns
dirty: mark (per-write span coalescing) — scattered marks
17.7 ns
dirty: take (a frame's drain) — gpu
590 ns
images: registry bookkeeping — acquire (existing url)
204 ns
images: registry bookkeeping — acquire (new url) + release
534 ns
charts: sheet apply, chart vs no chart — no chart
10.4 ms
charts: sheet apply, chart vs no chart — pie from data (blob record per node)
11.0 ms
charts: data write refreshing chart-values — gpu
2.37 ms
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
id index: set x 2000 (build)gpu 285 µs298 µs 501 µs271 µs 2354
id index: single-key operationsget (probe) 57.3 ns60.4 ns 104 ns56.1 ns 2837
id index: single-key operationshas 51.0 ns52.8 ns 94.2 ns49.4 ns 3251
id index: single-key operationsidAt (memoized hit) 8.97 ns9.30 ns 17.8 ns8.66 ns 18262
id index: single-key operationshashAt 6.97 ns7.25 ns 14.3 ns6.89 ns 23370
id index: remove + re-set (churn, drives the round-11 reclaim)gpu 235 ns248 ns 378 ns225 ns 674
adjacency: rebuild (4000 edges, two counting passes)gpu 56.8 µs64.7 µs 230 µs54.9 µs 10741
adjacency: readsoutDegree (O(1)) 6.24 ns6.35 ns 10.5 ns5.83 ns 26713
adjacency: readsoutEdges 45.4 ns46.0 ns 60.0 ns43.0 ns 3715
adjacency: readsconnectedEdges 119 ns181 ns 2.15 µs114 ns 923
adjacency: addEdge + removeEdge (the overlay path)gpu 137 ns140 ns 208 ns130 ns 1218
blob: write x 2000 (build)gpu 105 µs127 µs 647 µs101 µs 5500
blob: single-record operationsrewrite in place (same length) 29.9 ns30.6 ns 43.1 ns28.9 ns 5604
blob: single-record operationsoffsetOf 4.24 ns4.36 ns 7.92 ns4.10 ns 38555
blob: single-record operationsfree + rewrite 153 ns174 ns 494 ns148 ns 981
dirty: mark (per-write span coalescing)contiguous marks 12.8 ns13.2 ns 24.5 ns12.3 ns 12851
dirty: mark (per-write span coalescing)scattered marks 17.7 ns18.2 ns 28.6 ns17.1 ns 9379
dirty: take (a frame's drain)gpu 590 ns694 ns 1.33 µs582 ns 237
images: registry bookkeepingacquire (existing url) 204 ns211 ns 271 ns203 ns 803
images: registry bookkeepingacquire (new url) + release 534 ns602 ns 2.64 µs522 ns 273
charts: sheet apply, chart vs no chartno chart 10.4 ms10.5 ms 13.1 ms10.1 ms 61
charts: sheet apply, chart vs no chartpie from data (blob record per node) 11.0 ms11.1 ms 12.0 ms10.5 ms 59
charts: data write refreshing chart-valuesgpu 2.37 ms2.44 ms 3.54 ms2.32 ms 282

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

viewport: zoom() get
4.6×
viewport: zoom( n ) set
1.99×
viewport: pan() get
1.08×
viewport: pan( p ) set
1.84×
viewport: panBy()
1.70×
viewport: extent()
1.52×
viewport: renderedExtent()
1.65×
viewport: width() + height() + size() (3 calls)
3.9×
viewport: minZoom/maxZoom get (2 calls)
15×
viewport: center( eles )
19×
viewport: reset()
109×
viewport: viewport({ zoom, pan })
61×
viewport: getCenterPan( eles ) — gpu
6.31 µs
core: instanceString + headless + styleEnabled (3 calls)
1.27×
core: hasElementWithId + hasCompoundNodes (2 calls)
1.36×
core: options()
84×
core: mutableElements() (v4 materializes; v3 is O(1))
1.36×
core: gating getters (5 calls)
1.14×
core: gating setters round-trip (autolock/autoungrabify/autounselectify)
1.87×
core: interaction tuning getters (5 calls) — gpu
7.30 ns
core: graph data() set + get (v3 restyles the graph)
8273×
core: graph scratch() set + get (v3 restyles the graph)
17043×
core: batch( fn ) (empty)
6.5×
core: startBatch + endBatch + batching
5.8×
core: collection()
7.3×
core: compact() (no dead slots — the early-out) — gpu
16.9 µs
collection: element accessors (id/group/isNode/isEdge, 4 calls)
1.75×
collection: length + empty + nonempty (3 calls)
4.6×
collection: eq/first/last (3 calls)
1.85×
collection: slice()
2.2×
collection: toArray()
12×
collection: sort( fn )
1.60×
collection: reduce( fn )
1.40×
collection: min + max ( fn ) (2 calls)
1.96×
collection: some + every (2 calls)
1.61×
collection: same + anySame + contains (3 calls)
75×
collection: allAre (all match: the full walk)
1.47×
collection: is (none match: the full walk)
2.5×
collection: union
6.3×
collection: intersection
28×
collection: difference
28×
collection: symmetricDifference
3.8×
collection: absoluteComplement
13×
collection: byGroup
2.7×
collection: diff
3.2×
collection: indexOf
1.29×
traversal: openNeighborhood + closedNeighborhood (2 calls)
2.8×
traversal: connectedNodes
3.3×
traversal: sources + targets (2 calls)
3.3×
traversal: source() + target() (2 calls)
1.27×
traversal: edgesWith
1.25×
traversal: edgesTo
1.24×
traversal: parallelEdges + codirectedEdges (2 calls)
3.1×
traversal: roots + leaves (2 calls)
15×
traversal: allAreNeighbors
5.0×
traversal: isLoop + isSimple (2 calls)
2.5×
degree: indegree + outdegree (2 calls)
70×
degree: minDegree + maxDegree (2 calls)
40×
degree: minIndegree + maxOutdegree (2 calls)
21×
dimensions: renderedPosition get
2.2×
dimensions: relativePosition get
11×
dimensions: width + height + outerWidth + outerHeight (4 calls)
2.6×
dimensions: rendered dims (4 calls)
2.9×
dimensions: renderedBoundingBox
1.86×
dimensions: midpoint + renderedMidpoint (2 calls) — gpu
1.22 µs
dimensions: source/targetEndpoint (2 calls) — gpu
405 ns
dimensions: rendered source/targetEndpoint (2 calls) — gpu
421 ns
dimensions: shift + silentShift (round-trip)
62×
dimensions: silentPosition
15×
dimensions: positions( fn ) over 100
57×
dimensions: padding + paddedWidth + paddedHeight (3 calls)
13×
curves: isBundledBezier — gpu
24.9 ns
curves: controlPoints + renderedControlPoints (2 calls) — gpu
545 ns
curves: segmentPoints (undefined for bezier) — gpu
41.9 ns
compound: parent + parents + ancestors (3 calls)
3.5×
compound: children + descendants + siblings (3 calls)
4.9×
compound: orphans + nonorphans (2 calls)
7.0×
compound: commonAncestors
128×
compound: isParent/isChild/isChildless/isOrphan (4 calls)
1.56×
flags: select + unselect + selected (band)
16×
flags: selectify + unselectify + selectable
96×
flags: lock + unlock + locked
94×
flags: grabify + ungrabify + grabbable
96×
flags: show + hide + visible
208×
flags: active/activate/unactivate (3 calls)
15×
flags: panify + unpanify + pannable
97×
flags: takesUpSpace + interactive + transparent (3 calls)
2.7×
flags: effectiveOpacity
2.6×
element data: scratch get + set
7.8×
element data: json() one element
2.2×
element data: jsons() over 100
1.75×
element data: label() — gpu
15.6 ns
core: batchData()
8.6×
core: animated()
4.9×
core: zoomRange get — gpu
2.16 ns
core: forceRender() (headless no-op)
16×
core: resize() / invalidateSize()
2.5×
core: onRender + offRender
2.3×
core: removeScratch()
9536×
core: selectionType get
1.99×
core: isReady()
2.2×
core: window()
2.8×
core: container()
2.6×
core: destroyed()
2.2×
core: removeAllListeners()
8.7×
collection: cy()
3.6×
collection: indexOfId()
1.63×
collection: removed() + inside() (2 calls)
1.17×
collection: silentPositions( fn ) over 100
34×
collection: animated()
2.9×
collection: delayAnimation()
2.8×
collection: removeScratch()
9.6×
collection: component()
42×
collection: layoutDimensions()
3.1×
degree: maxIndegree + minOutdegree (2 calls)
24×
flags: grabbed + hidden + inactive (3 calls)
2.1×
curves: renderedSegmentPoints — gpu
36.7 ns
layout contract: edgeSlots + endpoints + degreeOf — gpu
35.3 µs
formats: isColumnarElements + isSerializedElements + isPackedIds — gpu
4.71 ns
0.100 ns1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
viewport: zoom() getv3 5.58 ns5.72 ns 11.1 ns5.39 ns 29442
viewport: zoom() getgpu 1.21 ns1.24 ns 2.24 ns1.18 ns 128276
viewport: zoom( n ) setv3 639 ns644 ns 696 ns615 ns 257
viewport: zoom( n ) setgpu 321 ns347 ns 789 ns312 ns 480
viewport: pan() getv3 5.27 ns5.41 ns 10.4 ns5.06 ns 31157
viewport: pan() getgpu 4.86 ns5.07 ns 12.4 ns4.75 ns 33253
viewport: pan( p ) setv3 635 ns660 ns 1.19 µs618 ns 254
viewport: pan( p ) setgpu 345 ns355 ns 536 ns324 ns 466
viewport: panBy()v3 602 ns609 ns 684 ns588 ns 273
viewport: panBy()gpu 354 ns365 ns 723 ns322 ns 461
viewport: extent()v3 29.6 ns44.2 ns 201 ns28.3 ns 3832
viewport: extent()gpu 19.4 ns26.3 ns 109 ns18.2 ns 6377
viewport: renderedExtent()v3 27.0 ns28.5 ns 50.7 ns25.6 ns 5943
viewport: renderedExtent()gpu 16.3 ns22.2 ns 98.4 ns15.1 ns 7588
viewport: width() + height() + size() (3 calls)v3 21.7 ns22.7 ns 45.4 ns20.8 ns 7461
viewport: width() + height() + size() (3 calls)gpu 5.55 ns5.87 ns 12.8 ns5.30 ns 28635
viewport: minZoom/maxZoom get (2 calls)v3 14.6 ns15.2 ns 25.2 ns14.0 ns 11207
viewport: minZoom/maxZoom get (2 calls)gpu 0.999 ns1.03 ns 1.42 ns0.977 ns 151707
viewport: center( eles )v3 117 µs122 µs 191 µs113 µs 5729
viewport: center( eles )gpu 6.20 µs6.20 µs 6.29 µs6.10 µs 23
viewport: reset()v3 974 ns1.07 µs 1.65 µs946 ns 156
viewport: reset()gpu 8.91 ns9.26 ns 15.9 ns8.56 ns 18224
viewport: viewport({ zoom, pan })v3 970 ns1.06 µs 1.61 µs948 ns 157
viewport: viewport({ zoom, pan })gpu 15.8 ns16.8 ns 37.3 ns14.9 ns 10108
viewport: getCenterPan( eles )gpu 6.31 µs6.35 µs 6.59 µs6.22 µs 23
core: instanceString + headless + styleEnabled (3 calls)v3 32.8 ns34.2 ns 68.4 ns31.5 ns 4983
core: instanceString + headless + styleEnabled (3 calls)gpu 25.8 ns27.2 ns 53.4 ns24.9 ns 6268
core: hasElementWithId + hasCompoundNodes (2 calls)v3 42.7 ns44.2 ns 85.5 ns42.6 ns 3879
core: hasElementWithId + hasCompoundNodes (2 calls)gpu 31.5 ns33.5 ns 67.8 ns30.7 ns 5097
core: options()v3 89.8 ns93.9 ns 191 ns86.7 ns 1818
core: options()gpu 1.07 ns1.18 ns 2.24 ns1.03 ns 134854
core: mutableElements() (v4 materializes; v3 is O(1))v3 3.19 ns3.27 ns 6.49 ns3.07 ns 50177
core: mutableElements() (v4 materializes; v3 is O(1))gpu 2.35 ns2.40 ns 3.44 ns2.20 ns 69028
core: gating getters (5 calls)v3 15.6 ns16.2 ns 25.8 ns15.1 ns 10583
core: gating getters (5 calls)gpu 13.8 ns14.5 ns 34.4 ns12.5 ns 11787
core: gating setters round-trip (autolock/autoungrabify/autounselectify)v3 11.2 ns11.5 ns 18.6 ns10.5 ns 14849
core: gating setters round-trip (autolock/autoungrabify/autounselectify)gpu 6.00 ns6.18 ns 13.3 ns5.74 ns 27342
core: interaction tuning getters (5 calls)gpu 7.30 ns7.60 ns 16.0 ns7.00 ns 22356
core: graph data() set + get (v3 restyles the graph)v3 2.81 ms2.87 ms 3.79 ms2.68 ms 239
core: graph data() set + get (v3 restyles the graph)gpu 340 ns347 ns 470 ns338 ns 488
core: graph scratch() set + get (v3 restyles the graph)v3 2.83 ms2.93 ms 3.90 ms2.79 ms 235
core: graph scratch() set + get (v3 restyles the graph)gpu 166 ns170 ns 226 ns162 ns 1006
core: batch( fn ) (empty)v3 542 ns646 ns 1.51 µs521 ns 260
core: batch( fn ) (empty)gpu 82.9 ns86.9 ns 143 ns81.5 ns 1953
core: startBatch + endBatch + batchingv3 523 ns628 ns 1.63 µs509 ns 268
core: startBatch + endBatch + batchinggpu 89.7 ns165 ns 2.90 µs86.5 ns 998
core: collection()v3 452 ns531 ns 1.51 µs445 ns 317
core: collection()gpu 62.0 ns65.4 ns 108 ns60.4 ns 2597
core: compact() (no dead slots — the early-out)gpu 16.9 µs21.8 µs 99.1 µs16.4 µs 31360
collection: element accessors (id/group/isNode/isEdge, 4 calls)v3 60.6 ns64.4 ns 196 ns56.4 ns 2644
collection: element accessors (id/group/isNode/isEdge, 4 calls)gpu 34.6 ns36.1 ns 68.6 ns33.6 ns 4722
collection: length + empty + nonempty (3 calls)v3 6.78 ns6.98 ns 13.1 ns6.47 ns 24270
collection: length + empty + nonempty (3 calls)gpu 1.47 ns1.52 ns 1.90 ns1.44 ns 107177
collection: eq/first/last (3 calls)v3 15.3 ns15.6 ns 23.5 ns14.8 ns 10946
collection: eq/first/last (3 calls)gpu 8.24 ns8.46 ns 14.7 ns7.93 ns 20072
collection: slice()v3 3.81 µs3.92 µs 4.29 µs3.69 µs 39
collection: slice()gpu 1.73 µs1.74 µs 1.96 µs1.67 µs 93
collection: toArray()v3 8.85 µs8.96 µs 9.06 µs8.63 µs 15
collection: toArray()gpu 759 ns774 ns 903 ns734 ns 211
collection: sort( fn )v3 14.5 µs14.9 µs 15.1 µs14.0 µs 12
collection: sort( fn )gpu 9.08 µs9.10 µs 9.17 µs9.02 µs 15
collection: reduce( fn )v3 157 ns160 ns 194 ns120 ns 1065
collection: reduce( fn )gpu 112 ns114 ns 133 ns109 ns 1500
collection: min + max ( fn ) (2 calls)v3 11.0 µs11.1 µs 11.4 µs10.9 µs 12
collection: min + max ( fn ) (2 calls)gpu 5.64 µs5.73 µs 6.59 µs5.57 µs 25
collection: some + every (2 calls)v3 894 ns922 ns 1.58 µs871 ns 180
collection: some + every (2 calls)gpu 557 ns560 ns 613 ns539 ns 303
collection: same + anySame + contains (3 calls)v3 7.50 µs7.53 µs 7.76 µs7.40 µs 19
collection: same + anySame + contains (3 calls)gpu 99.5 ns102 ns 128 ns95.5 ns 1686
collection: allAre (all match: the full walk)v3 3.63 µs3.62 µs 3.96 µs3.35 µs 43
collection: allAre (all match: the full walk)gpu 2.48 µs2.48 µs 2.84 µs2.34 µs 64
collection: is (none match: the full walk)v3 5.73 µs5.75 µs 6.17 µs5.45 µs 26
collection: is (none match: the full walk)gpu 2.29 µs2.33 µs 2.79 µs2.23 µs 67
collection: unionv3 95.4 µs105 µs 184 µs93.4 µs 6601
collection: uniongpu 15.1 µs15.3 µs 15.7 µs14.7 µs 12
collection: intersectionv3 92.5 µs103 µs 164 µs90.2 µs 6717
collection: intersectiongpu 3.31 µs3.34 µs 3.65 µs3.24 µs 46
collection: differencev3 92.6 µs103 µs 168 µs88.8 µs 6714
collection: differencegpu 3.27 µs3.28 µs 3.44 µs3.18 µs 47
collection: symmetricDifferencev3 25.4 µs25.9 µs 27.0 µs24.7 µs 12
collection: symmetricDifferencegpu 6.76 µs6.75 µs 6.83 µs6.64 µs 21
collection: absoluteComplementv3 6.19 ms6.77 ms 10.6 ms5.95 ms 99
collection: absoluteComplementgpu 462 µs475 µs 769 µs452 µs 1473
collection: byGroupv3 998 µs1.02 ms 1.52 ms972 µs 682
collection: byGroupgpu 375 µs386 µs 626 µs365 µs 1810
collection: diffv3 37.6 µs38.4 µs 41.4 µs35.7 µs 12
collection: diffgpu 11.8 µs11.7 µs 12.2 µs10.2 µs 11
collection: indexOfv3 29.9 ns31.1 ns 52.1 ns28.5 ns 5484
collection: indexOfgpu 23.2 ns24.0 ns 38.3 ns22.1 ns 7131
traversal: openNeighborhood + closedNeighborhood (2 calls)v3 9.24 µs9.42 µs 9.74 µs8.74 µs 14
traversal: openNeighborhood + closedNeighborhood (2 calls)gpu 3.25 µs3.33 µs 3.72 µs3.13 µs 47
traversal: connectedNodesv3 979 ns1.06 µs 1.84 µs925 ns 156
traversal: connectedNodesgpu 298 ns306 ns 401 ns288 ns 542
traversal: sources + targets (2 calls)v3 1.73 µs1.90 µs 2.78 µs1.67 µs 86
traversal: sources + targets (2 calls)gpu 525 ns680 ns 2.13 µs501 ns 242
traversal: source() + target() (2 calls)v3 72.6 ns74.6 ns 101 ns60.8 ns 2304
traversal: source() + target() (2 calls)gpu 57.0 ns59.1 ns 79.5 ns54.5 ns 2895
traversal: edgesWithv3 71.2 µs73.2 µs 112 µs68.8 µs 9518
traversal: edgesWithgpu 57.1 µs62.2 µs 120 µs55.4 µs 11117
traversal: edgesTov3 72.7 µs74.8 µs 128 µs71.5 µs 9322
traversal: edgesTogpu 58.7 µs59.5 µs 62.9 µs57.4 µs 12
traversal: parallelEdges + codirectedEdges (2 calls)v3 3.52 µs3.79 µs 4.55 µs3.36 µs 41
traversal: parallelEdges + codirectedEdges (2 calls)gpu 1.15 µs1.29 µs 1.85 µs1.12 µs 127
traversal: roots + leaves (2 calls)v3 4.99 ms5.35 ms 8.68 ms4.88 ms 127
traversal: roots + leaves (2 calls)gpu 342 µs347 µs 397 µs337 µs 2024
traversal: allAreNeighborsv3 195 µs210 µs 312 µs189 µs 3312
traversal: allAreNeighborsgpu 38.7 µs39.7 µs 41.9 µs38.3 µs 12
traversal: isLoop + isSimple (2 calls)v3 127 ns129 ns 148 ns123 ns 1326
traversal: isLoop + isSimple (2 calls)gpu 51.2 ns52.4 ns 65.1 ns50.3 ns 3265
degree: indegree + outdegree (2 calls)v3 3.52 µs3.77 µs 4.53 µs3.40 µs 41
degree: indegree + outdegree (2 calls)gpu 50.1 ns53.9 ns 110 ns49.3 ns 3171
degree: minDegree + maxDegree (2 calls)v3 17.9 ms17.8 ms 21.9 ms15.5 ms 35
degree: minDegree + maxDegree (2 calls)gpu 443 µs457 µs 671 µs436 µs 1530
degree: minIndegree + maxOutdegree (2 calls)v3 9.16 ms9.89 ms 13.4 ms8.85 ms 67
degree: minIndegree + maxOutdegree (2 calls)gpu 426 µs448 µs 872 µs410 µs 1562
dimensions: renderedPosition getv3 67.2 ns69.6 ns 115 ns64.1 ns 2424
dimensions: renderedPosition getgpu 29.9 ns33.4 ns 100 ns28.8 ns 5040
dimensions: relativePosition getv3 838 ns847 ns 975 ns816 ns 197
dimensions: relativePosition getgpu 73.6 ns78.5 ns 138 ns71.0 ns 2154
dimensions: width + height + outerWidth + outerHeight (4 calls)v3 604 ns608 ns 661 ns590 ns 278
dimensions: width + height + outerWidth + outerHeight (4 calls)gpu 232 ns239 ns 312 ns228 ns 712
dimensions: rendered dims (4 calls)v3 700 ns705 ns 794 ns669 ns 240
dimensions: rendered dims (4 calls)gpu 245 ns248 ns 335 ns234 ns 690
dimensions: renderedBoundingBoxv3 1.73 µs1.76 µs 2.25 µs1.66 µs 93
dimensions: renderedBoundingBoxgpu 933 ns953 ns 1.33 µs894 ns 175
dimensions: midpoint + renderedMidpoint (2 calls)gpu 1.22 µs1.24 µs 1.43 µs1.19 µs 130
dimensions: source/targetEndpoint (2 calls)gpu 405 ns415 ns 518 ns397 ns 409
dimensions: rendered source/targetEndpoint (2 calls)gpu 421 ns431 ns 572 ns407 ns 394
dimensions: shift + silentShift (round-trip)v3 293 µs311 µs 591 µs282 µs 2242
dimensions: shift + silentShift (round-trip)gpu 4.77 µs4.79 µs 4.89 µs4.71 µs 32
dimensions: silentPositionv3 868 ns871 ns 932 ns847 ns 192
dimensions: silentPositiongpu 56.6 ns58.0 ns 84.1 ns54.2 ns 2919
dimensions: positions( fn ) over 100v3 175 µs180 µs 255 µs172 µs 3876
dimensions: positions( fn ) over 100gpu 3.05 µs3.12 µs 3.34 µs2.99 µs 51
dimensions: padding + paddedWidth + paddedHeight (3 calls)v3 2.02 µs2.04 µs 2.31 µs1.98 µs 80
dimensions: padding + paddedWidth + paddedHeight (3 calls)gpu 160 ns164 ns 210 ns157 ns 1039
curves: isBundledBeziergpu 24.9 ns25.7 ns 38.5 ns21.2 ns 6618
curves: controlPoints + renderedControlPoints (2 calls)gpu 545 ns555 ns 729 ns533 ns 298
curves: segmentPoints (undefined for bezier)gpu 41.9 ns42.7 ns 53.5 ns35.7 ns 4002
compound: parent + parents + ancestors (3 calls)v3 2.89 µs3.26 µs 4.13 µs2.81 µs 48
compound: parent + parents + ancestors (3 calls)gpu 821 ns1.07 µs 2.13 µs779 ns 153
compound: children + descendants + siblings (3 calls)v3 9.05 µs9.14 µs 9.88 µs8.35 µs 15
compound: children + descendants + siblings (3 calls)gpu 1.83 µs2.24 µs 3.44 µs1.75 µs 72
compound: orphans + nonorphans (2 calls)v3 3.71 µs4.01 µs 4.81 µs3.58 µs 38
compound: orphans + nonorphans (2 calls)gpu 531 ns688 ns 2.64 µs517 ns 238
compound: commonAncestorsv3 9.50 µs9.62 µs 10.1 µs9.10 µs 14
compound: commonAncestorsgpu 74.5 ns76.8 ns 117 ns72.0 ns 2175
compound: isParent/isChild/isChildless/isOrphan (4 calls)v3 70.5 ns73.1 ns 136 ns60.6 ns 2338
compound: isParent/isChild/isChildless/isOrphan (4 calls)gpu 45.2 ns47.0 ns 74.3 ns44.0 ns 3643
flags: select + unselect + selected (band)v3 197 µs204 µs 367 µs192 µs 3423
flags: select + unselect + selected (band)gpu 12.3 µs12.3 µs 12.5 µs12.2 µs 10
flags: selectify + unselectify + selectablev3 197 µs203 µs 315 µs192 µs 3443
flags: selectify + unselectify + selectablegpu 2.06 µs2.07 µs 2.16 µs2.01 µs 79
flags: lock + unlock + lockedv3 195 µs204 µs 440 µs188 µs 3426
flags: lock + unlock + lockedgpu 2.06 µs2.07 µs 2.26 µs1.99 µs 79
flags: grabify + ungrabify + grabbablev3 199 µs210 µs 449 µs193 µs 3322
flags: grabify + ungrabify + grabbablegpu 2.08 µs2.10 µs 2.33 µs2.01 µs 78
flags: show + hide + visiblev3 2.61 ms2.83 ms 4.64 ms2.54 ms 243
flags: show + hide + visiblegpu 12.5 µs12.8 µs 13.3 µs12.4 µs 9
flags: active/activate/unactivate (3 calls)v3 200 µs210 µs 396 µs194 µs 3330
flags: active/activate/unactivate (3 calls)gpu 13.3 µs13.4 µs 13.7 µs13.2 µs 9
flags: panify + unpanify + pannablev3 199 µs211 µs 400 µs192 µs 3309
flags: panify + unpanify + pannablegpu 2.05 µs2.14 µs 2.58 µs2.04 µs 76
flags: takesUpSpace + interactive + transparent (3 calls)v3 199 ns207 ns 354 ns198 ns 825
flags: takesUpSpace + interactive + transparent (3 calls)gpu 72.9 ns77.4 ns 143 ns71.4 ns 2208
flags: effectiveOpacityv3 55.2 ns57.7 ns 129 ns52.8 ns 2970
flags: effectiveOpacitygpu 21.6 ns23.6 ns 47.6 ns21.0 ns 7237
element data: scratch get + setv3 1.37 µs1.50 µs 3.08 µs1.32 µs 109
element data: scratch get + setgpu 175 ns194 ns 339 ns174 ns 876
element data: json() one elementv3 311 ns428 ns 3.70 µs296 ns 380
element data: json() one elementgpu 141 ns189 ns 535 ns139 ns 846
element data: jsons() over 100v3 43.1 µs43.6 µs 46.9 µs39.5 µs 12
element data: jsons() over 100gpu 24.6 µs23.9 µs 29.8 µs16.0 µs 12
element data: label()gpu 15.6 ns17.8 ns 34.0 ns14.9 ns 9619
core: batchData()v3 2.43 µs2.55 µs 2.97 µs2.36 µs 62
core: batchData()gpu 282 ns376 ns 2.22 µs280 ns 438
core: animated()v3 7.69 ns8.05 ns 15.1 ns7.52 ns 21048
core: animated()gpu 1.56 ns1.62 ns 2.65 ns1.56 ns 101003
core: zoomRange getgpu 2.16 ns2.36 ns 6.30 ns2.05 ns 70472
core: forceRender() (headless no-op)v3 23.8 ns24.5 ns 42.0 ns23.5 ns 6993
core: forceRender() (headless no-op)gpu 1.51 ns1.56 ns 2.35 ns1.51 ns 105153
core: resize() / invalidateSize()v3 333 ns345 ns 473 ns330 ns 492
core: resize() / invalidateSize()gpu 135 ns142 ns 211 ns133 ns 1196
core: onRender + offRenderv3 451 ns476 ns 779 ns446 ns 352
core: onRender + offRendergpu 193 ns238 ns 730 ns190 ns 692
core: removeScratch()v3 2.82 ms2.94 ms 4.07 ms2.75 ms 233
core: removeScratch()gpu 296 ns311 ns 646 ns277 ns 546
core: selectionType getv3 4.60 ns4.96 ns 9.93 ns4.44 ns 34109
core: selectionType getgpu 2.31 ns2.37 ns 3.62 ns2.15 ns 70216
core: isReady()v3 3.32 ns3.47 ns 6.34 ns3.32 ns 48405
core: isReady()gpu 1.51 ns1.55 ns 2.07 ns1.48 ns 105607
core: window()v3 4.19 ns4.32 ns 6.18 ns4.18 ns 38914
core: window()gpu 1.51 ns1.56 ns 2.32 ns1.51 ns 105224
core: container()v3 3.96 ns4.10 ns 6.12 ns3.82 ns 41065
core: container()gpu 1.51 ns1.56 ns 2.36 ns1.51 ns 105230
core: destroyed()v3 3.33 ns3.43 ns 4.61 ns3.32 ns 48877
core: destroyed()gpu 1.51 ns1.56 ns 2.66 ns1.48 ns 105018
core: removeAllListeners()v3 14.1 ns15.6 ns 56.8 ns13.5 ns 10929
core: removeAllListeners()gpu 1.62 ns1.71 ns 3.15 ns1.59 ns 95713
collection: cy()v3 7.85 ns9.42 ns 25.0 ns7.48 ns 18071
collection: cy()gpu 2.20 ns2.58 ns 6.33 ns2.15 ns 64625
collection: indexOfId()v3 60.3 ns62.8 ns 106 ns59.3 ns 2720
collection: indexOfId()gpu 36.9 ns38.0 ns 57.3 ns35.6 ns 4473
collection: removed() + inside() (2 calls)v3 18.1 ns19.3 ns 34.4 ns17.4 ns 8835
collection: removed() + inside() (2 calls)gpu 15.4 ns16.2 ns 32.4 ns15.2 ns 10523
collection: silentPositions( fn ) over 100v3 110 µs118 µs 264 µs107 µs 5887
collection: silentPositions( fn ) over 100gpu 3.22 µs3.41 µs 4.51 µs3.07 µs 45
collection: animated()v3 12.4 ns12.6 ns 16.9 ns12.2 ns 13483
collection: animated()gpu 4.30 ns4.80 ns 10.6 ns4.17 ns 35201
collection: delayAnimation()v3 453 ns607 ns 2.07 µs450 ns 273
collection: delayAnimation()gpu 164 ns171 ns 302 ns161 ns 981
collection: removeScratch()v3 1.97 µs2.05 µs 3.34 µs1.88 µs 77
collection: removeScratch()gpu 205 ns212 ns 346 ns200 ns 804
collection: component()v3 83.8 ms86.9 ms 98.7 ms78.1 ms 12
collection: component()gpu 2.02 ms2.18 ms 3.67 ms1.98 ms 310
collection: layoutDimensions()v3 621 ns636 ns 836 ns619 ns 264
collection: layoutDimensions()gpu 203 ns212 ns 351 ns195 ns 801
degree: maxIndegree + minOutdegree (2 calls)v3 10.5 ms11.0 ms 15.9 ms9.26 ms 60
degree: maxIndegree + minOutdegree (2 calls)gpu 436 µs481 µs 853 µs421 µs 1455
flags: grabbed + hidden + inactive (3 calls)v3 87.3 ns89.9 ns 129 ns80.9 ns 1902
flags: grabbed + hidden + inactive (3 calls)gpu 42.2 ns43.5 ns 64.8 ns40.5 ns 3941
curves: renderedSegmentPointsgpu 36.7 ns38.2 ns 83.8 ns36.0 ns 4479
layout contract: edgeSlots + endpoints + degreeOfgpu 35.3 µs40.0 µs 67.0 µs30.2 µs 17186
formats: isColumnarElements + isSerializedElements + isPackedIdsgpu 4.71 ns5.39 ns 9.39 ns4.70 ns 31406

compaction N=20,000 · 19.0 s

cpu pick: background miss (full highWater walk) — peak
227 µs
cpu pick: background miss (full highWater walk) — compacted
51.4 µs
cpu pick: node hit — peak
226 µs
cpu pick: node hit — compacted
51.2 µs
isCurrent: current ref (forwards present vs absent) — no forwards (peak)
6.08 ns
isCurrent: current ref (forwards present vs absent) — forwards present (compacted)
4.60 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — current (baseline alloc)
9.17 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — stale → repair
46.2 ns
control: nodes({ selected }) scan (order-list, expected parity) — peak
23.6 µs
control: nodes({ selected }) scan (order-list, expected parity) — compacted
23.4 µs
control: whole-graph boundingBox (expected parity) — peak
117 µs
control: whole-graph boundingBox (expected parity) — compacted
114 µs
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
cpu pick: background miss (full highWater walk)peak 227 µs259 µs 478 µs226 µs 2710
cpu pick: background miss (full highWater walk)compacted 51.4 µs51.9 µs 53.3 µs50.8 µs 12
cpu pick: node hitpeak 226 µs234 µs 391 µs225 µs 2995
cpu pick: node hitcompacted 51.2 µs52.4 µs 55.5 µs50.8 µs 12
isCurrent: current ref (forwards present vs absent)no forwards (peak) 6.08 ns6.69 ns 14.4 ns5.86 ns 25233
isCurrent: current ref (forwards present vs absent)forwards present (compacted) 4.60 ns5.24 ns 11.9 ns4.53 ns 31988
isCurrent: stale-ref repair (chase + rewrite, alloc included)current (baseline alloc) 9.17 ns12.0 ns 37.5 ns8.56 ns 13934
isCurrent: stale-ref repair (chase + rewrite, alloc included)stale → repair 46.2 ns49.0 ns 106 ns44.6 ns 3471
control: nodes({ selected }) scan (order-list, expected parity)peak 23.6 µs27.4 µs 35.4 µs22.1 µs 12
control: nodes({ selected }) scan (order-list, expected parity)compacted 23.4 µs25.3 µs 30.4 µs21.5 µs 12
control: whole-graph boundingBox (expected parity)peak 117 µs129 µs 263 µs114 µs 5416
control: whole-graph boundingBox (expected parity)compacted 114 µs116 µs 176 µs111 µs 6019

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

parent drag (shift subtree + bb settle)
186×
child drag (move + parent re-derive)
51×
reparent round-trip
74×
1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
parent drag (shift subtree + bb settle)v3 267 µs305 µs 817 µs254 µs 2280
parent drag (shift subtree + bb settle)gpu 1.44 µs1.45 µs 1.62 µs1.38 µs 108
child drag (move + parent re-derive)v3 83.1 µs91.6 µs 163 µs79.2 µs 7470
child drag (move + parent re-derive)gpu 1.62 µs1.66 µs 2.02 µs1.59 µs 96
reparent round-tripv3 84.9 µs104 µs 249 µs81.6 µs 6628
reparent round-tripgpu 1.15 µs1.18 µs 1.56 µs1.10 µs 135

curves N=2,000 · 0.7 s

curve premium: build (style apply + derivation) — curved
31.8 ms
curve premium: build (style apply + derivation) — straight
28.4 ms
curve premium: node.position x 1000 (drag) — curved
536 µs
curve premium: node.position x 1000 (drag) — straight
314 µs
curve premium: nodes().positions() (bulk move) — curved
368 µs
curve premium: nodes().positions() (bulk move) — straight
399 µs
curve premium: first read after a bulk move (cold) — curved
9.63 ms
curve premium: first read after a bulk move (cold) — straight
3.22 ms
curve premium: same read again (warm) — curved
2.85 ms
curve premium: same read again (warm) — straight
1.75 ms
curve premium: edge.midpoint x 4000 — curved
4.43 ms
curve premium: edge.midpoint x 4000 — straight
3.36 ms
curve premium: edge.controlPoints x 4000 — curved
2.30 ms
curve premium: edge.controlPoints x 4000 — straight
1.36 ms
curve premium: cy.elements().boundingBox() x 20 — curved
36.3 ms
curve premium: cy.elements().boundingBox() x 20 — straight
22.7 ms
curve premium: cy.fit() x 20 (store scan) — curved
4.00 ms
curve premium: cy.fit() x 20 (store scan) — straight
3.73 ms
curve premium: elementsInBox x 20 (half the graph) — curved
27.7 ms
curve premium: elementsInBox x 20 (half the graph) — straight
7.24 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — curved
4.23 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — straight
2.39 ms
100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
curve premium: build (style apply + derivation)curved 31.8 ms31.8 ms 31.8 ms31.8 ms 1
curve premium: build (style apply + derivation)straight 28.4 ms28.4 ms 28.4 ms28.4 ms 1
curve premium: node.position x 1000 (drag)curved 536 µs536 µs 536 µs536 µs 1
curve premium: node.position x 1000 (drag)straight 314 µs314 µs 314 µs314 µs 1
curve premium: nodes().positions() (bulk move)curved 368 µs368 µs 368 µs368 µs 1
curve premium: nodes().positions() (bulk move)straight 399 µs399 µs 399 µs399 µs 1
curve premium: first read after a bulk move (cold)curved 9.63 ms9.63 ms 9.63 ms9.63 ms 1
curve premium: first read after a bulk move (cold)straight 3.22 ms3.22 ms 3.22 ms3.22 ms 1
curve premium: same read again (warm)curved 2.85 ms2.85 ms 2.85 ms2.85 ms 1
curve premium: same read again (warm)straight 1.75 ms1.75 ms 1.75 ms1.75 ms 1
curve premium: edge.midpoint x 4000curved 4.43 ms4.43 ms 4.43 ms4.43 ms 1
curve premium: edge.midpoint x 4000straight 3.36 ms3.36 ms 3.36 ms3.36 ms 1
curve premium: edge.controlPoints x 4000curved 2.30 ms2.30 ms 2.30 ms2.30 ms 1
curve premium: edge.controlPoints x 4000straight 1.36 ms1.36 ms 1.36 ms1.36 ms 1
curve premium: cy.elements().boundingBox() x 20curved 36.3 ms36.3 ms 36.3 ms36.3 ms 1
curve premium: cy.elements().boundingBox() x 20straight 22.7 ms22.7 ms 22.7 ms22.7 ms 1
curve premium: cy.fit() x 20 (store scan)curved 4.00 ms4.00 ms 4.00 ms4.00 ms 1
curve premium: cy.fit() x 20 (store scan)straight 3.73 ms3.73 ms 3.73 ms3.73 ms 1
curve premium: elementsInBox x 20 (half the graph)curved 27.7 ms27.7 ms 27.7 ms27.7 ms 1
curve premium: elementsInBox x 20 (half the graph)straight 7.24 ms7.24 ms 7.24 ms7.24 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)curved 4.23 ms4.23 ms 4.23 ms4.23 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)straight 2.39 ms2.39 ms 2.39 ms2.39 ms 1

arrows N=2,000 · 3.4 s

arrow premium: build (style apply + arrow fold) — arrowed
24.5 ms
arrow premium: build (style apply + arrow fold) — none
22.2 ms
arrow premium: cy.style() re-apply x 4 — arrowed
43.6 ms
arrow premium: cy.style() re-apply x 4 — none
44.0 ms
arrow premium: node.position x 200000 (drag) — arrowed
23.5 ms
arrow premium: node.position x 200000 (drag) — none
23.4 ms
arrow premium: edge.sourceEndpoint x 200000 — arrowed
60.2 ms
arrow premium: edge.sourceEndpoint x 200000 — none
58.5 ms
arrow premium: edge.targetEndpoint x 200000 — arrowed
60.8 ms
arrow premium: edge.targetEndpoint x 200000 — none
62.3 ms
arrow premium: edge.midpoint x 200000 — arrowed
139 ms
arrow premium: edge.midpoint x 200000 — none
137 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — arrowed
34.0 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — none
30.6 ms
arrow premium: cy.elements().boundingBox() x 20 — arrowed
21.2 ms
arrow premium: cy.elements().boundingBox() x 20 — none
21.2 ms
arrow premium: elementsInBox x 20 (half the graph) — arrowed
5.54 ms
arrow premium: elementsInBox x 20 (half the graph) — none
5.48 ms
arrow premium: control: sourceEndpoint, bezier vs straight — arrowed
73.4 ms
arrow premium: control: sourceEndpoint, bezier vs straight — none
58.5 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 24.5 ms24.5 ms 24.5 ms24.5 ms 1
arrow premium: build (style apply + arrow fold)none 22.2 ms22.2 ms 22.2 ms22.2 ms 1
arrow premium: cy.style() re-apply x 4arrowed 43.6 ms43.6 ms 43.6 ms43.6 ms 1
arrow premium: cy.style() re-apply x 4none 44.0 ms44.0 ms 44.0 ms44.0 ms 1
arrow premium: node.position x 200000 (drag)arrowed 23.5 ms23.5 ms 23.5 ms23.5 ms 1
arrow premium: node.position x 200000 (drag)none 23.4 ms23.4 ms 23.4 ms23.4 ms 1
arrow premium: edge.sourceEndpoint x 200000arrowed 60.2 ms60.2 ms 60.2 ms60.2 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.8 ms60.8 ms 60.8 ms60.8 ms 1
arrow premium: edge.targetEndpoint x 200000none 62.3 ms62.3 ms 62.3 ms62.3 ms 1
arrow premium: edge.midpoint x 200000arrowed 139 ms139 ms 139 ms139 ms 1
arrow premium: edge.midpoint x 200000none 137 ms137 ms 137 ms137 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000arrowed 34.0 ms34.0 ms 34.0 ms34.0 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000none 30.6 ms30.6 ms 30.6 ms30.6 ms 1
arrow premium: cy.elements().boundingBox() x 20arrowed 21.2 ms21.2 ms 21.2 ms21.2 ms 1
arrow premium: cy.elements().boundingBox() x 20none 21.2 ms21.2 ms 21.2 ms21.2 ms 1
arrow premium: elementsInBox x 20 (half the graph)arrowed 5.54 ms5.54 ms 5.54 ms5.54 ms 1
arrow premium: elementsInBox x 20 (half the graph)none 5.48 ms5.48 ms 5.48 ms5.48 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightarrowed 73.4 ms73.4 ms 73.4 ms73.4 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightnone 58.5 ms58.5 ms 58.5 ms58.5 ms 1
arrow premium: edge column bytesB/edge 156 ms156 ms 156 ms156 ms 1

labels N=20,000 · 0.5 s

labels: breakLines x 20000 — gpu
83.5 ms
labels: estimateBlock x 20000 — gpu
92.7 ms
labels: addNode x 20000 — gpu
30.8 ms
labels: setLabel (build) x 20000 — gpu
104 ms
labels: setLabel (rewrite) x 20000 — gpu
102 ms
labels: boundingBox with 20000 label terms — gpu
3.40 ms
1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
labels: breakLines x 20000gpu 83.5 ms83.5 ms 83.5 ms83.5 ms 1
labels: estimateBlock x 20000gpu 92.7 ms92.7 ms 92.7 ms92.7 ms 1
labels: addNode x 20000gpu 30.8 ms30.8 ms 30.8 ms30.8 ms 1
labels: setLabel (build) x 20000gpu 104 ms104 ms 104 ms104 ms 1
labels: setLabel (rewrite) x 20000gpu 102 ms102 ms 102 ms102 ms 1
labels: boundingBox with 20000 label termsgpu 3.40 ms3.40 ms 3.40 ms3.40 ms 1

transitions N=2,000 · 9.5 s

transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions off
2.31 ms
transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions on
4.80 ms
transition: bulk tween tick (2000 slots, one manager tick) — tick
136 µs
transition: explicit-domain write (O(changed) — one element) — transitions off
2.45 µs
transition: explicit-domain write (O(changed) — one element) — transitions on
5.90 µs
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions off
10.0 ms
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions on
12.8 ms
1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions off 2.31 ms2.47 ms 4.55 ms2.19 ms 277
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions on 4.80 ms5.08 ms 7.47 ms4.52 ms 132
transition: bulk tween tick (2000 slots, one manager tick)tick 136 µs143 µs 254 µs129 µs 4890
transition: explicit-domain write (O(changed) — one element)transitions off 2.45 µs2.54 µs 3.77 µs2.37 µs 62
transition: explicit-domain write (O(changed) — one element)transitions on 5.90 µs5.87 µs 6.76 µs4.94 µs 25
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions off 10.0 ms10.0 ms 10.6 ms9.78 ms 66
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions on 12.8 ms12.6 ms 14.1 ms11.5 ms 52

geometry-tween N=2,000 · 11.0 s

size tick: unlabelled (2000 slots) — tick
526 µs
size tick: labelled, center/center (re-anchor early-out) (2000 slots) — tick
548 µs
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots) — tick
1.18 ms
edge width tick (4000 slots) — bare
243 µs
edge width tick (4000 slots) — with rides (casing + match-line arrows)
724 µs
padding tick + auto-bounds flush (250 parents × 8 children) — tick + flush
175 µs
font-size tick (2000 labels) — wrap none (dims scale-patch)
360 µs
font-size tick (2000 labels) — wrapped (re-break per tick)
5.84 ms
baseline: paint (opacity) tick (2000 slots) — tick
147 µs
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
size tick: unlabelled (2000 slots)tick 526 µs552 µs 917 µs509 µs 1247
size tick: labelled, center/center (re-anchor early-out) (2000 slots)tick 548 µs570 µs 885 µs531 µs 1228
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots)tick 1.18 ms1.26 ms 2.13 ms1.13 ms 534
edge width tick (4000 slots)bare 243 µs254 µs 400 µs235 µs 2748
edge width tick (4000 slots)with rides (casing + match-line arrows) 724 µs747 µs 1.11 ms697 µs 936
padding tick + auto-bounds flush (250 parents × 8 children)tick + flush 175 µs189 µs 430 µs171 µs 3684
font-size tick (2000 labels)wrap none (dims scale-patch) 360 µs411 µs 942 µs347 µs 1682
font-size tick (2000 labels)wrapped (re-break per tick) 5.84 ms5.91 ms 6.68 ms5.40 ms 112
baseline: paint (opacity) tick (2000 slots)tick 147 µs153 µs 286 µs138 µs 4580