Cytoscape.js GPU benchmarks

v4 (src/) vs v3 (v3/src/) · Mitata · times are per-iteration p50 · 2026-08-10 21:55 · 44e55dc9 (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)
Commit44e55dc9
perf(65.10): the CPU takes two families back — flat hierarchical merges, sparse PageRank, and honest re-routing (+ the wide benchmark page)
Machine id5cf3f79c
Median speedup (geo-mean) 11× 270 v3-vs-gpu comparisons
Biggest win 294929× 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
294929×
sweep: nodes() @ 2k
172211×
core: edges() @ 2k
90329×
core: nodes() @ 2k
51711×
sweep: elements() @ 2k
33089×
core: elements() @ 2k
22329×
core: graph scratch() set + get (v3 restyles the graph) @ 2k
17105×
core: removeScratch() @ 2k
9872×
core: graph data() set + get (v3 restyles the graph) @ 2k
8472×
compare: same() @ 2k
7812×
trav: successors() @ 2k
782×
trav: predecessors() @ 2k
721×
mut-bulk: hide + show @ 2k
270×
flags: show + hide + visible @ 2k
239×
parent drag (shift subtree + bb settle) @ 2k
191×
degree: nodes.totalDegree() @ 2k
168×
layout: grid @ 2k
154×
compound: commonAncestors @ 2k
130×
degree: nodes.maxDegree() @ 2k
127×
mut-bulk: positions(obj) @ 2k
116×
degree: node.degree() @ 2k
115×
mut-bulk: shift @ 2k
108×
viewport: reset() @ 2k
106×
flags: selectify + unselectify + selectable @ 2k
98×
mut-bulk: positions(fn) @ 2k
98×
flags: grabify + ungrabify + grabbable @ 2k
96×
flags: lock + unlock + locked @ 2k
96×
flags: panify + unpanify + pannable @ 2k
95×
core: options() @ 2k
85×
collection: same + anySame + contains (3 calls) @ 2k
77×
algo: closenessCentrality (one root) @ 2k
71×
algo: pageRank (20 iters) @ 500
69×
degree: indegree + outdegree (2 calls) @ 2k
68×
algo: closenessCentrality (one root) @ 500
68×
reparent round-trip @ 2k
67×
algo: dfs (whole graph) @ 500
63×
sweep: nodes(":selected") vs nodes({selected}) @ 2k
61×
dimensions: shift + silentShift (round-trip) @ 2k
61×
layout: preset (fn form) @ 2k
61×
algo: bfs (whole graph) @ 500
61×
algo: bfs (whole graph) @ 2k
60×
viewport: viewport({ zoom, pan }) @ 2k
59×
algo: dijkstra + pathTo @ 2k
57×
algo: dfs (whole graph) @ 2k
57×
mut-bulk: lock + unlock @ 2k
57×
algo: closenessCentrality (weighted, one root) @ 500
56×
algo: dijkstra + pathTo @ 500
52×
child drag (move + parent re-derive) @ 2k
51×
dimensions: positions( fn ) over 100 @ 2k
45×
collection: component() @ 2k
44×
traverse: components() @ 2k
39×
algo: tarjan SCC @ 2k
37×
algo: degreeCentralityNormalized @ 500
37×
degree: minDegree + maxDegree (2 calls) @ 2k
36×
layout: breadthfirst @ 2k
36×
algo: degreeCentralityNormalized @ 2k
36×
sweep: selected nodes ($("node:selected") vs filter({group, selected})) @ 2k
35×
query: structural, parents (:parent vs { parent: true }) @ 2k
34×
algo: tarjan SCC @ 500
33×
query: structural, orphans (:orphan vs { child: false }) @ 2k
33×
bounds: getFitViewport() (compute without committing) @ 2k
33×
bounds: cy.fit() (whole-graph scan) @ 2k
33×
collection: silentPositions( fn ) over 100 @ 2k
31×
algo: degreeCentrality (one root) @ 500
30×
algo: degreeCentrality (one root) @ 2k
30×
collection: difference @ 2k
29×
collection: intersection @ 2k
29×
algo: kruskal @ 2k
27×
set: difference() @ 2k
26×
core: id lookup ($("#id") vs $id()) @ 2k
26×
set: intersection() @ 2k
26×
layout: concentric @ 2k
26×
scn: select-all + fit (listeners on) @ 2k
25×
emit: position write, no listeners @ 2k
25×
algo: hopcroft-tarjan biconnected @ 2k
25×
algo: hopcroft-tarjan biconnected @ 500
25×
algo: kruskal @ 500
24×
degree: maxIndegree + minOutdegree (2 calls) @ 2k
22×
trav: band roots() @ 2k
22×
degree: minIndegree + maxOutdegree (2 calls) @ 2k
21×
algo: bellmanFord @ 500
21×
data: bulk write, object column (plain-array fallback) @ 2k
21×
data: bulk write, numeric column @ 2k
20×
algo: bellmanFord @ 2k
20×
viewport: center( eles ) @ 2k
19×
layout: preset @ 2k
17×
data: bulk write, one new dictionary entry per pass @ 2k
17×
core: add + remove @ 2k
17×
mut: position set @ 2k
17×
traversal: roots + leaves (2 calls) @ 2k
17×
data: bulk write, dictionary string column (4 values) @ 2k
17×
flags: active/activate/unactivate (3 calls) @ 2k
17×
core: forceRender() (headless no-op) @ 2k
16×
query: membership ([bucket in ...] vs { in }) @ 2k
16×
scn: drag (select band of 100 + 8-step shift, position listener) @ 2k
16×
flags: select + unselect + selected (band) @ 2k
15×
dimensions: silentPosition @ 2k
15×
viewport: minZoom/maxZoom get (2 calls) @ 2k
15×
style: renderedStyle (one prop) @ 2k
15×
mut-bulk: data set @ 2k
15×
collection: absoluteComplement @ 2k
14×
core: selected ($(":selected") vs filter({selected})) @ 2k
14×
dimensions: padding + paddedWidth + paddedHeight (3 calls) @ 2k
14×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } }) @ 2k
14×
sweep: selected ($(":selected") vs filter({selected})) @ 2k
14×
query: structural, childless (:childless vs { parent: false }) @ 2k
13×
layout: circle @ 2k
13×
algo: betweennessCentrality (unweighted) @ 500
13×
query: two keys AND-ed @ 2k
12×
collection: toArray() @ 2k
12×
algo: betweennessCentrality (unweighted) @ 2k
11×
algo: fuzzyCMeans @ 500
11×
dimensions: relativePosition get @ 2k
11×
query: data comparison ([weight > 3] vs { gt }) @ 2k
11×
layout: random @ 2k
11×
layout: scope (eles.layout, 10% of nodes) @ 2k
10×
sweep: all nodes ($("node") vs filter({group})) @ 2k
9.2×
algo: betweennessCentrality (weighted) @ 500
9.1×
collection: removeScratch() @ 2k
9.1×
algo: kMedoids @ 500
9.0×
core: removeAllListeners() @ 2k
8.6×
emit: 1 core listener @ 2k
8.5×
core: batchData() @ 2k
8.5×
algo: hierarchicalClustering (threshold) @ 500
8.4×
core: collection() @ 2k
7.9×
scn: explore (expand 2-hop + select + fit) @ 2k
7.9×
emit: delegated (v3 selector vs v4 predicate) @ 2k
7.9×
data: removeData (whole collection) @ 2k
7.8×
element data: scratch get + set @ 2k
7.8×
emit: 1 element (ref-qualified) listener @ 2k
7.6×
mut-bulk: select + unselect @ 2k
7.1×
query: predicate function (both sides) @ 2k
7.0×
compound: orphans + nonorphans (2 calls) @ 2k
7.0×
core: collection() @ 2k
6.7×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners) @ 2k
6.5×
core: batch( fn ) (empty) @ 2k
6.3×
bounds: whole-graph boundingBox() @ 2k
6.3×
mut-bulk: remove + re-add (256 nodes + cascade) @ 2k
6.2×
emit: 10 core listeners @ 2k
6.1×
style: whole-object style() @ 2k
6.1×
load: init from the definition form (construct + dispose) @ 2k
6.1×
core: startBatch + endBatch + batching @ 2k
5.7×
collection: union @ 2k
5.7×
core: nodes ($("node") vs filter({group})) @ 2k
5.6×
set: union() @ 2k
5.6×
algo: affinityPropagation @ 500
5.3×
algo: hierholzer (directed) @ 500
5.2×
traversal: allAreNeighbors @ 2k
5.1×
trav: outgoers() @ 2k
5.1×
trav: band neighborhood() @ 2k
5.0×
trav: incomers() @ 2k
4.9×
compare: contains() @ 2k
4.9×
core: animated() @ 2k
4.9×
compound: children + descendants + siblings (3 calls) @ 2k
4.9×
viewport: zoom() get @ 2k
4.7×
algo: kMeans (fixed centroids) @ 500
4.6×
collection: length + empty + nonempty (3 calls) @ 2k
4.6×
traverse: outgoers() @ 2k
4.4×
traverse: incomers() @ 2k
4.3×
style: bypass set + removeStyle round-trip @ 2k
4.3×
compound: parent + parents + ancestors (3 calls) @ 2k
3.9×
mut: data set @ 2k
3.9×
collection: layoutDimensions() @ 2k
3.9×
collection: symmetricDifference @ 2k
3.8×
traversal: connectedNodes @ 2k
3.7×
trav: neighborhood() @ 2k
3.7×
mut: select + unselect @ 2k
3.7×
collection: cy() @ 2k
3.6×
algo: aStar @ 500
3.5×
traverse: neighborhood() @ 2k
3.4×
traversal: sources + targets (2 calls) @ 2k
3.4×
algo: aStar @ 2k
3.3×
dimensions: rendered dims (4 calls) @ 2k
3.3×
style: bypass set (ele.style name,value) @ 2k
3.3×
collection: diff @ 2k
3.3×
anim: viewport animate + stop @ 2k
3.0×
collection: byGroup @ 2k
3.0×
anim: start + stop, 512-node collection @ 2k
3.0×
traversal: openNeighborhood + closedNeighborhood (2 calls) @ 2k
3.0×
collection: delayAnimation() @ 2k
2.9×
dimensions: width + height + outerWidth + outerHeight (4 calls) @ 2k
2.9×
traversal: parallelEdges + codirectedEdges (2 calls) @ 2k
2.9×
collection: animated() @ 2k
2.8×
viewport: width() + height() + size() (3 calls) @ 2k
2.8×
algo: hierholzer (directed) @ 2k
2.8×
style: numericStyle @ 2k
2.8×
trav: band connectedNodes() @ 2k
2.8×
core: window() @ 2k
2.8×
iter: map() @ 2k
2.8×
load: cy.json() @ 2k
2.8×
flags: takesUpSpace + interactive + transparent (3 calls) @ 2k
2.7×
trav: closedNeighborhood() @ 2k
2.7×
core: container() @ 2k
2.6×
trav: connectedEdges() @ 2k
2.6×
dimensions: renderedPosition get @ 2k
2.6×
core: onRender + offRender @ 2k
2.5×
traversal: isLoop + isSimple (2 calls) @ 2k
2.5×
collection: eq/first/last (3 calls) @ 2k
2.4×
collection: is (none match: the full walk) @ 2k
2.4×
core: resize() / invalidateSize() @ 2k
2.3×
flags: effectiveOpacity @ 2k
2.3×
emit: on() + off() round-trip @ 2k
2.3×
collection: slice() @ 2k
2.2×
core: destroyed() @ 2k
2.2×
data: read the whole object @ 2k
2.2×
core: isReady() @ 2k
2.2×
style: read one prop (width) @ 2k
2.2×
traverse: connectedEdges() @ 2k
2.2×
flags: grabbed + hidden + inactive (3 calls) @ 2k
2.0×
algo: floydWarshall @ 500
1.98×
dimensions: renderedBoundingBox @ 2k
1.98×
core: selectionType get @ 2k
1.97×
viewport: pan( p ) set @ 2k
1.96×
collection: min + max ( fn ) (2 calls) @ 2k
1.95×
viewport: zoom( n ) set @ 2k
1.91×
element data: json() one element @ 2k
1.90×
iter: filter(fn) @ 2k
1.89×
json: element @ 2k
1.88×
core: gating setters round-trip (autolock/autoungrabify/autounselectify) @ 2k
1.87×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener) @ 2k
1.84×
viewport: panBy() @ 2k
1.83×
core: zoom set @ 2k
1.76×
collection: element accessors (id/group/isNode/isEdge, 4 calls) @ 2k
1.75×
viewport: renderedExtent() @ 2k
1.68×
style( 'text-max-width' ) (was #74 in the switch) @ 2k
1.67×
style( 'text-wrap' ) (was #73 in the switch) @ 2k
1.66×
style: read one prop (color) @ 2k
1.65×
style: first apply on add (256-node band) @ 2k
1.63×
bounds: one node boundingBox() @ 2k
1.63×
algo: closenessCentralityNormalized @ 500
1.63×
collection: some + every (2 calls) @ 2k
1.61×
collection: sort( fn ) @ 2k
1.61×
sweep: filter(fn) @ 2k
1.59×
anim: delay() (no channels touched) @ 2k
1.57×
compound: isParent/isChild/isChildless/isOrphan (4 calls) @ 2k
1.53×
collection: indexOfId() @ 2k
1.53×
viewport: extent() @ 2k
1.52×
collection: allAre (all match: the full walk) @ 2k
1.50×
trav: band sources() @ 2k
1.49×
trav: band connectedEdges() @ 2k
1.47×
element data: jsons() over 100 @ 2k
1.42×
data: read one numeric key @ 2k
1.40×
position: get @ 2k
1.39×
core: mutableElements() (v4 materializes; v3 is O(1)) @ 2k
1.39×
collection: reduce( fn ) @ 2k
1.37×
load: add a 256-node band (add + remove) @ 2k
1.37×
traversal: source() + target() (2 calls) @ 2k
1.34×
core: pan() get (x32) @ 2k
1.33×
style: sheet swap (compile + applyAll) @ 2k
1.32×
data: read one string key (dictionary decode) @ 2k
1.30×
anim: start + stop, one element @ 2k
1.29×
style( 'border-width' ) (was #6 in the switch) @ 2k
1.26×
core: instanceString + headless + styleEnabled (3 calls) @ 2k
1.24×
collection: indexOf @ 2k
1.24×
core: filter(fn) @ 2k
1.22×
style( 'target-distance-from-node' ) (was #150 in the switch) @ 2k
1.21×
traversal: edgesWith @ 2k
1.21×
style( 'taxi-radius' ) (was #142 in the switch) @ 2k
1.21×
core: hasElementWithId + hasCompoundNodes (2 calls) @ 2k
1.19×
data: get @ 2k
1.18×
traversal: edgesTo @ 2k
1.18×
core: gating getters (5 calls) @ 2k
1.11×
collection: removed() + inside() (2 calls) @ 2k
1.11×
algo: markovClustering @ 500
1.11×
algo: kargerStein @ 500
1.08×
style( 'background-color' ) (was #4 in the switch) @ 2k
1.07×
viewport: pan() get @ 2k
1.05×
core: extent() @ 2k
1.04×
iter: forEach() @ 2k
1.04×
core: getElementById() @ 2k
1.03×
10×100×1000×10000×100000×1000000×

Scaling speedup vs graph size

algorithms

group× @ N=500× @ N=2k
algo: bfs (whole graph)61×60×
algo: dfs (whole graph)63×57×
algo: dijkstra + pathTo52×57×
algo: aStar3.5×3.3×
algo: bellmanFord21×20×
algo: kruskal24×27×
algo: tarjan SCC33×37×
algo: hopcroft-tarjan biconnected25×25×
algo: hierholzer (directed)5.2×2.8×
algo: betweennessCentrality (unweighted)13×11×
algo: degreeCentralityNormalized37×36×
algo: closenessCentrality (one root)68×71×
algo: degreeCentrality (one root)30×30×
algo: pageRank (20 iters)69×
algo: closenessCentrality (weighted, one root)56×
algo: floydWarshall1.98×
algo: closenessCentralityNormalized1.63×
algo: markovClustering1.11×
algo: hierarchicalClustering (threshold)8.4×
algo: kMeans (fixed centroids)4.6×
algo: kMedoids9.0×
algo: fuzzyCMeans11×
algo: affinityPropagation5.3×
algo: kargerStein1.08×
algo: betweennessCentrality (weighted)9.1×

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

core: getElementById()
1.03×
core: id lookup ($("#id") vs $id())
26×
core: nodes()
51711×
core: edges()
90329×
core: elements()
22329×
core: nodes ($("node") vs filter({group}))
5.6×
core: selected ($(":selected") vs filter({selected}))
14×
core: filter(fn)
1.22×
core: collection()
6.7×
core: pan() get (x32)
1.33×
core: extent()
1.04×
core: add + remove
17×
core: zoom set
1.76×
traverse: neighborhood()
3.4×
traverse: connectedEdges()
2.2×
traverse: outgoers()
4.4×
traverse: incomers()
4.3×
traverse: components()
39×
degree: node.degree()
115×
degree: nodes.totalDegree()
168×
degree: nodes.maxDegree()
127×
data: get
1.18×
position: get
1.39×
json: element
1.88×
set: union()
5.6×
set: intersection()
26×
set: difference()
26×
iter: map()
2.8×
iter: forEach()
1.04×
iter: filter(fn)
1.89×
compare: same()
7812×
compare: contains()
4.9×
mut: data set
3.9×
mut: position set
17×
mut: select + unselect
3.7×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
core: getElementById()v3 86.7 ns90.4 ns 163 ns83.3 ns 1897
core: getElementById()gpu 84.4 ns87.7 ns 127 ns80.8 ns 1953
core: id lookup ($("#id") vs $id())v3 2.00 µs2.32 µs 3.54 µs1.83 µs 69
core: id lookup ($("#id") vs $id())gpu 76.7 ns79.7 ns 153 ns73.3 ns 2144
core: nodes()v3 422 µs435 µs 705 µs412 µs 1607
core: nodes()gpu 8.16 ns8.54 ns 23.6 ns7.73 ns 19874
core: edges()v3 732 µs743 µs 933 µs701 µs 940
core: edges()gpu 8.10 ns9.23 ns 17.2 ns7.72 ns 18398
core: elements()v3 153 µs163 µs 410 µs148 µs 4274
core: elements()gpu 6.84 ns7.20 ns 24.4 ns6.49 ns 23513
core: nodes ($("node") vs filter({group}))v3 562 µs591 µs 1.30 ms543 µs 1179
core: nodes ($("node") vs filter({group}))gpu 99.5 µs106 µs 257 µs68.1 µs 6419
core: selected ($(":selected") vs filter({selected}))v3 357 µs371 µs 665 µs347 µs 1825
core: selected ($(":selected") vs filter({selected}))gpu 24.8 µs25.7 µs 26.6 µs24.5 µs 12
core: filter(fn)v3 423 µs438 µs 660 µs416 µs 1595
core: filter(fn)gpu 345 µs374 µs 771 µs334 µs 1830
core: collection()v3 459 ns557 ns 1.61 µs446 ns 296
core: collection()gpu 68.0 ns70.3 ns 98.4 ns66.5 ns 2319
core: pan() get (x32)v3 44.5 ns46.6 ns 59.4 ns42.5 ns 3651
core: pan() get (x32)gpu 33.3 ns36.5 ns 71.0 ns32.7 ns 4694
core: extent()v3 22.4 ns38.6 ns 164 ns21.4 ns 4328
core: extent()gpu 21.5 ns28.8 ns 118 ns20.2 ns 5751
core: add + removev3 131 µs141 µs 282 µs119 µs 4907
core: add + removegpu 7.50 µs8.78 µs 29.4 µs7.13 µs 73573
core: zoom setv3 1.23 µs1.24 µs 1.34 µs1.18 µs 132
core: zoom setgpu 697 ns717 ns 945 ns679 ns 226
traverse: neighborhood()v3 3.69 µs3.97 µs 4.91 µs3.49 µs 39
traverse: neighborhood()gpu 1.08 µs1.25 µs 2.67 µs1.02 µs 129
traverse: connectedEdges()v3 1.03 µs1.15 µs 2.03 µs983 ns 144
traverse: connectedEdges()gpu 471 ns521 ns 1.48 µs436 ns 321
traverse: outgoers()v3 2.31 µs2.49 µs 3.33 µs2.20 µs 64
traverse: outgoers()gpu 531 ns575 ns 1.31 µs517 ns 278
traverse: incomers()v3 2.32 µs2.48 µs 3.24 µs2.18 µs 65
traverse: incomers()gpu 538 ns579 ns 1.27 µs519 ns 277
traverse: components()v3 78.3 ms80.6 ms 89.3 ms74.0 ms 12
traverse: components()gpu 2.03 ms2.15 ms 3.22 ms1.97 ms 310
degree: node.degree()v3 3.33 µs3.63 µs 4.59 µs3.19 µs 42
degree: node.degree()gpu 29.0 ns30.2 ns 45.8 ns27.6 ns 5404
degree: nodes.totalDegree()v3 8.45 ms9.25 ms 13.1 ms7.43 ms 72
degree: nodes.totalDegree()gpu 50.4 µs51.9 µs 94.8 µs47.5 µs 13448
degree: nodes.maxDegree()v3 7.31 ms8.15 ms 12.4 ms6.81 ms 82
degree: nodes.maxDegree()gpu 57.4 µs58.6 µs 92.6 µs54.0 µs 11961
data: getv3 30.7 ns31.7 ns 51.8 ns29.4 ns 5393
data: getgpu 25.9 ns26.7 ns 39.2 ns24.6 ns 6419
position: getv3 33.8 ns36.3 ns 131 ns32.8 ns 4705
position: getgpu 24.3 ns27.2 ns 52.8 ns22.4 ns 6156
json: elementv3 300 ns389 ns 3.49 µs292 ns 421
json: elementgpu 160 ns166 ns 308 ns152 ns 974
set: union()v3 93.1 µs106 µs 158 µs90.9 µs 6477
set: union()gpu 16.5 µs17.4 µs 16.8 µs16.4 µs 12
set: intersection()v3 90.1 µs104 µs 161 µs86.8 µs 6648
set: intersection()gpu 3.48 µs3.53 µs 3.79 µs3.40 µs 43
set: difference()v3 90.5 µs104 µs 149 µs88.0 µs 6619
set: difference()gpu 3.44 µs3.49 µs 3.89 µs3.42 µs 44
iter: map()v3 28.6 µs30.6 µs 52.9 µs27.4 µs 22340
iter: map()gpu 10.4 µs11.1 µs 36.3 µs9.94 µs 60926
iter: forEach()v3 3.45 µs3.70 µs 3.69 µs3.39 µs 37
iter: forEach()gpu 3.32 µs3.36 µs 3.59 µs3.26 µs 45
iter: filter(fn)v3 245 µs253 µs 457 µs243 µs 2763
iter: filter(fn)gpu 130 µs134 µs 199 µs125 µs 5207
compare: same()v3 116 µs120 µs 203 µs111 µs 5835
compare: same()gpu 14.9 ns15.7 ns 29.7 ns14.1 ns 10883
compare: contains()v3 5.97 µs6.00 µs 6.29 µs5.90 µs 25
compare: contains()gpu 1.21 µs1.22 µs 1.28 µs1.19 µs 131
mut: data setv3 417 ns439 ns 746 ns401 ns 381
mut: data setgpu 108 ns113 ns 172 ns103 ns 1493
mut: position setv3 1.22 µs1.25 µs 1.58 µs1.18 µs 131
mut: position setgpu 70.4 ns75.1 ns 120 ns68.0 ns 2259
mut: select + unselectv3 2.60 µs2.80 µs 3.49 µs2.47 µs 56
mut: select + unselectgpu 712 ns787 ns 1.70 µs658 ns 613177

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

sweep: nodes()
172211×
sweep: edges()
294929×
sweep: elements()
33089×
sweep: all nodes ($("node") vs filter({group}))
9.2×
sweep: selected ($(":selected") vs filter({selected}))
14×
sweep: selected nodes ($("node:selected") vs filter({group, selected}))
35×
sweep: nodes(":selected") vs nodes({selected})
61×
sweep: filter(fn)
1.59×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
sweep: nodes()v3 415 µs428 µs 533 µs403 µs 1638
sweep: nodes()gpu 2.41 ns2.57 ns 5.71 ns2.36 ns 64199
sweep: edges()v3 741 µs755 µs 1.06 ms710 µs 925
sweep: edges()gpu 2.51 ns2.63 ns 5.14 ns2.46 ns 63285
sweep: elements()v3 159 µs165 µs 254 µs155 µs 4238
sweep: elements()gpu 4.81 ns5.05 ns 12.1 ns4.64 ns 33459
sweep: all nodes ($("node") vs filter({group}))v3 552 µs582 µs 900 µs531 µs 1199
sweep: all nodes ($("node") vs filter({group}))gpu 60.2 µs76.6 µs 197 µs55.9 µs 9036
sweep: selected ($(":selected") vs filter({selected}))v3 359 µs376 µs 656 µs347 µs 1858
sweep: selected ($(":selected") vs filter({selected}))gpu 26.3 µs26.7 µs 27.3 µs26.0 µs 12
sweep: selected nodes ($("node:selected") vs filter({group, selected}))v3 330 µs344 µs 620 µs320 µs 2029
sweep: selected nodes ($("node:selected") vs filter({group, selected}))gpu 9.46 µs9.50 µs 9.66 µs9.37 µs 14
sweep: nodes(":selected") vs nodes({selected})v3 552 µs566 µs 867 µs534 µs 1237
sweep: nodes(":selected") vs nodes({selected})gpu 8.99 µs9.04 µs 9.46 µs8.86 µs 15
sweep: filter(fn)v3 418 µs429 µs 538 µs413 µs 1630
sweep: filter(fn)gpu 263 µs280 µs 592 µs257 µs 2484

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

mut-bulk: select + unselect
7.1×
mut-bulk: hide + show
270×
mut-bulk: lock + unlock
57×
mut-bulk: positions(obj)
116×
mut-bulk: positions(fn)
98×
mut-bulk: shift
108×
mut-bulk: data set
15×
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.88 ms1.94 ms 3.07 ms1.82 ms 338
mut-bulk: select + unselectgpu 264 µs281 µs 498 µs254 µs 2496
mut-bulk: hide + showv3 60.7 ms67.5 ms 80.6 ms59.6 ms 12
mut-bulk: hide + showgpu 225 µs232 µs 424 µs218 µs 2922
mut-bulk: lock + unlockv3 2.20 ms2.23 ms 2.63 ms2.12 ms 300
mut-bulk: lock + unlockgpu 38.6 µs39.4 µs 42.7 µs38.2 µs 12
mut-bulk: positions(obj)v3 2.37 ms2.43 ms 4.15 ms2.31 ms 281
mut-bulk: positions(obj)gpu 20.5 µs22.0 µs 46.5 µs19.3 µs 31382
mut-bulk: positions(fn)v3 3.40 ms3.60 ms 5.68 ms3.24 ms 188
mut-bulk: positions(fn)gpu 34.8 µs36.9 µs 89.2 µs32.9 µs 18410
mut-bulk: shiftv3 3.66 ms3.88 ms 6.30 ms3.57 ms 175
mut-bulk: shiftgpu 34.1 µs35.3 µs 63.6 µs32.4 µs 19158
mut-bulk: data setv3 836 µs861 µs 1.17 ms829 µs 777
mut-bulk: data setgpu 56.5 µs58.6 µs 155 µs55.6 µs 11834
mut-bulk: remove + re-add (256 nodes + cascade)v3 41.3 ms42.1 ms 46.3 ms39.7 ms 12
mut-bulk: remove + re-add (256 nodes + cascade)gpu 6.71 ms6.87 ms 8.40 ms6.07 ms 94

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

scn: explore (expand 2-hop + select + fit)
7.9×
scn: select-all + fit (listeners on)
25×
scn: drag (select band of 100 + 8-step shift, position listener)
16×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)
6.5×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)
1.84×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
scn: explore (expand 2-hop + select + fit)v3 302 µs346 µs 948 µs275 µs 2002
scn: explore (expand 2-hop + select + fit)gpu 38.2 µs43.5 µs 188 µs34.4 µs 15706
scn: select-all + fit (listeners on)v3 24.2 ms24.7 ms 26.3 ms23.3 ms 24
scn: select-all + fit (listeners on)gpu 955 µs1.03 ms 2.07 ms899 µs 656
scn: drag (select band of 100 + 8-step shift, position listener)v3 1.60 ms1.65 ms 2.15 ms1.56 ms 404
scn: drag (select band of 100 + 8-step shift, position listener)gpu 102 µs115 µs 349 µs97.0 µs 6044
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)v3 44.6 ms45.0 ms 45.8 ms43.6 ms 11
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)gpu 6.88 ms7.15 ms 9.47 ms6.32 ms 92
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)v3 7.61 ms7.87 ms 9.99 ms7.06 ms 82
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)gpu 4.14 ms4.29 ms 6.96 ms3.70 ms 152

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

trav: neighborhood()
3.7×
trav: closedNeighborhood()
2.7×
trav: connectedEdges()
2.6×
trav: outgoers()
5.1×
trav: incomers()
4.9×
trav: successors()
782×
trav: predecessors()
721×
trav: band neighborhood()
5.0×
trav: band connectedEdges()
1.47×
trav: band roots()
22×
trav: band sources()
1.49×
trav: band connectedNodes()
2.8×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
trav: neighborhood()v3 3.78 µs3.96 µs 5.20 µs3.38 µs 39
trav: neighborhood()gpu 1.02 µs1.07 µs 2.00 µs842 ns 154
trav: closedNeighborhood()v3 5.76 µs5.62 µs 6.10 µs5.13 µs 26
trav: closedNeighborhood()gpu 2.14 µs2.30 µs 2.93 µs2.07 µs 69
trav: connectedEdges()v3 990 ns1.07 µs 1.79 µs967 ns 156
trav: connectedEdges()gpu 388 ns407 ns 742 ns370 ns 415
trav: outgoers()v3 2.28 µs2.42 µs 3.02 µs2.18 µs 66
trav: outgoers()gpu 451 ns528 ns 2.01 µs442 ns 314
trav: incomers()v3 2.24 µs2.41 µs 3.21 µs2.18 µs 66
trav: incomers()gpu 454 ns547 ns 2.07 µs443 ns 301
trav: successors()v3 438 ms441 ms 453 ms429 ms 12
trav: successors()gpu 560 µs591 µs 1.88 ms545 µs 1153
trav: predecessors()v3 431 ms436 ms 455 ms426 ms 12
trav: predecessors()gpu 598 µs635 µs 1.98 ms568 µs 1071
trav: band neighborhood()v3 186 µs197 µs 276 µs179 µs 3531
trav: band neighborhood()gpu 37.3 µs38.2 µs 40.5 µs36.9 µs 12
trav: band connectedEdges()v3 24.5 µs24.8 µs 25.2 µs24.1 µs 12
trav: band connectedEdges()gpu 16.6 µs17.5 µs 36.1 µs15.7 µs 38848
trav: band roots()v3 107 µs116 µs 164 µs104 µs 5970
trav: band roots()gpu 4.84 µs4.85 µs 5.09 µs4.74 µs 31
trav: band sources()v3 6.50 µs6.57 µs 6.93 µs6.25 µs 22
trav: band sources()gpu 4.38 µs4.43 µs 4.74 µs4.29 µs 34
trav: band connectedNodes()v3 13.9 µs13.9 µs 14.0 µs13.8 µs 9
trav: band connectedNodes()gpu 4.99 µs5.02 µs 5.51 µs4.88 µs 30

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

algo: bfs (whole graph)
60×
algo: dfs (whole graph)
57×
algo: dijkstra + pathTo
57×
algo: aStar
3.3×
algo: bellmanFord
20×
algo: kruskal
27×
algo: tarjan SCC
37×
algo: hopcroft-tarjan biconnected
25×
algo: hierholzer (directed)
2.8×
algo: betweennessCentrality (unweighted)
11×
algo: degreeCentralityNormalized
36×
algo: closenessCentrality (one root)
71×
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.3 ms55.7 ms 61.6 ms49.6 ms 9
algo: bfs (whole graph)gpu 931 µs943 µs 1.42 ms867 µs 735
algo: dfs (whole graph)v3 48.4 ms48.9 ms 49.2 ms48.0 ms 10
algo: dfs (whole graph)gpu 849 µs865 µs 1.15 ms827 µs 787
algo: dijkstra + pathTov3 54.2 ms54.4 ms 56.5 ms52.0 ms 9
algo: dijkstra + pathTogpu 945 µs969 µs 1.26 ms926 µs 717
algo: aStarv3 1.69 ms1.73 ms 2.44 ms1.65 ms 399
algo: aStargpu 509 µs525 µs 642 µs492 µs 1331
algo: bellmanFordv3 237 ms238 ms 262 ms217 ms 12
algo: bellmanFordgpu 11.9 ms12.2 ms 15.8 ms11.9 ms 51
algo: kruskalv3 13.5 ms14.6 ms 18.5 ms12.9 ms 43
algo: kruskalgpu 495 µs524 µs 788 µs469 µs 1310
algo: tarjan SCCv3 23.1 ms23.9 ms 26.9 ms21.5 ms 25
algo: tarjan SCCgpu 625 µs674 µs 1.19 ms612 µs 1009
algo: hopcroft-tarjan biconnectedv3 86.0 ms87.9 ms 96.3 ms82.0 ms 12
algo: hopcroft-tarjan biconnectedgpu 3.48 ms3.56 ms 4.51 ms3.39 ms 189
algo: hierholzer (directed)v3 22.5 ms23.6 ms 26.3 ms21.7 ms 25
algo: hierholzer (directed)gpu 7.95 ms8.07 ms 9.62 ms7.70 ms 75
algo: betweennessCentrality (unweighted)v3 4.06 s4.06 s 4.11 s4.00 s 12
algo: betweennessCentrality (unweighted)gpu 359 ms377 ms 437 ms347 ms 12
algo: degreeCentralityNormalizedv3 14.4 ms15.5 ms 18.6 ms13.9 ms 41
algo: degreeCentralityNormalizedgpu 402 µs414 µs 616 µs396 µs 1685
algo: closenessCentrality (one root)v3 60.4 ms62.4 ms 72.0 ms58.5 ms 12
algo: closenessCentrality (one root)gpu 847 µs880 µs 1.31 ms817 µs 787
algo: degreeCentrality (one root)v3 7.51 µs7.41 µs 7.99 µs6.63 µs 19
algo: degreeCentrality (one root)gpu 248 ns254 ns 338 ns242 ns 668

algorithms N=500 · 6.9 minv4 (gpu) v3

algo: bfs (whole graph)
61×
algo: dfs (whole graph)
63×
algo: dijkstra + pathTo
52×
algo: aStar
3.5×
algo: bellmanFord
21×
algo: kruskal
24×
algo: tarjan SCC
33×
algo: hopcroft-tarjan biconnected
25×
algo: hierholzer (directed)
5.2×
algo: betweennessCentrality (unweighted)
13×
algo: degreeCentralityNormalized
37×
algo: closenessCentrality (one root)
68×
algo: degreeCentrality (one root)
30×
algo: pageRank (20 iters)
69×
algo: closenessCentrality (weighted, one root)
56×
algo: floydWarshall
1.98×
algo: closenessCentralityNormalized
1.63×
algo: markovClustering
1.11×
algo: hierarchicalClustering (threshold)
8.4×
algo: kMeans (fixed centroids)
4.6×
algo: kMedoids
9.0×
algo: fuzzyCMeans
11×
algo: affinityPropagation
5.3×
algo: kargerStein
1.08×
algo: betweennessCentrality (weighted)
9.1×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 13.6 ms14.4 ms 18.5 ms11.6 ms 44
algo: bfs (whole graph)gpu 223 µs234 µs 403 µs204 µs 2980
algo: dfs (whole graph)v3 11.5 ms12.3 ms 15.0 ms11.1 ms 53
algo: dfs (whole graph)gpu 183 µs189 µs 245 µs179 µs 3697
algo: dijkstra + pathTov3 12.4 ms12.8 ms 15.7 ms11.4 ms 50
algo: dijkstra + pathTogpu 240 µs245 µs 303 µs233 µs 2796
algo: aStarv3 437 µs447 µs 562 µs424 µs 1563
algo: aStargpu 124 µs129 µs 225 µs121 µs 5414
algo: bellmanFordv3 17.0 ms17.2 ms 18.5 ms16.6 ms 36
algo: bellmanFordgpu 824 µs846 µs 1.95 ms789 µs 821
algo: kruskalv3 3.18 ms3.48 ms 6.88 ms3.13 ms 197
algo: kruskalgpu 133 µs139 µs 257 µs130 µs 4994
algo: tarjan SCCv3 5.28 ms5.65 ms 9.07 ms5.12 ms 119
algo: tarjan SCCgpu 159 µs203 µs 421 µs153 µs 3404
algo: hopcroft-tarjan biconnectedv3 19.9 ms20.9 ms 23.8 ms18.9 ms 30
algo: hopcroft-tarjan biconnectedgpu 805 µs863 µs 1.46 ms777 µs 807
algo: hierholzer (directed)v3 4.36 ms4.66 ms 7.62 ms4.20 ms 143
algo: hierholzer (directed)gpu 831 µs859 µs 1.28 ms803 µs 793
algo: betweennessCentrality (unweighted)v3 260 ms263 ms 267 ms257 ms 12
algo: betweennessCentrality (unweighted)gpu 20.6 ms21.1 ms 22.2 ms20.1 ms 29
algo: degreeCentralityNormalizedv3 3.43 ms3.70 ms 6.97 ms3.39 ms 182
algo: degreeCentralityNormalizedgpu 93.9 µs97.1 µs 149 µs92.2 µs 7194
algo: closenessCentrality (one root)v3 13.4 ms14.3 ms 17.4 ms13.0 ms 45
algo: closenessCentrality (one root)gpu 197 µs205 µs 360 µs188 µs 3407
algo: degreeCentrality (one root)v3 7.39 µs7.25 µs 8.05 µs6.59 µs 20
algo: degreeCentrality (one root)gpu 243 ns254 ns 475 ns237 ns 669
algo: pageRank (20 iters)v3 2.76 ms2.90 ms 6.43 ms2.67 ms 236
algo: pageRank (20 iters)gpu 40.1 µs45.8 µs 175 µs38.6 µs 15137
algo: closenessCentrality (weighted, one root)v3 14.4 ms15.2 ms 18.6 ms13.6 ms 42
algo: closenessCentrality (weighted, one root)gpu 260 µs269 µs 461 µs251 µs 2597
algo: floydWarshallv3 248 ms274 ms 384 ms245 ms 12
algo: floydWarshallgpu 125 ms128 ms 128 ms124 ms 12
algo: closenessCentralityNormalizedv3 274 ms274 ms 277 ms270 ms 12
algo: closenessCentralityNormalizedgpu 168 ms169 ms 173 ms165 ms 12
algo: markovClusteringv3 4.14 s4.38 s 4.66 s4.10 s 12
algo: markovClusteringgpu 3.75 s3.76 s 3.78 s3.74 s 12
algo: hierarchicalClustering (threshold)v3 34.8 ms35.1 ms 35.7 ms34.4 ms 16
algo: hierarchicalClustering (threshold)gpu 4.12 ms4.35 ms 7.94 ms4.03 ms 154
algo: kMeans (fixed centroids)v3 9.05 ms9.10 ms 9.77 ms8.80 ms 73
algo: kMeans (fixed centroids)gpu 1.96 ms2.01 ms 3.24 ms1.92 ms 345
algo: kMedoidsv3 377 ms315 ms 452 ms69.8 ms 12
algo: kMedoidsgpu 41.7 ms38.8 ms 44.9 ms20.6 ms 15
algo: fuzzyCMeansv3 78.5 ms79.7 ms 80.8 ms77.9 ms 12
algo: fuzzyCMeansgpu 6.95 ms7.03 ms 7.94 ms6.71 ms 95
algo: affinityPropagationv3 208 ms221 ms 282 ms203 ms 12
algo: affinityPropagationgpu 39.0 ms39.5 ms 41.0 ms38.4 ms 11
algo: kargerSteinv3 327 ms332 ms 332 ms316 ms 12
algo: kargerSteingpu 303 ms307 ms 315 ms297 ms 12
algo: betweennessCentrality (weighted)v3 730 ms729 ms 740 ms706 ms 12
algo: betweennessCentrality (weighted)gpu 79.8 ms81.7 ms 81.8 ms79.4 ms 12

mappers N=2,000 · 8.2 s

mapper: bulk write, color — cpu eval
2.58 ms
mapper: bulk write, color — gpu path
176 µs
mapper: bulk write, color + size — cpu eval
3.19 ms
mapper: bulk write, color + size — gpu color / cpu size
2.70 ms
mapper: bulk write, mapped labels (round-5 path) — label refresh
4.08 ms
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
mapper: bulk write, colorcpu eval 2.58 ms2.66 ms 4.36 ms2.48 ms 255
mapper: bulk write, colorgpu path 176 µs185 µs 328 µs172 µs 3779
mapper: bulk write, color + sizecpu eval 3.19 ms3.24 ms 3.87 ms3.00 ms 212
mapper: bulk write, color + sizegpu color / cpu size 2.70 ms2.77 ms 3.31 ms2.64 ms 250
mapper: bulk write, mapped labels (round-5 path)label refresh 4.08 ms4.34 ms 7.15 ms3.53 ms 156

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

layout: grid
154×
layout: preset
17×
layout: preset (fn form)
61×
layout: circle
13×
layout: concentric
26×
layout: breadthfirst
36×
layout: random
11×
layout: force (CPU executor, 20 iterations) — gpu
120 ms
layout: force seed — spectral vs scatter (20 iterations) — spectral (landmark MDS, the default)
109 ms
layout: force seed — spectral vs scatter (20 iterations) — scatter
57.0 ms
layout: plumbing (layoutPositions vs setPositions) — finisher
366 µs
layout: plumbing (layoutPositions vs setPositions) — bulk
31.6 µs
layout: contract fixed cost (empty impl vs bulk placement) — wrapper only
523 ns
layout: contract fixed cost (empty impl vs bulk placement) — wrapper + bulk write
39.3 µs
layout: scope (eles.layout, 10% of nodes)
10×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
layout: gridv3 11.5 ms12.4 ms 16.0 ms10.6 ms 51
layout: gridgpu 74.6 µs80.5 µs 365 µs72.7 µs 7961
layout: presetv3 5.78 ms6.46 ms 12.4 ms5.52 ms 101
layout: presetgpu 331 µs350 µs 712 µs294 µs 1837
layout: preset (fn form)v3 6.07 ms6.59 ms 11.6 ms5.39 ms 102
layout: preset (fn form)gpu 99.0 µs111 µs 389 µs97.1 µs 6181
layout: circlev3 10.0 ms10.4 ms 14.1 ms9.11 ms 58
layout: circlegpu 770 µs879 µs 2.82 ms757 µs 773
layout: concentricv3 30.0 ms29.5 ms 31.5 ms27.0 ms 18
layout: concentricgpu 1.18 ms1.34 ms 4.65 ms1.15 ms 507
layout: breadthfirstv3 400 ms413 ms 455 ms395 ms 12
layout: breadthfirstgpu 11.1 ms11.7 ms 16.1 ms10.1 ms 52
layout: randomv3 5.56 ms5.87 ms 9.27 ms5.30 ms 114
layout: randomgpu 520 µs579 µs 1.55 ms499 µs 1184
layout: force (CPU executor, 20 iterations)gpu 120 ms132 ms 143 ms104 ms 12
layout: force seed — spectral vs scatter (20 iterations)spectral (landmark MDS, the default) 109 ms111 ms 118 ms102 ms 12
layout: force seed — spectral vs scatter (20 iterations)scatter 57.0 ms57.1 ms 57.6 ms56.1 ms 9
layout: plumbing (layoutPositions vs setPositions)finisher 366 µs406 µs 924 µs357 µs 1707
layout: plumbing (layoutPositions vs setPositions)bulk 31.6 µs40.7 µs 255 µs29.5 µs 16081
layout: contract fixed cost (empty impl vs bulk placement)wrapper only 523 ns969 ns 3.86 µs502 ns 166
layout: contract fixed cost (empty impl vs bulk placement)wrapper + bulk write 39.3 µs41.1 µs 49.2 µs38.1 µs 12
layout: scope (eles.layout, 10% of nodes)v3 999 µs1.10 ms 2.01 ms946 µs 614
layout: scope (eles.layout, 10% of nodes)gpu 97.8 µs114 µs 271 µs95.7 µs 5980

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

style: sheet swap (compile + applyAll)
1.32×
style: compile vs compile + apply — compile only (in batch)
29.1 µs
style: compile vs compile + apply — compile + apply
10.1 ms
style: first apply on add (256-node band)
1.63×
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — flat
10.1 ms
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — compound
10.9 ms
style: applyAll — constant vs state-case (the 57.1d partition) — constant sheet
10.3 ms
style: applyAll — constant vs state-case (the 57.1d partition) — state-case sheet
10.4 ms
style: applyAll — state-case vs data-case (what the partition avoids) — state-case sheet
10.4 ms
style: applyAll — state-case vs data-case (what the partition avoids) — data-case sheet
14.5 ms
style: select+unselect 256-band — constant vs state-case sheet — constant sheet (skips restyle)
6.77 µs
style: select+unselect 256-band — constant vs state-case sheet — paint-only state sheet (round-61 diff path)
32.7 µs
style: select+unselect 256-band — constant vs state-case sheet — state-case sheet (all channels; full write)
595 µs
style: read one prop (color)
1.65×
style: read one prop (width)
2.2×
style: numericStyle
2.8×
style: renderedStyle (one prop)
15×
style: whole-object style()
6.1×
style: bypass set (ele.style name,value)
3.3×
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)
33.6 µs
style: select+unselect 256-band under the default sheet — bypass punch-out — 128 of 256 bypassed (punched out to merged writes)
333 µs
style: sheet swap (applyAll) — 0 vs 128 bypasses — no bypasses
11.1 ms
style: sheet swap (applyAll) — 0 vs 128 bypasses — 128 bypassed
11.4 ms
10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
style: sheet swap (compile + applyAll)v3 13.6 ms13.9 ms 18.0 ms12.5 ms 45
style: sheet swap (compile + applyAll)gpu 10.3 ms10.5 ms 12.9 ms9.90 ms 61
style: compile vs compile + applycompile only (in batch) 29.1 µs38.7 µs 75.1 µs23.8 µs 16724
style: compile vs compile + applycompile + apply 10.1 ms10.5 ms 15.8 ms9.89 ms 61
style: first apply on add (256-node band)v3 1.33 ms1.60 ms 6.80 ms1.11 ms 426
style: first apply on add (256-node band)gpu 814 µs916 µs 2.72 ms781 µs 754
style: applyAll, flat vs compound (100 parents — the 14.6 partition)flat 10.1 ms10.3 ms 12.5 ms9.91 ms 64
style: applyAll, flat vs compound (100 parents — the 14.6 partition)compound 10.9 ms11.0 ms 13.5 ms10.5 ms 59
style: applyAll — constant vs state-case (the 57.1d partition)constant sheet 10.3 ms10.6 ms 12.7 ms10.1 ms 62
style: applyAll — constant vs state-case (the 57.1d partition)state-case sheet 10.4 ms10.6 ms 12.4 ms10.1 ms 61
style: applyAll — state-case vs data-case (what the partition avoids)state-case sheet 10.4 ms10.5 ms 12.5 ms10.0 ms 60
style: applyAll — state-case vs data-case (what the partition avoids)data-case sheet 14.5 ms15.0 ms 17.6 ms14.0 ms 41
style: select+unselect 256-band — constant vs state-case sheetconstant sheet (skips restyle) 6.77 µs6.80 µs 7.00 µs6.66 µs 20
style: select+unselect 256-band — constant vs state-case sheetpaint-only state sheet (round-61 diff path) 32.7 µs33.8 µs 57.4 µs31.4 µs 19421
style: select+unselect 256-band — constant vs state-case sheetstate-case sheet (all channels; full write) 595 µs611 µs 884 µs564 µs 1095
style: read one prop (color)v3 95.0 ns107 ns 622 ns86.0 ns 1981731
style: read one prop (color)gpu 57.6 ns63.0 ns 134 ns55.7 ns 2708
style: read one prop (width)v3 115 ns122 ns 433 ns95.0 ns 1876987
style: read one prop (width)gpu 52.6 ns57.3 ns 307 ns50.9 ns 2974
style: numericStylev3 140 ns140 ns 393 ns103 ns 1743803
style: numericStylegpu 49.9 ns54.0 ns 112 ns48.4 ns 3160
style: renderedStyle (one prop)v3 931 ns1.01 µs 2.07 µs891 ns 514253
style: renderedStyle (one prop)gpu 62.8 ns67.3 ns 175 ns60.2 ns 2541
style: whole-object style()v3 83.5 µs88.9 µs 184 µs82.2 µs 7825
style: whole-object style()gpu 13.7 µs15.4 µs 51.9 µs13.1 µs 43954
style: bypass set (ele.style name,value)v3 10.2 µs10.2 µs 10.5 µs9.88 µs 11
style: bypass set (ele.style name,value)gpu 3.10 µs3.36 µs 4.22 µs2.97 µs 45
style: bypass set + removeStyle round-tripv3 20.3 µs21.9 µs 22.3 µs19.7 µs 12
style: bypass set + removeStyle round-tripgpu 4.74 µs4.95 µs 5.55 µs4.60 µs 29
style: select+unselect 256-band under the default sheet — bypass punch-outno bypasses (diff path; the O(0) gate row) 33.6 µs35.3 µs 72.4 µs32.2 µs 19548
style: select+unselect 256-band under the default sheet — bypass punch-out128 of 256 bypassed (punched out to merged writes) 333 µs349 µs 536 µs327 µs 1999
style: sheet swap (applyAll) — 0 vs 128 bypassesno bypasses 11.1 ms11.4 ms 14.3 ms10.8 ms 57
style: sheet swap (applyAll) — 0 vs 128 bypasses128 bypassed 11.4 ms11.5 ms 12.5 ms11.1 ms 55

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

style( 'background-color' ) (was #4 in the switch)
1.07×
style( 'border-width' ) (was #6 in the switch)
1.26×
style( 'text-wrap' ) (was #73 in the switch)
1.66×
style( 'text-max-width' ) (was #74 in the switch)
1.67×
style( 'taxi-radius' ) (was #142 in the switch)
1.21×
style( 'target-distance-from-node' ) (was #150 in the switch)
1.21×
whole-object style() (gpu-only: v3 returns a different shape) — gpu node
13.3 µs
whole-object style() (gpu-only: v3 returns a different shape) — gpu edge
14.7 µs
colour-valued vs numeric reads (the string build) — gpu background-color (colour)
76.1 ns
colour-valued vs numeric reads (the string build) — gpu border-color (colour)
73.6 ns
colour-valued vs numeric reads (the string build) — gpu border-width (number)
66.4 ns
colour-valued vs numeric reads (the string build) — gpu width (number)
62.0 ns
the getters that ride readProp — gpu numericStyle( width )
61.6 ns
the getters that ride readProp — gpu effectiveOpacity()
21.7 ns
the getters that ride readProp — gpu renderedStyle( width )
79.4 ns
10 ns100 ns1 µs10 µs100 µs
All stats (table view)
groupbenchp50avgp99minsamples
style( 'background-color' ) (was #4 in the switch)v3 58.9 ns61.8 ns 121 ns56.9 ns 2772
style( 'background-color' ) (was #4 in the switch)gpu 54.8 ns57.5 ns 100 ns52.6 ns 2978
style( 'border-width' ) (was #6 in the switch)v3 63.6 ns65.6 ns 107 ns61.0 ns 2617
style( 'border-width' ) (was #6 in the switch)gpu 50.5 ns52.2 ns 80.9 ns48.5 ns 3275
style( 'text-wrap' ) (was #73 in the switch)v3 59.6 ns61.3 ns 86.7 ns57.3 ns 2789
style( 'text-wrap' ) (was #73 in the switch)gpu 35.8 ns37.2 ns 69.5 ns35.0 ns 4607
style( 'text-max-width' ) (was #74 in the switch)v3 58.1 ns60.6 ns 98.7 ns56.3 ns 2832
style( 'text-max-width' ) (was #74 in the switch)gpu 34.8 ns36.1 ns 66.1 ns33.8 ns 4756
style( 'taxi-radius' ) (was #142 in the switch)v3 59.9 ns61.5 ns 102 ns59.1 ns 2794
style( 'taxi-radius' ) (was #142 in the switch)gpu 49.6 ns54.7 ns 113 ns48.4 ns 3117
style( 'target-distance-from-node' ) (was #150 in the switch)v3 60.2 ns62.4 ns 90.7 ns58.5 ns 2751
style( 'target-distance-from-node' ) (was #150 in the switch)gpu 49.6 ns50.6 ns 86.5 ns48.8 ns 3381
whole-object style() (gpu-only: v3 returns a different shape)gpu node 13.3 µs13.9 µs 24.6 µs12.6 µs 48541
whole-object style() (gpu-only: v3 returns a different shape)gpu edge 14.7 µs15.5 µs 34.1 µs14.1 µs 43147
colour-valued vs numeric reads (the string build)gpu background-color (colour) 76.1 ns80.2 ns 163 ns73.6 ns 2129
colour-valued vs numeric reads (the string build)gpu border-color (colour) 73.6 ns76.0 ns 110 ns71.8 ns 2253
colour-valued vs numeric reads (the string build)gpu border-width (number) 66.4 ns69.5 ns 107 ns65.6 ns 2461
colour-valued vs numeric reads (the string build)gpu width (number) 62.0 ns64.0 ns 95.3 ns59.4 ns 2672
the getters that ride readPropgpu numericStyle( width ) 61.6 ns62.9 ns 78.0 ns60.0 ns 2647
the getters that ride readPropgpu effectiveOpacity() 21.7 ns22.2 ns 32.5 ns20.9 ns 7701
the getters that ride readPropgpu renderedStyle( width ) 79.4 ns81.7 ns 111 ns78.0 ns 2091

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

load: init from the definition form (construct + dispose)
6.1×
load: v4 ingest forms (construct + dispose) — definition form
21.6 ms
load: v4 ingest forms (construct + dispose) — columnar form
12.6 ms
load: v4 ingest forms (construct + dispose) — wire buffer
11.8 ms
load: v4 ingest forms (construct + dispose) — def clone alone (control)
300 µs
load: conversion — toColumnarElements
706 µs
load: conversion — serializeElements (from columnar)
190 µs
load: conversion — serializeElements (from defs)
869 µs
load: conversion — deserializeElements
4.60 µs
load: export from a live graph — cy.serialize() (wire)
501 µs
load: export from a live graph — cy.json() (v4)
717 µs
load: cy.json()
2.8×
load: add a 256-node band (add + remove)
1.37×
load: add a 256-node band, v4 forms — definition form
2.73 ms
load: add a 256-node band, v4 forms — columnar form
2.37 ms
load: add a 256-node band, v4 forms — wire buffer
2.31 ms
1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
load: init from the definition form (construct + dispose)v3 136 ms153 ms 177 ms134 ms 12
load: init from the definition form (construct + dispose)gpu 22.4 ms23.2 ms 26.9 ms19.9 ms 25
load: v4 ingest forms (construct + dispose)definition form 21.6 ms22.1 ms 25.6 ms19.6 ms 27
load: v4 ingest forms (construct + dispose)columnar form 12.6 ms13.4 ms 23.3 ms12.0 ms 46
load: v4 ingest forms (construct + dispose)wire buffer 11.8 ms13.1 ms 23.6 ms11.4 ms 48
load: v4 ingest forms (construct + dispose)def clone alone (control) 300 µs612 µs 12.7 ms206 µs 1076
load: conversiontoColumnarElements 706 µs797 µs 2.23 ms673 µs 850
load: conversionserializeElements (from columnar) 190 µs364 µs 955 µs173 µs 1908
load: conversionserializeElements (from defs) 869 µs902 µs 1.73 ms858 µs 771
load: conversiondeserializeElements 4.60 µs4.49 µs 5.78 µs3.29 µs 29
load: export from a live graphcy.serialize() (wire) 501 µs578 µs 2.04 ms485 µs 1189
load: export from a live graphcy.json() (v4) 717 µs1.04 ms 6.77 ms683 µs 640
load: cy.json()v3 2.02 ms2.35 ms 5.55 ms1.97 ms 289
load: cy.json()gpu 735 µs831 µs 2.77 ms726 µs 837
load: add a 256-node band (add + remove)v3 3.66 ms4.38 ms 11.5 ms3.27 ms 150
load: add a 256-node band (add + remove)gpu 2.67 ms2.89 ms 7.20 ms2.14 ms 233
load: add a 256-node band, v4 formsdefinition form 2.73 ms2.78 ms 4.58 ms2.16 ms 246
load: add a 256-node band, v4 formscolumnar form 2.37 ms2.43 ms 3.35 ms1.95 ms 279
load: add a 256-node band, v4 formswire buffer 2.31 ms2.42 ms 3.33 ms1.88 ms 284

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

pick: hit (the walk; one inside-test) — zoom 1
21.0 µs
pick: hit (the walk; one inside-test) — zoom 2
21.3 µs
pick: miss walk — exact vs 24 px touch halo (57.9) — exact
47.6 µs
pick: miss walk — exact vs 24 px touch halo (57.9) — padPx 24
45.2 µs
pick: shape inside-test, 2000 coincident misses — ellipse
87.0 µs
pick: shape inside-test, 2000 coincident misses — star
234 µs
pick: shape inside-test, 2000 coincident misses — round-hexagon
808 µs
pick: shape inside-test, 2000 coincident misses — barrel
683 µs
pick: shape inside-test, 2000 coincident misses — cut-rectangle
100 µs
pick: shape inside-test, 2000 coincident misses — polygon
211 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 1
807 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 2
793 µs
pick: background miss (full highWater walk) — gpu
45.6 µs
pick: label box in the scan (text-events) — text-events: no
45.8 µs
pick: label box in the scan (text-events) — text-events: yes
125 µs
box: elementsInBox by covered fraction — 10%
149 µs
box: elementsInBox by covered fraction — 50%
200 µs
box: elementsInBox by covered fraction — 100%
344 µs
box: label containment (boxSelectionIncludesLabels) — off
238 µs
box: label containment (boxSelectionIncludesLabels) — on
263 µs
box: overlap vs contain (straight edges) — contain
245 µs
box: overlap vs contain (straight edges) — overlap
487 µs
box: overlap vs contain (curved edges — the segment walk) — contain
1.29 ms
box: overlap vs contain (curved edges — the segment walk) — overlap
2.24 ms
bounds: whole-graph boundingBox()
6.3×
bounds: boundingBox, labels in vs out (v4) — includeLabels: true (default)
1.30 ms
bounds: boundingBox, labels in vs out (v4) — includeLabels: false
747 µs
bounds: cy.fit() (whole-graph scan)
33×
bounds: getFitViewport() (compute without committing)
33×
bounds: boundingBoxAt (v4 only) — gpu
2.52 ms
bounds: one node boundingBox()
1.63×
bounds: labelBoundingBox (v4 only) — gpu
426 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)
146 µs
100 ns1 µs10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
pick: hit (the walk; one inside-test)zoom 1 21.0 µs21.6 µs 37.0 µs20.2 µs 31813
pick: hit (the walk; one inside-test)zoom 2 21.3 µs21.8 µs 22.1 µs21.0 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)exact 47.6 µs47.8 µs 48.4 µs46.5 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)padPx 24 45.2 µs46.7 µs 88.9 µs43.0 µs 14852
pick: shape inside-test, 2000 coincident missesellipse 87.0 µs89.9 µs 142 µs83.5 µs 7760
pick: shape inside-test, 2000 coincident missesstar 234 µs249 µs 373 µs229 µs 2773
pick: shape inside-test, 2000 coincident missesround-hexagon 808 µs823 µs 1.09 ms775 µs 850
pick: shape inside-test, 2000 coincident missesbarrel 683 µs697 µs 843 µs663 µs 983
pick: shape inside-test, 2000 coincident missescut-rectangle 100 µs102 µs 150 µs95.4 µs 6830
pick: shape inside-test, 2000 coincident missespolygon 211 µs218 µs 351 µs204 µs 3215
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 1 807 µs820 µs 1.07 ms776 µs 853
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 2 793 µs807 µs 965 µs771 µs 868
pick: background miss (full highWater walk)gpu 45.6 µs46.1 µs 46.7 µs44.9 µs 12
pick: label box in the scan (text-events)text-events: no 45.8 µs46.3 µs 46.7 µs45.4 µs 12
pick: label box in the scan (text-events)text-events: yes 125 µs130 µs 240 µs121 µs 5348
box: elementsInBox by covered fraction10% 149 µs155 µs 310 µs145 µs 4511
box: elementsInBox by covered fraction50% 200 µs205 µs 294 µs192 µs 3403
box: elementsInBox by covered fraction100% 344 µs361 µs 846 µs332 µs 1928
box: label containment (boxSelectionIncludesLabels)off 238 µs247 µs 382 µs235 µs 2832
box: label containment (boxSelectionIncludesLabels)on 263 µs276 µs 624 µs254 µs 2528
box: overlap vs contain (straight edges)contain 245 µs256 µs 493 µs238 µs 2697
box: overlap vs contain (straight edges)overlap 487 µs495 µs 923 µs420 µs 1409
box: overlap vs contain (curved edges — the segment walk)contain 1.29 ms1.33 ms 2.43 ms1.23 ms 522
box: overlap vs contain (curved edges — the segment walk)overlap 2.24 ms2.29 ms 2.99 ms2.16 ms 303
bounds: whole-graph boundingBox()v3 8.11 ms8.27 ms 10.8 ms7.64 ms 79
bounds: whole-graph boundingBox()gpu 1.28 ms1.31 ms 1.57 ms1.27 ms 523
bounds: boundingBox, labels in vs out (v4)includeLabels: true (default) 1.30 ms1.32 ms 1.92 ms1.27 ms 526
bounds: boundingBox, labels in vs out (v4)includeLabels: false 747 µs760 µs 1.01 ms740 µs 920
bounds: cy.fit() (whole-graph scan)v3 7.77 ms7.96 ms 9.37 ms7.40 ms 83
bounds: cy.fit() (whole-graph scan)gpu 238 µs247 µs 318 µs235 µs 2819
bounds: getFitViewport() (compute without committing)v3 7.73 ms7.87 ms 8.93 ms7.48 ms 85
bounds: getFitViewport() (compute without committing)gpu 236 µs247 µs 381 µs233 µs 2825
bounds: boundingBoxAt (v4 only)gpu 2.52 ms2.64 ms 3.51 ms2.45 ms 257
bounds: one node boundingBox()v3 1.65 µs1.67 µs 1.99 µs1.61 µs 96
bounds: one node boundingBox()gpu 1.01 µs1.05 µs 1.62 µs975 ns 157
bounds: labelBoundingBox (v4 only)gpu 426 ns475 ns 937 ns399 ns 352
bounds: compound + taxi conservative scan (round 54, v4 only)warm (curve bbs memoized) 74.4 µs78.1 µs 175 µs72.2 µs 8934
bounds: compound + taxi conservative scan (round 54, v4 only)cold (geometry write per call) 146 µs151 µs 217 µs145 µs 4614

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

data: bulk write, numeric column
20×
data: bulk write, dictionary string column (4 values)
17×
data: bulk write, one new dictionary entry per pass
17×
data: bulk write, object column (plain-array fallback)
21×
data: removeData (whole collection)
7.8×
data: read one numeric key
1.40×
data: read one string key (dictionary decode)
1.30×
data: read the whole object
2.2×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })
14×
query: data comparison ([weight > 3] vs { gt })
11×
query: two keys AND-ed
12×
query: membership ([bucket in ...] vs { in })
16×
query: predicate function (both sides)
7.0×
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.71 ms1.76 ms 3.00 ms1.65 ms 378
data: bulk write, numeric columngpu 84.7 µs88.6 µs 140 µs82.6 µs 7896
data: bulk write, dictionary string column (4 values)v3 1.69 ms1.76 ms 2.12 ms1.66 ms 380
data: bulk write, dictionary string column (4 values)gpu 101 µs107 µs 314 µs96.7 µs 6513
data: bulk write, one new dictionary entry per passv3 1.75 ms1.84 ms 3.05 ms1.69 ms 372
data: bulk write, one new dictionary entry per passgpu 100 µs106 µs 237 µs94.9 µs 6604
data: bulk write, object column (plain-array fallback)v3 1.72 ms1.81 ms 3.00 ms1.68 ms 381
data: bulk write, object column (plain-array fallback)gpu 83.9 µs86.1 µs 126 µs81.7 µs 8122
data: removeData (whole collection)v3 2.57 ms2.62 ms 3.88 ms2.49 ms 261
data: removeData (whole collection)gpu 329 µs345 µs 901 µs325 µs 2002
data: read one numeric keyv3 38.4 ns39.9 ns 118 ns37.2 ns 4304
data: read one numeric keygpu 27.4 ns28.9 ns 44.4 ns26.6 ns 5918
data: read one string key (dictionary decode)v3 41.5 ns43.3 ns 86.9 ns39.5 ns 3968
data: read one string key (dictionary decode)gpu 32.0 ns33.5 ns 71.7 ns27.9 ns 5104
data: read the whole objectv3 46.8 ns48.6 ns 81.4 ns44.5 ns 3538
data: read the whole objectgpu 21.1 ns22.7 ns 48.3 ns20.5 ns 7502
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })v3 661 µs694 µs 1.22 ms645 µs 1006
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })gpu 47.5 µs50.4 µs 112 µs40.9 µs 13280
query: data comparison ([weight > 3] vs { gt })v3 784 µs814 µs 1.34 ms740 µs 856
query: data comparison ([weight > 3] vs { gt })gpu 70.1 µs73.2 µs 213 µs57.5 µs 9488
query: two keys AND-edv3 786 µs817 µs 1.27 ms777 µs 852
query: two keys AND-edgpu 66.2 µs69.7 µs 140 µs65.1 µs 9981
query: membership ([bucket in ...] vs { in })v3 1.01 ms1.02 ms 1.36 ms987 µs 680
query: membership ([bucket in ...] vs { in })gpu 63.8 µs67.8 µs 132 µs61.8 µs 10188
query: predicate function (both sides)v3 648 µs665 µs 873 µs631 µs 1049
query: predicate function (both sides)gpu 92.1 µs95.4 µs 157 µs89.6 µs 7305
query: structural, parents (:parent vs { parent: true })v3 523 µs530 µs 638 µs498 µs 1319
query: structural, parents (:parent vs { parent: true })gpu 15.5 µs16.4 µs 19.5 µs15.1 µs 12
query: structural, childless (:childless vs { parent: false })v3 808 µs837 µs 1.12 ms786 µs 834
query: structural, childless (:childless vs { parent: false })gpu 60.9 µs72.9 µs 231 µs57.4 µs 9347
query: structural, orphans (:orphan vs { child: false })v3 503 µs518 µs 986 µs489 µs 1343
query: structural, orphans (:orphan vs { child: false })gpu 15.3 µs16.2 µs 16.5 µs15.1 µs 12

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

emit: position write, no listeners
25×
emit: 1 core listener
8.5×
emit: 1 element (ref-qualified) listener
7.6×
emit: delegated (v3 selector vs v4 predicate)
7.9×
emit: 10 core listeners
6.1×
emit: on() + off() round-trip
2.3×
emit: flat vs phased (compound bubbling, 14.5) — orphan (flat emit)
310 ns
emit: flat vs phased (compound bubbling, 14.5) — child of 2 ancestors (phased)
869 ns
emit: flat vs phased, no listeners — orphan (flat)
83.9 ns
emit: flat vs phased, no listeners — child (phased)
488 ns
anim: start + stop, one element
1.29×
anim: start against a running animation (round-21 eviction) — disjoint channels (composes)
1.32 µs
anim: start against a running animation (round-21 eviction) — overlapping channels (evicts)
898 ns
anim: start + stop, 512-node collection
3.0×
anim: delay() (no channels touched)
1.57×
anim: controls (v4 only) — pause + resume
479 ns
anim: controls (v4 only) — reverse
905 ns
anim: viewport animate + stop
3.0×
10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
emit: position write, no listenersv3 1.33 µs1.41 µs 1.99 µs1.28 µs 111
emit: position write, no listenersgpu 53.0 ns56.3 ns 104 ns50.3 ns 3035
emit: 1 core listenerv3 1.42 µs1.45 µs 1.88 µs1.37 µs 105
emit: 1 core listenergpu 166 ns174 ns 287 ns162 ns 906
emit: 1 element (ref-qualified) listenerv3 1.42 µs1.50 µs 2.38 µs1.38 µs 102
emit: 1 element (ref-qualified) listenergpu 186 ns198 ns 376 ns180 ns 801
emit: delegated (v3 selector vs v4 predicate)v3 1.48 µs1.51 µs 1.76 µs1.45 µs 103
emit: delegated (v3 selector vs v4 predicate)gpu 188 ns206 ns 1.08 µs181 ns 779
emit: 10 core listenersv3 1.97 µs1.98 µs 2.15 µs1.90 µs 76
emit: 10 core listenersgpu 323 ns327 ns 377 ns309 ns 476
emit: on() + off() round-tripv3 480 ns539 ns 1.54 µs420 ns 302
emit: on() + off() round-tripgpu 213 ns256 ns 871 ns180 ns 641
emit: flat vs phased (compound bubbling, 14.5)orphan (flat emit) 310 ns357 ns 2.21 µs280 ns 966731
emit: flat vs phased (compound bubbling, 14.5)child of 2 ancestors (phased) 869 ns929 ns 1.27 µs846 ns 170
emit: flat vs phased, no listenersorphan (flat) 83.9 ns93.0 ns 675 ns81.3 ns 1816
emit: flat vs phased, no listenerschild (phased) 488 ns524 ns 1.85 µs484 ns 316
anim: start + stop, one elementv3 821 ns1.19 µs 3.47 µs765 ns 418849
anim: start + stop, one elementgpu 635 ns1.06 µs 4.53 µs587 ns 460806
anim: start against a running animation (round-21 eviction)disjoint channels (composes) 1.32 µs2.00 µs 4.24 µs1.09 µs 75
anim: start against a running animation (round-21 eviction)overlapping channels (evicts) 898 ns1.49 µs 3.61 µs796 ns 100
anim: start + stop, 512-node collectionv3 298 µs452 µs 1.78 ms287 µs 1446
anim: start + stop, 512-node collectiongpu 99.9 µs114 µs 210 µs95.9 µs 5815
anim: delay() (no channels touched)v3 647 ns971 ns 3.41 µs629 ns 169
anim: delay() (no channels touched)gpu 411 ns720 ns 2.67 µs399 ns 224
anim: controls (v4 only)pause + resume 479 ns752 ns 2.65 µs451 ns 203
anim: controls (v4 only)reverse 905 ns1.52 µs 3.45 µs878 ns 100
anim: viewport animate + stopv3 575 ns860 ns 2.99 µs553 ns 188
anim: viewport animate + stopgpu 189 ns224 ns 1.38 µs187 ns 744

store N=2,000 · 20.9 s

id index: set x 2000 (build) — gpu
290 µs
id index: single-key operations — get (probe)
63.0 ns
id index: single-key operations — has
54.9 ns
id index: single-key operations — idAt (memoized hit)
8.97 ns
id index: single-key operations — hashAt
7.01 ns
id index: remove + re-set (churn, drives the round-11 reclaim) — gpu
232 ns
adjacency: rebuild (4000 edges, two counting passes) — gpu
57.2 µs
adjacency: reads — outDegree (O(1))
6.22 ns
adjacency: reads — outEdges
44.6 ns
adjacency: reads — connectedEdges
118 ns
adjacency: addEdge + removeEdge (the overlay path) — gpu
135 ns
blob: write x 2000 (build) — gpu
103 µs
blob: single-record operations — rewrite in place (same length)
30.3 ns
blob: single-record operations — offsetOf
4.28 ns
blob: single-record operations — free + rewrite
152 ns
dirty: mark (per-write span coalescing) — contiguous marks
13.0 ns
dirty: mark (per-write span coalescing) — scattered marks
18.1 ns
dirty: take (a frame's drain) — gpu
594 ns
images: registry bookkeeping — acquire (existing url)
210 ns
images: registry bookkeeping — acquire (new url) + release
534 ns
charts: sheet apply, chart vs no chart — no chart
10.3 ms
charts: sheet apply, chart vs no chart — pie from data (blob record per node)
10.9 ms
charts: data write refreshing chart-values — gpu
2.48 ms
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
id index: set x 2000 (build)gpu 290 µs305 µs 480 µs280 µs 2302
id index: single-key operationsget (probe) 63.0 ns66.9 ns 124 ns57.6 ns 2561
id index: single-key operationshas 54.9 ns56.4 ns 89.4 ns49.6 ns 3030
id index: single-key operationsidAt (memoized hit) 8.97 ns9.24 ns 17.2 ns8.71 ns 18440
id index: single-key operationshashAt 7.01 ns7.22 ns 14.0 ns6.91 ns 23448
id index: remove + re-set (churn, drives the round-11 reclaim)gpu 232 ns244 ns 335 ns228 ns 686
adjacency: rebuild (4000 edges, two counting passes)gpu 57.2 µs65.7 µs 234 µs54.8 µs 10577
adjacency: readsoutDegree (O(1)) 6.22 ns6.37 ns 11.0 ns5.90 ns 26608
adjacency: readsoutEdges 44.6 ns45.4 ns 56.8 ns43.7 ns 3767
adjacency: readsconnectedEdges 118 ns179 ns 2.04 µs113 ns 935
adjacency: addEdge + removeEdge (the overlay path)gpu 135 ns139 ns 178 ns134 ns 1224
blob: write x 2000 (build)gpu 103 µs124 µs 647 µs100 µs 5606
blob: single-record operationsrewrite in place (same length) 30.3 ns30.9 ns 44.9 ns29.5 ns 5519
blob: single-record operationsoffsetOf 4.28 ns4.40 ns 8.08 ns4.18 ns 38209
blob: single-record operationsfree + rewrite 152 ns177 ns 582 ns147 ns 962
dirty: mark (per-write span coalescing)contiguous marks 13.0 ns13.5 ns 21.8 ns12.4 ns 12542
dirty: mark (per-write span coalescing)scattered marks 18.1 ns18.5 ns 27.1 ns17.5 ns 9171
dirty: take (a frame's drain)gpu 594 ns695 ns 1.33 µs575 ns 237
images: registry bookkeepingacquire (existing url) 210 ns212 ns 250 ns206 ns 802
images: registry bookkeepingacquire (new url) + release 534 ns611 ns 2.87 µs523 ns 270
charts: sheet apply, chart vs no chartno chart 10.3 ms10.4 ms 11.9 ms9.93 ms 61
charts: sheet apply, chart vs no chartpie from data (blob record per node) 10.9 ms11.0 ms 12.7 ms10.6 ms 59
charts: data write refreshing chart-valuesgpu 2.48 ms2.55 ms 4.25 ms2.39 ms 267

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

viewport: zoom() get
4.7×
viewport: zoom( n ) set
1.91×
viewport: pan() get
1.05×
viewport: pan( p ) set
1.96×
viewport: panBy()
1.83×
viewport: extent()
1.52×
viewport: renderedExtent()
1.68×
viewport: width() + height() + size() (3 calls)
2.8×
viewport: minZoom/maxZoom get (2 calls)
15×
viewport: center( eles )
19×
viewport: reset()
106×
viewport: viewport({ zoom, pan })
59×
viewport: getCenterPan( eles ) — gpu
6.21 µs
core: instanceString + headless + styleEnabled (3 calls)
1.24×
core: hasElementWithId + hasCompoundNodes (2 calls)
1.19×
core: options()
85×
core: mutableElements() (v4 materializes; v3 is O(1))
1.39×
core: gating getters (5 calls)
1.11×
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)
8472×
core: graph scratch() set + get (v3 restyles the graph)
17105×
core: batch( fn ) (empty)
6.3×
core: startBatch + endBatch + batching
5.7×
core: collection()
7.9×
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)
2.4×
collection: slice()
2.2×
collection: toArray()
12×
collection: sort( fn )
1.61×
collection: reduce( fn )
1.37×
collection: min + max ( fn ) (2 calls)
1.95×
collection: some + every (2 calls)
1.61×
collection: same + anySame + contains (3 calls)
77×
collection: allAre (all match: the full walk)
1.50×
collection: is (none match: the full walk)
2.4×
collection: union
5.7×
collection: intersection
29×
collection: difference
29×
collection: symmetricDifference
3.8×
collection: absoluteComplement
14×
collection: byGroup
3.0×
collection: diff
3.3×
collection: indexOf
1.24×
traversal: openNeighborhood + closedNeighborhood (2 calls)
3.0×
traversal: connectedNodes
3.7×
traversal: sources + targets (2 calls)
3.4×
traversal: source() + target() (2 calls)
1.34×
traversal: edgesWith
1.21×
traversal: edgesTo
1.18×
traversal: parallelEdges + codirectedEdges (2 calls)
2.9×
traversal: roots + leaves (2 calls)
17×
traversal: allAreNeighbors
5.1×
traversal: isLoop + isSimple (2 calls)
2.5×
degree: indegree + outdegree (2 calls)
68×
degree: minDegree + maxDegree (2 calls)
36×
degree: minIndegree + maxOutdegree (2 calls)
21×
dimensions: renderedPosition get
2.6×
dimensions: relativePosition get
11×
dimensions: width + height + outerWidth + outerHeight (4 calls)
2.9×
dimensions: rendered dims (4 calls)
3.3×
dimensions: renderedBoundingBox
1.98×
dimensions: midpoint + renderedMidpoint (2 calls) — gpu
1.13 µs
dimensions: source/targetEndpoint (2 calls) — gpu
379 ns
dimensions: rendered source/targetEndpoint (2 calls) — gpu
389 ns
dimensions: shift + silentShift (round-trip)
61×
dimensions: silentPosition
15×
dimensions: positions( fn ) over 100
45×
dimensions: padding + paddedWidth + paddedHeight (3 calls)
14×
curves: isBundledBezier — gpu
20.5 ns
curves: controlPoints + renderedControlPoints (2 calls) — gpu
540 ns
curves: segmentPoints (undefined for bezier) — gpu
33.1 ns
compound: parent + parents + ancestors (3 calls)
3.9×
compound: children + descendants + siblings (3 calls)
4.9×
compound: orphans + nonorphans (2 calls)
7.0×
compound: commonAncestors
130×
compound: isParent/isChild/isChildless/isOrphan (4 calls)
1.53×
flags: select + unselect + selected (band)
15×
flags: selectify + unselectify + selectable
98×
flags: lock + unlock + locked
96×
flags: grabify + ungrabify + grabbable
96×
flags: show + hide + visible
239×
flags: active/activate/unactivate (3 calls)
17×
flags: panify + unpanify + pannable
95×
flags: takesUpSpace + interactive + transparent (3 calls)
2.7×
flags: effectiveOpacity
2.3×
element data: scratch get + set
7.8×
element data: json() one element
1.90×
element data: jsons() over 100
1.42×
element data: label() — gpu
15.2 ns
core: batchData()
8.5×
core: animated()
4.9×
core: zoomRange get — gpu
2.20 ns
core: forceRender() (headless no-op)
16×
core: resize() / invalidateSize()
2.3×
core: onRender + offRender
2.5×
core: removeScratch()
9872×
core: selectionType get
1.97×
core: isReady()
2.2×
core: window()
2.8×
core: container()
2.6×
core: destroyed()
2.2×
core: removeAllListeners()
8.6×
collection: cy()
3.6×
collection: indexOfId()
1.53×
collection: removed() + inside() (2 calls)
1.11×
collection: silentPositions( fn ) over 100
31×
collection: animated()
2.8×
collection: delayAnimation()
2.9×
collection: removeScratch()
9.1×
collection: component()
44×
collection: layoutDimensions()
3.9×
degree: maxIndegree + minOutdegree (2 calls)
22×
flags: grabbed + hidden + inactive (3 calls)
2.0×
curves: renderedSegmentPoints — gpu
37.3 ns
layout contract: edgeSlots + endpoints + degreeOf — gpu
34.6 µs
formats: isColumnarElements + isSerializedElements + isPackedIds — gpu
4.61 ns
0.100 ns1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
viewport: zoom() getv3 5.72 ns5.79 ns 7.80 ns5.63 ns 29100
viewport: zoom() getgpu 1.21 ns1.25 ns 1.94 ns1.21 ns 127035
viewport: zoom( n ) setv3 621 ns631 ns 833 ns603 ns 262
viewport: zoom( n ) setgpu 326 ns333 ns 458 ns309 ns 504
viewport: pan() getv3 5.27 ns5.51 ns 12.7 ns5.06 ns 30537
viewport: pan() getgpu 5.01 ns5.18 ns 11.3 ns4.85 ns 32528
viewport: pan( p ) setv3 647 ns675 ns 1.05 µs633 ns 247
viewport: pan( p ) setgpu 330 ns334 ns 392 ns317 ns 495
viewport: panBy()v3 598 ns617 ns 890 ns578 ns 272
viewport: panBy()gpu 326 ns339 ns 523 ns315 ns 489
viewport: extent()v3 29.2 ns45.7 ns 263 ns28.2 ns 3684
viewport: extent()gpu 19.3 ns26.3 ns 106 ns18.3 ns 6414
viewport: renderedExtent()v3 27.4 ns28.7 ns 50.8 ns26.4 ns 5894
viewport: renderedExtent()gpu 16.3 ns23.2 ns 99.7 ns15.1 ns 7280
viewport: width() + height() + size() (3 calls)v3 20.9 ns21.6 ns 42.8 ns20.0 ns 7893
viewport: width() + height() + size() (3 calls)gpu 7.39 ns7.84 ns 15.9 ns7.04 ns 21500
viewport: minZoom/maxZoom get (2 calls)v3 15.0 ns15.5 ns 20.5 ns14.5 ns 11006
viewport: minZoom/maxZoom get (2 calls)gpu 0.999 ns1.04 ns 1.44 ns0.997 ns 151502
viewport: center( eles )v3 120 µs125 µs 202 µs113 µs 5558
viewport: center( eles )gpu 6.20 µs6.28 µs 6.66 µs6.07 µs 22
viewport: reset()v3 931 ns1.02 µs 1.67 µs905 ns 162
viewport: reset()gpu 8.76 ns9.06 ns 16.7 ns8.39 ns 18517
viewport: viewport({ zoom, pan })v3 928 ns1.02 µs 1.66 µs906 ns 163
viewport: viewport({ zoom, pan })gpu 15.9 ns16.8 ns 38.9 ns15.1 ns 10132
viewport: getCenterPan( eles )gpu 6.21 µs6.23 µs 6.36 µs6.12 µs 24
core: instanceString + headless + styleEnabled (3 calls)v3 32.2 ns33.3 ns 54.2 ns30.9 ns 5120
core: instanceString + headless + styleEnabled (3 calls)gpu 26.0 ns26.9 ns 44.8 ns24.9 ns 6341
core: hasElementWithId + hasCompoundNodes (2 calls)v3 37.5 ns38.7 ns 59.3 ns35.7 ns 4425
core: hasElementWithId + hasCompoundNodes (2 calls)gpu 31.5 ns32.8 ns 55.8 ns30.8 ns 5200
core: options()v3 90.6 ns93.0 ns 128 ns87.4 ns 1836
core: options()gpu 1.07 ns1.15 ns 2.24 ns1.03 ns 138645
core: mutableElements() (v4 materializes; v3 is O(1))v3 3.26 ns3.36 ns 4.64 ns3.21 ns 49646
core: mutableElements() (v4 materializes; v3 is O(1))gpu 2.35 ns2.43 ns 3.92 ns2.25 ns 68259
core: gating getters (5 calls)v3 15.2 ns15.6 ns 24.1 ns14.8 ns 10865
core: gating getters (5 calls)gpu 13.6 ns14.3 ns 34.6 ns12.3 ns 11886
core: gating setters round-trip (autolock/autoungrabify/autounselectify)v3 11.3 ns11.8 ns 21.5 ns10.7 ns 14392
core: gating setters round-trip (autolock/autoungrabify/autounselectify)gpu 6.01 ns6.50 ns 16.2 ns5.73 ns 26009
core: interaction tuning getters (5 calls)gpu 7.30 ns7.57 ns 14.2 ns7.00 ns 22343
core: graph data() set + get (v3 restyles the graph)v3 2.84 ms2.91 ms 4.00 ms2.76 ms 237
core: graph data() set + get (v3 restyles the graph)gpu 335 ns345 ns 538 ns327 ns 491
core: graph scratch() set + get (v3 restyles the graph)v3 2.86 ms2.91 ms 3.43 ms2.74 ms 237
core: graph scratch() set + get (v3 restyles the graph)gpu 167 ns172 ns 225 ns166 ns 994
core: batch( fn ) (empty)v3 532 ns644 ns 1.63 µs510 ns 261
core: batch( fn ) (empty)gpu 83.9 ns86.8 ns 114 ns82.2 ns 1956
core: startBatch + endBatch + batchingv3 516 ns634 ns 1.60 µs494 ns 265
core: startBatch + endBatch + batchinggpu 90.1 ns164 ns 2.89 µs86.8 ns 1009
core: collection()v3 476 ns575 ns 1.64 µs447 ns 291
core: collection()gpu 59.9 ns62.6 ns 117 ns57.4 ns 2709
core: compact() (no dead slots — the early-out)gpu 16.9 µs21.3 µs 98.5 µs16.4 µs 32140
collection: element accessors (id/group/isNode/isEdge, 4 calls)v3 60.6 ns64.5 ns 189 ns55.8 ns 2626
collection: element accessors (id/group/isNode/isEdge, 4 calls)gpu 34.7 ns37.8 ns 105 ns33.6 ns 4500
collection: length + empty + nonempty (3 calls)v3 6.72 ns6.88 ns 11.4 ns6.34 ns 24629
collection: length + empty + nonempty (3 calls)gpu 1.47 ns1.52 ns 2.00 ns1.46 ns 106697
collection: eq/first/last (3 calls)v3 15.4 ns15.8 ns 25.7 ns14.9 ns 10843
collection: eq/first/last (3 calls)gpu 6.50 ns6.76 ns 14.0 ns6.20 ns 25173
collection: slice()v3 3.87 µs3.92 µs 4.35 µs3.64 µs 39
collection: slice()gpu 1.72 µs1.74 µs 1.95 µs1.68 µs 92
collection: toArray()v3 8.79 µs8.93 µs 9.33 µs8.63 µs 15
collection: toArray()gpu 746 ns759 ns 870 ns722 ns 216
collection: sort( fn )v3 14.6 µs15.1 µs 15.3 µs14.3 µs 12
collection: sort( fn )gpu 9.10 µs9.12 µs 9.31 µs8.90 µs 15
collection: reduce( fn )v3 157 ns160 ns 203 ns113 ns 1065
collection: reduce( fn )gpu 114 ns116 ns 202 ns113 ns 1474
collection: min + max ( fn ) (2 calls)v3 11.1 µs11.3 µs 11.8 µs10.9 µs 12
collection: min + max ( fn ) (2 calls)gpu 5.67 µs5.74 µs 6.12 µs5.59 µs 25
collection: some + every (2 calls)v3 885 ns903 ns 1.24 µs856 ns 184
collection: some + every (2 calls)gpu 551 ns558 ns 602 ns538 ns 304
collection: same + anySame + contains (3 calls)v3 7.71 µs7.73 µs 7.87 µs7.60 µs 18
collection: same + anySame + contains (3 calls)gpu 100 ns102 ns 127 ns95.1 ns 1678
collection: allAre (all match: the full walk)v3 3.68 µs3.68 µs 3.98 µs3.45 µs 42
collection: allAre (all match: the full walk)gpu 2.45 µs2.50 µs 2.96 µs2.40 µs 63
collection: is (none match: the full walk)v3 5.58 µs5.57 µs 5.76 µs5.29 µs 27
collection: is (none match: the full walk)gpu 2.37 µs2.45 µs 3.22 µs2.33 µs 64
collection: unionv3 92.8 µs104 µs 163 µs91.0 µs 6642
collection: uniongpu 16.2 µs16.6 µs 16.8 µs15.9 µs 12
collection: intersectionv3 90.9 µs100 µs 140 µs87.6 µs 6891
collection: intersectiongpu 3.17 µs3.20 µs 3.48 µs3.09 µs 49
collection: differencev3 92.1 µs103 µs 164 µs88.5 µs 6734
collection: differencegpu 3.20 µs3.37 µs 5.25 µs3.15 µs 45
collection: symmetricDifferencev3 25.3 µs25.6 µs 25.8 µs24.7 µs 12
collection: symmetricDifferencegpu 6.62 µs6.64 µs 6.81 µs6.52 µs 21
collection: absoluteComplementv3 6.04 ms6.55 ms 10.2 ms5.86 ms 98
collection: absoluteComplementgpu 417 µs425 µs 606 µs411 µs 1644
collection: byGroupv3 1.01 ms1.02 ms 1.29 ms988 µs 684
collection: byGroupgpu 334 µs345 µs 572 µs322 µs 2026
collection: diffv3 37.2 µs37.7 µs 39.1 µs36.5 µs 12
collection: diffgpu 11.4 µs11.4 µs 11.6 µs11.2 µs 11
collection: indexOfv3 28.7 ns29.4 ns 39.9 ns28.0 ns 5844
collection: indexOfgpu 23.2 ns23.9 ns 35.1 ns22.5 ns 7152
traversal: openNeighborhood + closedNeighborhood (2 calls)v3 9.71 µs9.78 µs 10.2 µs9.41 µs 14
traversal: openNeighborhood + closedNeighborhood (2 calls)gpu 3.28 µs3.41 µs 3.86 µs3.17 µs 46
traversal: connectedNodesv3 1.13 µs1.20 µs 1.99 µs999 ns 138
traversal: connectedNodesgpu 303 ns314 ns 517 ns295 ns 525
traversal: sources + targets (2 calls)v3 1.74 µs1.89 µs 2.74 µs1.67 µs 87
traversal: sources + targets (2 calls)gpu 514 ns676 ns 2.16 µs501 ns 244
traversal: source() + target() (2 calls)v3 75.6 ns77.7 ns 113 ns60.9 ns 2211
traversal: source() + target() (2 calls)gpu 56.5 ns58.4 ns 84.5 ns54.0 ns 2930
traversal: edgesWithv3 69.9 µs72.7 µs 127 µs68.9 µs 9582
traversal: edgesWithgpu 57.7 µs61.8 µs 116 µs55.8 µs 11189
traversal: edgesTov3 70.2 µs72.6 µs 123 µs69.2 µs 9603
traversal: edgesTogpu 59.5 µs60.3 µs 62.4 µs58.9 µs 12
traversal: parallelEdges + codirectedEdges (2 calls)v3 3.52 µs3.81 µs 4.47 µs3.41 µs 41
traversal: parallelEdges + codirectedEdges (2 calls)gpu 1.21 µs1.36 µs 1.95 µs1.17 µs 121
traversal: roots + leaves (2 calls)v3 5.75 ms6.13 ms 9.61 ms5.24 ms 110
traversal: roots + leaves (2 calls)gpu 342 µs356 µs 517 µs329 µs 1965
traversal: allAreNeighborsv3 199 µs212 µs 288 µs192 µs 3282
traversal: allAreNeighborsgpu 38.6 µs39.4 µs 41.3 µs38.1 µs 12
traversal: isLoop + isSimple (2 calls)v3 132 ns135 ns 208 ns127 ns 1263
traversal: isLoop + isSimple (2 calls)gpu 53.5 ns55.1 ns 71.5 ns51.6 ns 3102
degree: indegree + outdegree (2 calls)v3 3.35 µs3.65 µs 4.47 µs3.29 µs 43
degree: indegree + outdegree (2 calls)gpu 49.0 ns50.6 ns 79.3 ns47.4 ns 3284
degree: minDegree + maxDegree (2 calls)v3 15.9 ms17.2 ms 21.1 ms15.3 ms 36
degree: minDegree + maxDegree (2 calls)gpu 441 µs470 µs 953 µs435 µs 1488
degree: minIndegree + maxOutdegree (2 calls)v3 8.91 ms9.59 ms 13.7 ms8.65 ms 68
degree: minIndegree + maxOutdegree (2 calls)gpu 423 µs435 µs 609 µs418 µs 1605
dimensions: renderedPosition getv3 74.8 ns80.5 ns 181 ns73.5 ns 2107
dimensions: renderedPosition getgpu 29.3 ns33.4 ns 119 ns28.4 ns 5041
dimensions: relativePosition getv3 858 ns878 ns 1.17 µs841 ns 190
dimensions: relativePosition getgpu 76.1 ns81.4 ns 159 ns73.5 ns 2082
dimensions: width + height + outerWidth + outerHeight (4 calls)v3 617 ns620 ns 698 ns593 ns 273
dimensions: width + height + outerWidth + outerHeight (4 calls)gpu 210 ns214 ns 301 ns201 ns 795
dimensions: rendered dims (4 calls)v3 717 ns723 ns 794 ns699 ns 234
dimensions: rendered dims (4 calls)gpu 216 ns221 ns 275 ns211 ns 773
dimensions: renderedBoundingBoxv3 1.81 µs1.83 µs 2.25 µs1.74 µs 87
dimensions: renderedBoundingBoxgpu 914 ns921 ns 1.02 µs891 ns 180
dimensions: midpoint + renderedMidpoint (2 calls)gpu 1.13 µs1.13 µs 1.20 µs1.10 µs 143
dimensions: source/targetEndpoint (2 calls)gpu 379 ns383 ns 428 ns371 ns 443
dimensions: rendered source/targetEndpoint (2 calls)gpu 389 ns396 ns 447 ns385 ns 429
dimensions: shift + silentShift (round-trip)v3 297 µs307 µs 610 µs291 µs 2281
dimensions: shift + silentShift (round-trip)gpu 4.84 µs4.84 µs 4.95 µs4.74 µs 32
dimensions: silentPositionv3 850 ns858 ns 927 ns827 ns 195
dimensions: silentPositiongpu 55.8 ns58.1 ns 83.3 ns53.9 ns 2928
dimensions: positions( fn ) over 100v3 177 µs182 µs 242 µs172 µs 3828
dimensions: positions( fn ) over 100gpu 3.89 µs3.86 µs 4.07 µs3.58 µs 40
dimensions: padding + paddedWidth + paddedHeight (3 calls)v3 2.01 µs2.07 µs 2.84 µs1.99 µs 77
dimensions: padding + paddedWidth + paddedHeight (3 calls)gpu 142 ns149 ns 249 ns140 ns 1151
curves: isBundledBeziergpu 20.5 ns21.3 ns 33.0 ns20.0 ns 7995
curves: controlPoints + renderedControlPoints (2 calls)gpu 540 ns552 ns 768 ns527 ns 297
curves: segmentPoints (undefined for bezier)gpu 33.1 ns34.2 ns 48.4 ns31.8 ns 5001
compound: parent + parents + ancestors (3 calls)v3 3.12 µs3.43 µs 4.57 µs2.98 µs 46
compound: parent + parents + ancestors (3 calls)gpu 802 ns1.05 µs 2.30 µs772 ns 156
compound: children + descendants + siblings (3 calls)v3 8.90 µs8.85 µs 9.14 µs7.93 µs 16
compound: children + descendants + siblings (3 calls)gpu 1.83 µs2.21 µs 3.34 µs1.76 µs 72
compound: orphans + nonorphans (2 calls)v3 3.71 µs3.98 µs 4.74 µs3.53 µs 39
compound: orphans + nonorphans (2 calls)gpu 528 ns668 ns 2.62 µs514 ns 245
compound: commonAncestorsv3 9.72 µs9.75 µs 9.91 µs9.51 µs 14
compound: commonAncestorsgpu 74.8 ns78.1 ns 121 ns73.4 ns 2183
compound: isParent/isChild/isChildless/isOrphan (4 calls)v3 70.8 ns72.8 ns 96.9 ns61.1 ns 2359
compound: isParent/isChild/isChildless/isOrphan (4 calls)gpu 46.2 ns48.3 ns 91.5 ns44.4 ns 3543
flags: select + unselect + selected (band)v3 201 µs207 µs 461 µs196 µs 3383
flags: select + unselect + selected (band)gpu 13.1 µs13.2 µs 13.3 µs13.0 µs 9
flags: selectify + unselectify + selectablev3 198 µs204 µs 353 µs193 µs 3387
flags: selectify + unselectify + selectablegpu 2.03 µs2.04 µs 2.12 µs1.99 µs 80
flags: lock + unlock + lockedv3 196 µs204 µs 362 µs191 µs 3427
flags: lock + unlock + lockedgpu 2.05 µs2.07 µs 2.47 µs2.02 µs 79
flags: grabify + ungrabify + grabbablev3 196 µs202 µs 310 µs191 µs 3464
flags: grabify + ungrabify + grabbablegpu 2.04 µs2.05 µs 2.15 µs2.00 µs 80
flags: show + hide + visiblev3 2.70 ms2.86 ms 4.52 ms2.60 ms 241
flags: show + hide + visiblegpu 11.3 µs11.4 µs 11.8 µs11.2 µs 11
flags: active/activate/unactivate (3 calls)v3 196 µs202 µs 315 µs191 µs 3466
flags: active/activate/unactivate (3 calls)gpu 11.9 µs11.9 µs 12.0 µs11.7 µs 11
flags: panify + unpanify + pannablev3 195 µs203 µs 340 µs190 µs 3444
flags: panify + unpanify + pannablegpu 2.05 µs2.07 µs 2.42 µs2.00 µs 79
flags: takesUpSpace + interactive + transparent (3 calls)v3 187 ns193 ns 385 ns178 ns 883
flags: takesUpSpace + interactive + transparent (3 calls)gpu 68.2 ns72.4 ns 127 ns63.9 ns 2356
flags: effectiveOpacityv3 49.4 ns52.0 ns 93.2 ns47.1 ns 3292
flags: effectiveOpacitygpu 21.8 ns22.6 ns 36.4 ns20.9 ns 7580
element data: scratch get + setv3 1.36 µs1.37 µs 1.52 µs1.30 µs 121
element data: scratch get + setgpu 175 ns180 ns 262 ns167 ns 947
element data: json() one elementv3 286 ns288 ns 340 ns274 ns 582
element data: json() one elementgpu 150 ns187 ns 537 ns148 ns 862
element data: jsons() over 100v3 28.3 µs28.7 µs 29.0 µs27.8 µs 12
element data: jsons() over 100gpu 20.0 µs21.2 µs 24.4 µs19.0 µs 12
element data: label()gpu 15.2 ns15.9 ns 27.6 ns14.3 ns 10580
core: batchData()v3 2.40 µs2.51 µs 2.94 µs2.32 µs 64
core: batchData()gpu 283 ns377 ns 2.16 µs276 ns 437
core: animated()v3 7.52 ns7.87 ns 14.4 ns7.22 ns 21510
core: animated()gpu 1.53 ns1.60 ns 2.82 ns1.53 ns 102960
core: zoomRange getgpu 2.20 ns2.37 ns 6.27 ns2.09 ns 70414
core: forceRender() (headless no-op)v3 23.8 ns24.6 ns 47.7 ns23.0 ns 6964
core: forceRender() (headless no-op)gpu 1.48 ns1.56 ns 2.80 ns1.45 ns 105708
core: resize() / invalidateSize()v3 287 ns294 ns 385 ns279 ns 578
core: resize() / invalidateSize()gpu 126 ns131 ns 211 ns121 ns 1305
core: onRender + offRenderv3 468 ns528 ns 1.08 µs455 ns 318
core: onRender + offRendergpu 190 ns230 ns 671 ns185 ns 729
core: removeScratch()v3 2.81 ms2.85 ms 3.36 ms2.73 ms 241
core: removeScratch()gpu 284 ns291 ns 390 ns273 ns 584
core: selectionType getv3 4.46 ns4.74 ns 10.7 ns4.26 ns 35584
core: selectionType getgpu 2.26 ns2.44 ns 6.22 ns2.11 ns 68246
core: isReady()v3 3.26 ns3.38 ns 6.32 ns3.25 ns 49712
core: isReady()gpu 1.48 ns1.54 ns 1.94 ns1.45 ns 106983
core: window()v3 4.10 ns4.23 ns 7.60 ns4.01 ns 39924
core: window()gpu 1.48 ns1.52 ns 1.93 ns1.45 ns 108408
core: container()v3 3.99 ns4.22 ns 9.50 ns3.75 ns 39844
core: container()gpu 1.51 ns1.59 ns 2.98 ns1.51 ns 103292
core: destroyed()v3 3.30 ns3.40 ns 6.71 ns3.18 ns 49365
core: destroyed()gpu 1.48 ns1.53 ns 2.21 ns1.45 ns 107365
core: removeAllListeners()v3 13.7 ns14.4 ns 27.4 ns13.2 ns 11812
core: removeAllListeners()gpu 1.58 ns1.66 ns 2.00 ns1.58 ns 98759
collection: cy()v3 7.73 ns8.18 ns 15.2 ns7.17 ns 20879
collection: cy()gpu 2.16 ns2.36 ns 6.12 ns2.06 ns 70595
collection: indexOfId()v3 59.4 ns60.8 ns 85.2 ns58.4 ns 2814
collection: indexOfId()gpu 38.9 ns40.0 ns 57.7 ns38.1 ns 4283
collection: removed() + inside() (2 calls)v3 16.7 ns17.4 ns 28.8 ns16.1 ns 9839
collection: removed() + inside() (2 calls)gpu 15.1 ns15.6 ns 25.4 ns14.6 ns 10992
collection: silentPositions( fn ) over 100v3 109 µs113 µs 213 µs105 µs 6148
collection: silentPositions( fn ) over 100gpu 3.53 µs3.55 µs 3.69 µs3.48 µs 44
collection: animated()v3 12.1 ns12.4 ns 21.7 ns11.7 ns 13764
collection: animated()gpu 4.28 ns4.55 ns 11.2 ns4.00 ns 37042
collection: delayAnimation()v3 482 ns663 ns 2.11 µs454 ns 254
collection: delayAnimation()gpu 164 ns171 ns 300 ns158 ns 980
collection: removeScratch()v3 1.87 µs1.88 µs 2.06 µs1.81 µs 86
collection: removeScratch()gpu 205 ns209 ns 285 ns200 ns 814
collection: component()v3 86.3 ms87.4 ms 90.2 ms81.7 ms 12
collection: component()gpu 1.97 ms2.07 ms 3.04 ms1.90 ms 327
collection: layoutDimensions()v3 650 ns669 ns 988 ns632 ns 252
collection: layoutDimensions()gpu 169 ns174 ns 296 ns161 ns 979
degree: maxIndegree + minOutdegree (2 calls)v3 9.57 ms10.2 ms 14.4 ms9.18 ms 65
degree: maxIndegree + minOutdegree (2 calls)gpu 427 µs437 µs 607 µs411 µs 1603
flags: grabbed + hidden + inactive (3 calls)v3 84.9 ns86.9 ns 113 ns80.7 ns 1975
flags: grabbed + hidden + inactive (3 calls)gpu 42.4 ns43.6 ns 64.5 ns40.9 ns 3937
curves: renderedSegmentPointsgpu 37.3 ns38.8 ns 77.4 ns34.6 ns 4410
layout contract: edgeSlots + endpoints + degreeOfgpu 34.6 µs36.6 µs 62.4 µs29.5 µs 18849
formats: isColumnarElements + isSerializedElements + isPackedIdsgpu 4.61 ns4.86 ns 9.81 ns4.60 ns 34785

compaction N=20,000 · 18.6 s

cpu pick: background miss (full highWater walk) — peak
222 µs
cpu pick: background miss (full highWater walk) — compacted
49.6 µs
cpu pick: node hit — peak
223 µs
cpu pick: node hit — compacted
49.9 µs
isCurrent: current ref (forwards present vs absent) — no forwards (peak)
6.02 ns
isCurrent: current ref (forwards present vs absent) — forwards present (compacted)
5.90 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — current (baseline alloc)
8.86 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — stale → repair
44.7 ns
control: nodes({ selected }) scan (order-list, expected parity) — peak
25.4 µs
control: nodes({ selected }) scan (order-list, expected parity) — compacted
21.0 µs
control: whole-graph boundingBox (expected parity) — peak
96.5 µs
control: whole-graph boundingBox (expected parity) — compacted
97.3 µs
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
cpu pick: background miss (full highWater walk)peak 222 µs227 µs 280 µs220 µs 3097
cpu pick: background miss (full highWater walk)compacted 49.6 µs50.0 µs 50.4 µs49.1 µs 12
cpu pick: node hitpeak 223 µs230 µs 324 µs217 µs 3058
cpu pick: node hitcompacted 49.9 µs50.4 µs 50.8 µs49.2 µs 12
isCurrent: current ref (forwards present vs absent)no forwards (peak) 6.02 ns6.13 ns 7.37 ns5.74 ns 27505
isCurrent: current ref (forwards present vs absent)forwards present (compacted) 5.90 ns6.07 ns 10.9 ns5.62 ns 27879
isCurrent: stale-ref repair (chase + rewrite, alloc included)current (baseline alloc) 8.86 ns9.58 ns 22.3 ns8.45 ns 17592
isCurrent: stale-ref repair (chase + rewrite, alloc included)stale → repair 44.7 ns46.0 ns 59.3 ns43.7 ns 3715
control: nodes({ selected }) scan (order-list, expected parity)peak 25.4 µs27.2 µs 36.2 µs21.6 µs 12
control: nodes({ selected }) scan (order-list, expected parity)compacted 21.0 µs22.5 µs 24.6 µs20.5 µs 12
control: whole-graph boundingBox (expected parity)peak 96.5 µs101 µs 190 µs92.4 µs 6858
control: whole-graph boundingBox (expected parity)compacted 97.3 µs100 µs 188 µs92.3 µs 6949

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

parent drag (shift subtree + bb settle)
191×
child drag (move + parent re-derive)
51×
reparent round-trip
67×
1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
parent drag (shift subtree + bb settle)v3 266 µs304 µs 757 µs249 µs 2290
parent drag (shift subtree + bb settle)gpu 1.39 µs1.40 µs 1.55 µs1.34 µs 113
child drag (move + parent re-derive)v3 83.9 µs92.0 µs 175 µs79.7 µs 7376
child drag (move + parent re-derive)gpu 1.66 µs1.67 µs 1.99 µs1.59 µs 96
reparent round-tripv3 85.0 µs94.0 µs 209 µs82.4 µs 7332
reparent round-tripgpu 1.26 µs1.28 µs 1.65 µs1.23 µs 124

curves N=2,000 · 0.7 s

curve premium: build (style apply + derivation) — curved
26.3 ms
curve premium: build (style apply + derivation) — straight
23.1 ms
curve premium: node.position x 1000 (drag) — curved
386 µs
curve premium: node.position x 1000 (drag) — straight
348 µs
curve premium: nodes().positions() (bulk move) — curved
305 µs
curve premium: nodes().positions() (bulk move) — straight
288 µs
curve premium: first read after a bulk move (cold) — curved
7.58 ms
curve premium: first read after a bulk move (cold) — straight
3.27 ms
curve premium: same read again (warm) — curved
2.72 ms
curve premium: same read again (warm) — straight
1.58 ms
curve premium: edge.midpoint x 4000 — curved
1.88 ms
curve premium: edge.midpoint x 4000 — straight
3.06 ms
curve premium: edge.controlPoints x 4000 — curved
1.95 ms
curve premium: edge.controlPoints x 4000 — straight
1.21 ms
curve premium: cy.elements().boundingBox() x 20 — curved
34.7 ms
curve premium: cy.elements().boundingBox() x 20 — straight
34.6 ms
curve premium: cy.fit() x 20 (store scan) — curved
4.01 ms
curve premium: cy.fit() x 20 (store scan) — straight
3.65 ms
curve premium: elementsInBox x 20 (half the graph) — curved
23.9 ms
curve premium: elementsInBox x 20 (half the graph) — straight
6.14 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — curved
3.68 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — straight
2.01 ms
100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
curve premium: build (style apply + derivation)curved 26.3 ms26.3 ms 26.3 ms26.3 ms 1
curve premium: build (style apply + derivation)straight 23.1 ms23.1 ms 23.1 ms23.1 ms 1
curve premium: node.position x 1000 (drag)curved 386 µs386 µs 386 µs386 µs 1
curve premium: node.position x 1000 (drag)straight 348 µs348 µs 348 µs348 µs 1
curve premium: nodes().positions() (bulk move)curved 305 µs305 µs 305 µs305 µs 1
curve premium: nodes().positions() (bulk move)straight 288 µs288 µs 288 µs288 µs 1
curve premium: first read after a bulk move (cold)curved 7.58 ms7.58 ms 7.58 ms7.58 ms 1
curve premium: first read after a bulk move (cold)straight 3.27 ms3.27 ms 3.27 ms3.27 ms 1
curve premium: same read again (warm)curved 2.72 ms2.72 ms 2.72 ms2.72 ms 1
curve premium: same read again (warm)straight 1.58 ms1.58 ms 1.58 ms1.58 ms 1
curve premium: edge.midpoint x 4000curved 1.88 ms1.88 ms 1.88 ms1.88 ms 1
curve premium: edge.midpoint x 4000straight 3.06 ms3.06 ms 3.06 ms3.06 ms 1
curve premium: edge.controlPoints x 4000curved 1.95 ms1.95 ms 1.95 ms1.95 ms 1
curve premium: edge.controlPoints x 4000straight 1.21 ms1.21 ms 1.21 ms1.21 ms 1
curve premium: cy.elements().boundingBox() x 20curved 34.7 ms34.7 ms 34.7 ms34.7 ms 1
curve premium: cy.elements().boundingBox() x 20straight 34.6 ms34.6 ms 34.6 ms34.6 ms 1
curve premium: cy.fit() x 20 (store scan)curved 4.01 ms4.01 ms 4.01 ms4.01 ms 1
curve premium: cy.fit() x 20 (store scan)straight 3.65 ms3.65 ms 3.65 ms3.65 ms 1
curve premium: elementsInBox x 20 (half the graph)curved 23.9 ms23.9 ms 23.9 ms23.9 ms 1
curve premium: elementsInBox x 20 (half the graph)straight 6.14 ms6.14 ms 6.14 ms6.14 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)curved 3.68 ms3.68 ms 3.68 ms3.68 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)straight 2.01 ms2.01 ms 2.01 ms2.01 ms 1

arrows N=2,000 · 3.3 s

arrow premium: build (style apply + arrow fold) — arrowed
24.2 ms
arrow premium: build (style apply + arrow fold) — none
20.6 ms
arrow premium: cy.style() re-apply x 4 — arrowed
41.8 ms
arrow premium: cy.style() re-apply x 4 — none
40.9 ms
arrow premium: node.position x 200000 (drag) — arrowed
23.5 ms
arrow premium: node.position x 200000 (drag) — none
23.5 ms
arrow premium: edge.sourceEndpoint x 200000 — arrowed
61.0 ms
arrow premium: edge.sourceEndpoint x 200000 — none
61.9 ms
arrow premium: edge.targetEndpoint x 200000 — arrowed
61.8 ms
arrow premium: edge.targetEndpoint x 200000 — none
61.6 ms
arrow premium: edge.midpoint x 200000 — arrowed
146 ms
arrow premium: edge.midpoint x 200000 — none
146 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — arrowed
35.0 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — none
29.1 ms
arrow premium: cy.elements().boundingBox() x 20 — arrowed
20.9 ms
arrow premium: cy.elements().boundingBox() x 20 — none
21.3 ms
arrow premium: elementsInBox x 20 (half the graph) — arrowed
5.61 ms
arrow premium: elementsInBox x 20 (half the graph) — none
5.52 ms
arrow premium: control: sourceEndpoint, bezier vs straight — arrowed
76.4 ms
arrow premium: control: sourceEndpoint, bezier vs straight — none
60.9 ms
arrow premium: edge column bytes — B/edge
156 ms
1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
arrow premium: build (style apply + arrow fold)arrowed 24.2 ms24.2 ms 24.2 ms24.2 ms 1
arrow premium: build (style apply + arrow fold)none 20.6 ms20.6 ms 20.6 ms20.6 ms 1
arrow premium: cy.style() re-apply x 4arrowed 41.8 ms41.8 ms 41.8 ms41.8 ms 1
arrow premium: cy.style() re-apply x 4none 40.9 ms40.9 ms 40.9 ms40.9 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.5 ms23.5 ms 23.5 ms23.5 ms 1
arrow premium: edge.sourceEndpoint x 200000arrowed 61.0 ms61.0 ms 61.0 ms61.0 ms 1
arrow premium: edge.sourceEndpoint x 200000none 61.9 ms61.9 ms 61.9 ms61.9 ms 1
arrow premium: edge.targetEndpoint x 200000arrowed 61.8 ms61.8 ms 61.8 ms61.8 ms 1
arrow premium: edge.targetEndpoint x 200000none 61.6 ms61.6 ms 61.6 ms61.6 ms 1
arrow premium: edge.midpoint x 200000arrowed 146 ms146 ms 146 ms146 ms 1
arrow premium: edge.midpoint x 200000none 146 ms146 ms 146 ms146 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000arrowed 35.0 ms35.0 ms 35.0 ms35.0 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000none 29.1 ms29.1 ms 29.1 ms29.1 ms 1
arrow premium: cy.elements().boundingBox() x 20arrowed 20.9 ms20.9 ms 20.9 ms20.9 ms 1
arrow premium: cy.elements().boundingBox() x 20none 21.3 ms21.3 ms 21.3 ms21.3 ms 1
arrow premium: elementsInBox x 20 (half the graph)arrowed 5.61 ms5.61 ms 5.61 ms5.61 ms 1
arrow premium: elementsInBox x 20 (half the graph)none 5.52 ms5.52 ms 5.52 ms5.52 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightarrowed 76.4 ms76.4 ms 76.4 ms76.4 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightnone 60.9 ms60.9 ms 60.9 ms60.9 ms 1
arrow premium: edge column bytesB/edge 156 ms156 ms 156 ms156 ms 1

labels N=20,000 · 0.5 s

labels: breakLines x 20000 — gpu
79.1 ms
labels: estimateBlock x 20000 — gpu
93.4 ms
labels: addNode x 20000 — gpu
28.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.42 ms
1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
labels: breakLines x 20000gpu 79.1 ms79.1 ms 79.1 ms79.1 ms 1
labels: estimateBlock x 20000gpu 93.4 ms93.4 ms 93.4 ms93.4 ms 1
labels: addNode x 20000gpu 28.8 ms28.8 ms 28.8 ms28.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.42 ms3.42 ms 3.42 ms3.42 ms 1

transitions N=2,000 · 9.5 s

transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions off
2.29 ms
transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions on
4.69 ms
transition: bulk tween tick (2000 slots, one manager tick) — tick
139 µs
transition: explicit-domain write (O(changed) — one element) — transitions off
2.36 µs
transition: explicit-domain write (O(changed) — one element) — transitions on
6.28 µs
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions off
10.1 ms
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions on
12.7 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.29 ms2.38 ms 4.39 ms2.23 ms 288
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions on 4.69 ms4.91 ms 7.02 ms4.44 ms 138
transition: bulk tween tick (2000 slots, one manager tick)tick 139 µs143 µs 229 µs134 µs 4874
transition: explicit-domain write (O(changed) — one element)transitions off 2.36 µs2.41 µs 3.22 µs2.30 µs 65
transition: explicit-domain write (O(changed) — one element)transitions on 6.28 µs6.21 µs 6.80 µs5.25 µs 24
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions off 10.1 ms10.1 ms 10.6 ms9.87 ms 65
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions on 12.7 ms12.6 ms 14.4 ms11.4 ms 51

geometry-tween N=2,000 · 11.0 s

size tick: unlabelled (2000 slots) — tick
541 µs
size tick: labelled, center/center (re-anchor early-out) (2000 slots) — tick
595 µs
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots) — tick
1.22 ms
edge width tick (4000 slots) — bare
281 µs
edge width tick (4000 slots) — with rides (casing + match-line arrows)
717 µs
padding tick + auto-bounds flush (250 parents × 8 children) — tick + flush
177 µs
font-size tick (2000 labels) — wrap none (dims scale-patch)
364 µs
font-size tick (2000 labels) — wrapped (re-break per tick)
6.61 ms
baseline: paint (opacity) tick (2000 slots) — tick
144 µs
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
size tick: unlabelled (2000 slots)tick 541 µs563 µs 867 µs525 µs 1221
size tick: labelled, center/center (re-anchor early-out) (2000 slots)tick 595 µs619 µs 930 µs578 µs 1111
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots)tick 1.22 ms1.31 ms 2.41 ms1.13 ms 514
edge width tick (4000 slots)bare 281 µs289 µs 405 µs269 µs 2410
edge width tick (4000 slots)with rides (casing + match-line arrows) 717 µs734 µs 899 µs705 µs 954
padding tick + auto-bounds flush (250 parents × 8 children)tick + flush 177 µs186 µs 385 µs172 µs 3756
font-size tick (2000 labels)wrap none (dims scale-patch) 364 µs405 µs 916 µs345 µs 1710
font-size tick (2000 labels)wrapped (re-break per tick) 6.61 ms6.68 ms 7.36 ms6.36 ms 99
baseline: paint (opacity) tick (2000 slots)tick 144 µs150 µs 254 µs141 µs 4665