Cytoscape.js GPU benchmarks

v4 (src/) vs v3 (v3/src/) · Mitata · times are per-iteration p50 · 2026-09-01 23:46 · 5107c36e (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) · 7.1.10-100.fc43.x86_64 · x64
Nodev24.18.0 (v8 13.6.233.17-node.50)
Commit5107c36e
bench(113.1): the machine fingerprint rounds RAM to the GiB; the archive re-stamped
Machine id5cf3f79c
Median speedup (geo-mean) 11× 269 v3-vs-gpu comparisons
Biggest win 284648× sweep: edges() @ N=2k
v3 still ahead 1 comparison
Total run time 45.4 min all profile

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

sweep: edges() @ 2k
284648×
sweep: nodes() @ 2k
171358×
core: edges() @ 2k
91736×
core: nodes() @ 2k
50610×
sweep: elements() @ 2k
29389×
core: elements() @ 2k
20386×
core: graph scratch() set + get (v3 restyles the graph) @ 2k
16479×
core: removeScratch() @ 2k
9509×
compare: same() @ 2k
8408×
core: graph data() set + get (v3 restyles the graph) @ 2k
8387×
trav: successors() @ 2k
740×
trav: predecessors() @ 2k
723×
mut-bulk: hide + show @ 2k
255×
flags: show + hide + visible @ 2k
231×
parent drag (shift subtree + bb settle) @ 2k
182×
compound: commonAncestors @ 2k
128×
degree: nodes.totalDegree() @ 2k
114×
viewport: reset() @ 2k
107×
mut-bulk: shift @ 2k
105×
degree: nodes.maxDegree() @ 2k
97×
flags: panify + unpanify + pannable @ 2k
97×
flags: grabify + ungrabify + grabbable @ 2k
96×
flags: selectify + unselectify + selectable @ 2k
95×
flags: lock + unlock + locked @ 2k
94×
layout: grid @ 2k
89×
degree: node.degree() @ 2k
87×
core: options() @ 2k
85×
reparent round-trip @ 2k
79×
degree: indegree + outdegree (2 calls) @ 2k
76×
collection: same + anySame + contains (3 calls) @ 2k
73×
algo: closenessCentrality (one root) @ 2k
72×
algo: pageRank (20 iters) @ 500
70×
algo: closenessCentrality (one root) @ 500
65×
algo: dfs (whole graph) @ 2k
61×
dimensions: shift + silentShift (round-trip) @ 2k
60×
sweep: nodes(":selected") vs nodes({selected}) @ 2k
59×
mut-bulk: positions(obj) @ 2k
59×
viewport: viewport({ zoom, pan }) @ 2k
58×
algo: bfs (whole graph) @ 2k
58×
algo: dijkstra + pathTo @ 2k
57×
algo: bfs (whole graph) @ 500
56×
algo: dfs (whole graph) @ 500
56×
mut-bulk: lock + unlock @ 2k
54×
algo: closenessCentrality (weighted, one root) @ 500
52×
child drag (move + parent re-derive) @ 2k
51×
algo: dijkstra + pathTo @ 500
50×
dimensions: positions( fn ) over 100 @ 2k
50×
collection: component() @ 2k
45×
degree: minDegree + maxDegree (2 calls) @ 2k
43×
traverse: components() @ 2k
41×
algo: degreeCentralityNormalized @ 2k
38×
layout: preset (fn form) @ 2k
37×
algo: degreeCentralityNormalized @ 500
35×
algo: degreeCentrality (one root) @ 500
35×
algo: degreeCentrality (one root) @ 2k
35×
sweep: selected nodes ($("node:selected") vs filter({group, selected})) @ 2k
35×
algo: tarjan SCC @ 2k
35×
query: structural, parents (:parent vs { parent: true }) @ 2k
34×
query: structural, orphans (:orphan vs { child: false }) @ 2k
33×
bounds: getFitViewport() (compute without committing) @ 2k
33×
bounds: cy.fit() (whole-graph scan) @ 2k
33×
algo: tarjan SCC @ 500
31×
collection: silentPositions( fn ) over 100 @ 2k
31×
layout: breadthfirst @ 2k
30×
collection: difference @ 2k
29×
collection: intersection @ 2k
29×
algo: kruskal @ 2k
28×
load: init from the definition form (construct + dispose) @ 2k
28×
set: difference() @ 2k
27×
set: intersection() @ 2k
27×
scn: select-all + fit (listeners on) @ 2k
26×
degree: minIndegree + maxOutdegree (2 calls) @ 2k
25×
emit: position write, no listeners @ 2k
25×
degree: maxIndegree + minOutdegree (2 calls) @ 2k
25×
algo: hopcroft-tarjan biconnected @ 500
25×
algo: hopcroft-tarjan biconnected @ 2k
25×
algo: kruskal @ 500
25×
mut: position set @ 2k
25×
trav: band roots() @ 2k
24×
core: id lookup ($("#id") vs $id()) @ 2k
24×
mut-bulk: positions(fn) @ 2k
23×
data: bulk write, object column (plain-array fallback) @ 2k
22×
data: bulk write, numeric column @ 2k
21×
algo: bellmanFord @ 500
20×
algo: bellmanFord @ 2k
20×
core: add + remove @ 2k
19×
layout: preset @ 2k
19×
data: bulk write, one new dictionary entry per pass @ 2k
19×
data: bulk write, dictionary string column (4 values) @ 2k
18×
viewport: center( eles ) @ 2k
17×
scn: drag (select band of 100 + 8-step shift, position listener) @ 2k
17×
flags: active/activate/unactivate (3 calls) @ 2k
16×
query: membership ([bucket in ...] vs { in }) @ 2k
16×
flags: select + unselect + selected (band) @ 2k
16×
collection: absoluteComplement @ 2k
16×
layout: concentric @ 2k
15×
dimensions: silentPosition @ 2k
15×
viewport: minZoom/maxZoom get (2 calls) @ 2k
15×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } }) @ 2k
14×
style: renderedStyle (one prop) @ 2k
14×
mut-bulk: data set @ 2k
14×
dimensions: padding + paddedWidth + paddedHeight (3 calls) @ 2k
13×
query: structural, childless (:childless vs { parent: false }) @ 2k
13×
core: selected ($(":selected") vs filter({selected})) @ 2k
13×
sweep: selected ($(":selected") vs filter({selected})) @ 2k
13×
algo: betweennessCentrality (unweighted) @ 500
13×
traversal: roots + leaves (2 calls) @ 2k
13×
collection: toArray() @ 2k
12×
query: two keys AND-ed @ 2k
12×
algo: fuzzyCMeans @ 500
11×
algo: betweennessCentrality (unweighted) @ 2k
11×
query: data comparison ([weight > 3] vs { gt }) @ 2k
11×
dimensions: relativePosition get @ 2k
10×
sweep: all nodes ($("node") vs filter({group})) @ 2k
9.5×
core: batch + per-id data() (was batchData, round 90) @ 2k
8.9×
collection: removeScratch() @ 2k
8.9×
layout: random @ 2k
8.6×
core: removeAllListeners() @ 2k
8.5×
algo: betweennessCentrality (weighted) @ 500
8.5×
algo: hierarchicalClustering (threshold) @ 500
8.3×
data: removeData (whole collection) @ 2k
8.2×
emit: 1 core listener @ 2k
8.2×
mut-bulk: select + unselect @ 2k
8.0×
emit: delegated (v3 selector vs v4 predicate) @ 2k
7.9×
scn: explore (expand 2-hop + select + fit) @ 2k
7.8×
emit: 1 element (ref-qualified) listener @ 2k
7.7×
algo: kMedoids @ 500
7.7×
element data: scratch get + set @ 2k
7.7×
query: predicate function (both sides) @ 2k
7.4×
core: collection() @ 2k
7.2×
layout: scope (eles.layout, 10% of nodes) @ 2k
7.1×
core: collection() @ 2k
7.0×
compound: orphans + nonorphans (2 calls) @ 2k
7.0×
layout: circle @ 2k
6.7×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners) @ 2k
6.7×
core: batch( fn ) (empty) @ 2k
6.6×
emit: 10 core listeners @ 2k
6.5×
mut-bulk: remove + re-add (256 nodes + cascade) @ 2k
6.4×
bounds: whole-graph boundingBox() @ 2k
6.2×
collection: union @ 2k
5.9×
style: bypass set + removeStyle round-trip @ 2k
5.9×
style: whole-object style() @ 2k
5.9×
core: startBatch + endBatch + batching @ 2k
5.9×
style: sheet swap (compile + applyAll) @ 2k
5.4×
traversal: allAreNeighbors @ 2k
5.3×
set: union() @ 2k
5.2×
algo: hierholzer (directed) @ 500
5.2×
trav: band neighborhood() @ 2k
5.1×
trav: outgoers() @ 2k
5.1×
traverse: incomers() @ 2k
5.0×
traverse: outgoers() @ 2k
5.0×
compare: contains() @ 2k
5.0×
algo: affinityPropagation @ 500
4.9×
core: animated() @ 2k
4.9×
trav: incomers() @ 2k
4.9×
core: nodes ($("node") vs filter({group})) @ 2k
4.8×
algo: kMeans (fixed centroids) @ 500
4.7×
compound: children + descendants + siblings (3 calls) @ 2k
4.7×
viewport: zoom() get @ 2k
4.7×
collection: length + empty + nonempty (3 calls) @ 2k
4.6×
mut: select + unselect @ 2k
4.2×
style: bypass set (ele.style name,value) @ 2k
4.1×
trav: neighborhood() @ 2k
4.0×
viewport: width() + height() + size() (3 calls) @ 2k
3.7×
collection: symmetricDifference @ 2k
3.7×
traverse: neighborhood() @ 2k
3.7×
collection: layoutDimensions() @ 2k
3.6×
compound: parent + parents + ancestors (3 calls) @ 2k
3.6×
algo: aStar @ 500
3.6×
collection: cy() @ 2k
3.5×
traversal: parallelEdges + codirectedEdges (2 calls) @ 2k
3.4×
algo: aStar @ 2k
3.4×
traversal: connectedNodes @ 2k
3.2×
traversal: sources + targets (2 calls) @ 2k
3.2×
dimensions: rendered dims (4 calls) @ 2k
3.1×
collection: byGroup @ 2k
3.1×
collection: diff @ 2k
3.1×
flags: takesUpSpace + interactive + transparent (3 calls) @ 2k
3.1×
anim: start + stop, 512-node collection @ 2k
3.0×
traversal: openNeighborhood + closedNeighborhood (2 calls) @ 2k
3.0×
algo: hierholzer (directed) @ 2k
2.9×
trav: band connectedNodes() @ 2k
2.9×
collection: animated() @ 2k
2.9×
collection: delayAnimation() @ 2k
2.9×
style: numericStyle @ 2k
2.9×
dimensions: width + height + outerWidth + outerHeight (4 calls) @ 2k
2.8×
load: cy.json() @ 2k
2.8×
core: window() @ 2k
2.8×
iter: map() @ 2k
2.8×
traverse: connectedEdges() @ 2k
2.7×
anim: viewport animate + stop @ 2k
2.7×
mut: data set @ 2k
2.7×
traversal: isLoop + isSimple (2 calls) @ 2k
2.7×
core: container() @ 2k
2.6×
trav: closedNeighborhood() @ 2k
2.6×
trav: connectedEdges() @ 2k
2.6×
dimensions: renderedPosition get @ 2k
2.5×
core: on('render') + off('render') (was onRender/offRender, round 90) @ 2k
2.5×
algo: closenessCentralityNormalized @ 500
2.5×
core: resize() / invalidateSize() @ 2k
2.4×
core: zoom set @ 2k
2.3×
flags: effectiveOpacity @ 2k
2.3×
flags: grabbed + hidden + inactive (3 calls) @ 2k
2.2×
collection: is (none match: the full walk) @ 2k
2.2×
core: destroyed() @ 2k
2.2×
core: isReady() @ 2k
2.2×
style: read one prop (width) @ 2k
2.2×
emit: on() + off() round-trip @ 2k
2.2×
collection: slice() @ 2k
2.2×
data: read the whole object @ 2k
2.2×
core: selectionType get @ 2k
2.0×
collection: min + max ( fn ) (2 calls) @ 2k
1.97×
element data: json() one element @ 2k
1.97×
element data: jsons() over 100 @ 2k
1.95×
iter: filter(fn) @ 2k
1.93×
algo: floydWarshall @ 500
1.93×
json: element @ 2k
1.88×
viewport: zoom( n ) set @ 2k
1.87×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener) @ 2k
1.87×
core: gating setters round-trip (autolock/autoungrabify/autounselectify) @ 2k
1.87×
viewport: pan( p ) set @ 2k
1.86×
style: first apply on add (256-node band) @ 2k
1.86×
collection: eq/first/last (3 calls) @ 2k
1.83×
dimensions: renderedBoundingBox @ 2k
1.83×
style( 'text-max-width' ) (was #74 in the switch) @ 2k
1.77×
collection: indexOfId() @ 2k
1.76×
collection: element accessors (id/group/isNode/isEdge, 4 calls) @ 2k
1.74×
style( 'text-wrap' ) (was #73 in the switch) @ 2k
1.69×
viewport: panBy() @ 2k
1.68×
style: read one prop (color) @ 2k
1.67×
viewport: renderedExtent() @ 2k
1.64×
load: add a 256-node band (add + remove) @ 2k
1.59×
collection: some + every (2 calls) @ 2k
1.59×
anim: delay() (no channels touched) @ 2k
1.59×
collection: sort( fn ) @ 2k
1.58×
compound: isParent/isChild/isChildless/isOrphan (4 calls) @ 2k
1.58×
bounds: one node boundingBox() @ 2k
1.58×
position: get @ 2k
1.56×
sweep: filter(fn) @ 2k
1.55×
trav: band sources() @ 2k
1.53×
viewport: extent() @ 2k
1.52×
trav: band connectedEdges() @ 2k
1.52×
collection: allAre (all match: the full walk) @ 2k
1.41×
collection: reduce( fn ) @ 2k
1.40×
collection: indexOf @ 2k
1.38×
data: read one numeric key @ 2k
1.36×
anim: start + stop, one element @ 2k
1.35×
data: read one string key (dictionary decode) @ 2k
1.33×
traversal: source() + target() (2 calls) @ 2k
1.33×
traversal: edgesTo @ 2k
1.31×
style( 'target-distance-from-node' ) (was #150 in the switch) @ 2k
1.31×
core: pan() get (x32) @ 2k
1.30×
traversal: edgesWith @ 2k
1.29×
style( 'taxi-radius' ) (was #142 in the switch) @ 2k
1.28×
core: instanceString + headless + styleEnabled (3 calls) @ 2k
1.23×
style( 'border-width' ) (was #6 in the switch) @ 2k
1.21×
viewport: pan() get @ 2k
1.18×
collection: removed() + inside() (2 calls) @ 2k
1.18×
core: gating getters (5 calls) @ 2k
1.17×
core: hasElementWithId + hasCompoundNodes (2 calls) @ 2k
1.17×
algo: markovClustering @ 500
1.11×
style( 'background-color' ) (was #4 in the switch) @ 2k
1.09×
algo: kargerStein @ 500
1.06×
core: extent() @ 2k
1.05×
data: get @ 2k
1.05×
iter: forEach() @ 2k
1.05×
core: elements() memo hit (was mutableElements, round 90) @ 2k
1.04×
core: getElementById() @ 2k
1.04×
core: filter(fn) @ 2k
0.96×
0.1×10×100×1000×10000×100000×1000000×

Scaling speedup vs graph size

algorithms

group× @ N=500× @ N=2k
algo: bfs (whole graph)56×58×
algo: dfs (whole graph)56×61×
algo: dijkstra + pathTo50×57×
algo: aStar3.6×3.4×
algo: bellmanFord20×20×
algo: kruskal25×28×
algo: tarjan SCC31×35×
algo: hopcroft-tarjan biconnected25×25×
algo: hierholzer (directed)5.2×2.9×
algo: betweennessCentrality (unweighted)13×11×
algo: degreeCentralityNormalized35×38×
algo: closenessCentrality (one root)65×72×
algo: degreeCentrality (one root)35×35×
algo: pageRank (20 iters)70×
algo: closenessCentrality (weighted, one root)52×
algo: floydWarshall1.93×
algo: closenessCentralityNormalized2.5×
algo: markovClustering1.11×
algo: hierarchicalClustering (threshold)8.3×
algo: kMeans (fixed centroids)4.7×
algo: kMedoids7.7×
algo: fuzzyCMeans11×
algo: affinityPropagation4.9×
algo: kargerStein1.06×
algo: betweennessCentrality (weighted)8.5×

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

core: getElementById()
1.04×
core: id lookup ($("#id") vs $id())
24×
core: nodes()
50610×
core: edges()
91736×
core: elements()
20386×
core: nodes ($("node") vs filter({group}))
4.8×
core: selected ($(":selected") vs filter({selected}))
13×
core: filter(fn)
0.96×
core: collection()
7.0×
core: pan() get (x32)
1.30×
core: extent()
1.05×
core: add + remove
19×
core: zoom set
2.3×
traverse: neighborhood()
3.7×
traverse: connectedEdges()
2.7×
traverse: outgoers()
5.0×
traverse: incomers()
5.0×
traverse: components()
41×
degree: node.degree()
87×
degree: nodes.totalDegree()
114×
degree: nodes.maxDegree()
97×
data: get
1.05×
position: get
1.56×
json: element
1.88×
set: union()
5.2×
set: intersection()
27×
set: difference()
27×
iter: map()
2.8×
iter: forEach()
1.05×
iter: filter(fn)
1.93×
compare: same()
8408×
compare: contains()
5.0×
mut: data set
2.7×
mut: position set
25×
mut: select + unselect
4.2×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
core: getElementById()v3 94.8 ns96.9 ns 120 ns91.0 ns 1770
core: getElementById()gpu 91.2 ns94.3 ns 131 ns87.7 ns 1816
core: id lookup ($("#id") vs $id())v3 1.99 µs2.33 µs 3.69 µs1.83 µs 68
core: id lookup ($("#id") vs $id())gpu 84.7 ns88.0 ns 163 ns80.7 ns 1943
core: nodes()v3 415 µs428 µs 683 µs404 µs 1635
core: nodes()gpu 8.21 ns8.96 ns 19.6 ns7.79 ns 19000
core: edges()v3 724 µs762 µs 1.45 ms713 µs 917
core: edges()gpu 7.89 ns8.41 ns 17.0 ns7.51 ns 20150
core: elements()v3 142 µs148 µs 247 µs137 µs 4717
core: elements()gpu 6.99 ns7.36 ns 14.4 ns6.54 ns 23103
core: nodes ($("node") vs filter({group}))v3 550 µs578 µs 1.27 ms535 µs 1207
core: nodes ($("node") vs filter({group}))gpu 114 µs120 µs 275 µs85.0 µs 5721
core: selected ($(":selected") vs filter({selected}))v3 329 µs343 µs 616 µs319 µs 1999
core: selected ($(":selected") vs filter({selected}))gpu 25.1 µs25.9 µs 27.3 µs24.8 µs 12
core: filter(fn)v3 410 µs422 µs 583 µs399 µs 1656
core: filter(fn)gpu 429 µs458 µs 991 µs415 µs 1511
core: collection()v3 456 ns549 ns 1.56 µs447 ns 305
core: collection()gpu 65.2 ns69.9 ns 283 ns63.1 ns 2414
core: pan() get (x32)v3 44.7 ns45.5 ns 59.0 ns43.4 ns 3600
core: pan() get (x32)gpu 34.3 ns36.2 ns 63.0 ns32.3 ns 4722
core: extent()v3 22.7 ns39.4 ns 134 ns21.7 ns 4233
core: extent()gpu 21.5 ns28.3 ns 110 ns20.5 ns 5852
core: add + removev3 129 µs135 µs 272 µs120 µs 5054
core: add + removegpu 6.70 µs8.04 µs 33.3 µs6.33 µs 80319
core: zoom setv3 1.36 µs1.37 µs 1.50 µs1.24 µs 119
core: zoom setgpu 586 ns601 ns 874 ns561 ns 271
traverse: neighborhood()v3 3.55 µs3.87 µs 4.92 µs3.44 µs 40
traverse: neighborhood()gpu 960 ns1.12 µs 2.42 µs930 ns 146
traverse: connectedEdges()v3 1.06 µs1.16 µs 1.96 µs1.03 µs 140
traverse: connectedEdges()gpu 386 ns420 ns 1.36 µs369 ns 399
traverse: outgoers()v3 2.43 µs2.62 µs 3.28 µs2.36 µs 61
traverse: outgoers()gpu 488 ns575 ns 2.05 µs476 ns 282
traverse: incomers()v3 2.44 µs2.62 µs 3.41 µs2.34 µs 61
traverse: incomers()gpu 488 ns614 ns 2.05 µs473 ns 261
traverse: components()v3 80.9 ms82.5 ms 86.0 ms75.3 ms 12
traverse: components()gpu 1.97 ms2.11 ms 3.91 ms1.91 ms 315
degree: node.degree()v3 3.61 µs3.94 µs 5.18 µs3.40 µs 40
degree: node.degree()gpu 41.5 ns42.9 ns 76.9 ns39.2 ns 3992
degree: nodes.totalDegree()v3 7.24 ms8.02 ms 12.9 ms6.90 ms 82
degree: nodes.totalDegree()gpu 63.7 µs66.5 µs 127 µs59.9 µs 10251
degree: nodes.maxDegree()v3 7.16 ms7.95 ms 11.5 ms6.87 ms 84
degree: nodes.maxDegree()gpu 73.6 µs75.2 µs 116 µs70.0 µs 9311
data: getv3 30.4 ns31.5 ns 59.7 ns28.7 ns 5436
data: getgpu 29.1 ns30.6 ns 53.6 ns27.6 ns 5588
position: getv3 34.0 ns36.0 ns 85.8 ns32.9 ns 4757
position: getgpu 21.8 ns25.7 ns 56.4 ns21.1 ns 6499
json: elementv3 300 ns392 ns 3.54 µs292 ns 423
json: elementgpu 160 ns170 ns 355 ns153 ns 957
set: union()v3 94.9 µs107 µs 170 µs91.7 µs 6386
set: union()gpu 18.1 µs18.5 µs 18.7 µs17.6 µs 12
set: intersection()v3 94.0 µs110 µs 169 µs90.6 µs 6300
set: intersection()gpu 3.48 µs3.52 µs 3.85 µs3.40 µs 43
set: difference()v3 93.7 µs103 µs 143 µs90.5 µs 6548
set: difference()gpu 3.44 µs3.49 µs 4.12 µs3.35 µs 44
iter: map()v3 28.3 µs30.0 µs 55.4 µs27.2 µs 22973
iter: map()gpu 10.3 µs10.3 µs 10.4 µs10.2 µs 13
iter: forEach()v3 3.47 µs3.77 µs 3.86 µs3.41 µs 36
iter: forEach()gpu 3.31 µs3.35 µs 3.60 µs3.26 µs 45
iter: filter(fn)v3 246 µs248 µs 312 µs236 µs 2824
iter: filter(fn)gpu 127 µs132 µs 181 µs123 µs 5314
compare: same()v3 124 µs128 µs 195 µs116 µs 5484
compare: same()gpu 14.7 ns15.4 ns 24.7 ns14.1 ns 11143
compare: contains()v3 6.26 µs6.29 µs 6.50 µs6.15 µs 24
compare: contains()gpu 1.26 µs1.27 µs 1.37 µs1.21 µs 131
mut: data setv3 630 ns657 ns 950 ns602 ns 251
mut: data setgpu 231 ns240 ns 347 ns225 ns 700
mut: position setv3 1.21 µs1.25 µs 1.45 µs1.16 µs 132
mut: position setgpu 49.2 ns52.7 ns 100 ns47.6 ns 3224
mut: select + unselectv3 2.61 µs2.81 µs 3.76 µs2.47 µs 56
mut: select + unselectgpu 620 ns627 ns 730 ns596 ns 258

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

sweep: nodes()
171358×
sweep: edges()
284648×
sweep: elements()
29389×
sweep: all nodes ($("node") vs filter({group}))
9.5×
sweep: selected ($(":selected") vs filter({selected}))
13×
sweep: selected nodes ($("node:selected") vs filter({group, selected}))
35×
sweep: nodes(":selected") vs nodes({selected})
59×
sweep: filter(fn)
1.55×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
sweep: nodes()v3 413 µs422 µs 496 µs399 µs 1635
sweep: nodes()gpu 2.41 ns2.49 ns 5.60 ns2.35 ns 66641
sweep: edges()v3 715 µs724 µs 862 µs682 µs 966
sweep: edges()gpu 2.51 ns2.62 ns 4.86 ns2.46 ns 63182
sweep: elements()v3 141 µs149 µs 230 µs136 µs 4690
sweep: elements()gpu 4.80 ns4.91 ns 8.90 ns4.55 ns 34453
sweep: all nodes ($("node") vs filter({group}))v3 543 µs567 µs 818 µs526 µs 1232
sweep: all nodes ($("node") vs filter({group}))gpu 57.4 µs72.5 µs 175 µs53.1 µs 9541
sweep: selected ($(":selected") vs filter({selected}))v3 329 µs341 µs 512 µs322 µs 2051
sweep: selected ($(":selected") vs filter({selected}))gpu 25.8 µs26.2 µs 26.6 µs25.4 µs 12
sweep: selected nodes ($("node:selected") vs filter({group, selected}))v3 320 µs328 µs 490 µs309 µs 2131
sweep: selected nodes ($("node:selected") vs filter({group, selected}))gpu 9.11 µs9.16 µs 9.44 µs8.94 µs 15
sweep: nodes(":selected") vs nodes({selected})v3 531 µs551 µs 791 µs514 µs 1267
sweep: nodes(":selected") vs nodes({selected})gpu 8.92 µs8.94 µs 9.22 µs8.79 µs 15
sweep: filter(fn)v3 412 µs419 µs 497 µs399 µs 1673
sweep: filter(fn)gpu 265 µs273 µs 572 µs235 µs 2550

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

mut-bulk: select + unselect
8.0×
mut-bulk: hide + show
255×
mut-bulk: lock + unlock
54×
mut-bulk: positions(obj)
59×
mut-bulk: positions(fn)
23×
mut-bulk: shift
105×
mut-bulk: data set
14×
mut-bulk: remove + re-add (256 nodes + cascade)
6.4×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
mut-bulk: select + unselectv3 1.97 ms2.03 ms 3.23 ms1.90 ms 328
mut-bulk: select + unselectgpu 248 µs257 µs 400 µs236 µs 2724
mut-bulk: hide + showv3 54.5 ms59.3 ms 70.0 ms52.2 ms 12
mut-bulk: hide + showgpu 214 µs224 µs 378 µs206 µs 3070
mut-bulk: lock + unlockv3 2.06 ms2.10 ms 2.60 ms2.00 ms 326
mut-bulk: lock + unlockgpu 38.4 µs38.8 µs 39.3 µs37.8 µs 12
mut-bulk: positions(obj)v3 2.16 ms2.22 ms 3.29 ms2.08 ms 309
mut-bulk: positions(obj)gpu 36.8 µs38.6 µs 74.4 µs35.1 µs 17621
mut-bulk: positions(fn)v3 3.40 ms3.56 ms 5.03 ms3.32 ms 192
mut-bulk: positions(fn)gpu 146 µs152 µs 240 µs140 µs 4565
mut-bulk: shiftv3 3.41 ms3.58 ms 5.07 ms3.29 ms 190
mut-bulk: shiftgpu 32.3 µs33.7 µs 61.3 µs30.7 µs 20458
mut-bulk: data setv3 876 µs905 µs 1.40 ms845 µs 766
mut-bulk: data setgpu 64.7 µs67.6 µs 132 µs62.3 µs 9967
mut-bulk: remove + re-add (256 nodes + cascade)v3 41.2 ms42.7 ms 46.3 ms40.0 ms 12
mut-bulk: remove + re-add (256 nodes + cascade)gpu 6.45 ms6.59 ms 8.54 ms5.69 ms 100

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

scn: explore (expand 2-hop + select + fit)
7.8×
scn: select-all + fit (listeners on)
26×
scn: drag (select band of 100 + 8-step shift, position listener)
17×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)
6.7×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)
1.87×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
scn: explore (expand 2-hop + select + fit)v3 288 µs330 µs 910 µs267 µs 2107
scn: explore (expand 2-hop + select + fit)gpu 37.0 µs42.1 µs 136 µs33.7 µs 16126
scn: select-all + fit (listeners on)v3 23.7 ms23.7 ms 25.6 ms22.2 ms 24
scn: select-all + fit (listeners on)gpu 905 µs953 µs 1.52 ms856 µs 705
scn: drag (select band of 100 + 8-step shift, position listener)v3 1.63 ms1.67 ms 2.14 ms1.56 ms 392
scn: drag (select band of 100 + 8-step shift, position listener)gpu 97.7 µs103 µs 205 µs94.3 µs 6608
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)v3 45.2 ms45.9 ms 48.4 ms43.5 ms 11
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)gpu 6.79 ms7.08 ms 9.81 ms6.14 ms 92
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)v3 7.86 ms8.43 ms 16.1 ms7.30 ms 77
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)gpu 4.21 ms4.37 ms 7.07 ms3.80 ms 148

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

trav: neighborhood()
4.0×
trav: closedNeighborhood()
2.6×
trav: connectedEdges()
2.6×
trav: outgoers()
5.1×
trav: incomers()
4.9×
trav: successors()
740×
trav: predecessors()
723×
trav: band neighborhood()
5.1×
trav: band connectedEdges()
1.52×
trav: band roots()
24×
trav: band sources()
1.53×
trav: band connectedNodes()
2.9×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
trav: neighborhood()v3 4.00 µs4.03 µs 4.87 µs3.34 µs 38
trav: neighborhood()gpu 999 ns993 ns 1.12 µs873 ns 166
trav: closedNeighborhood()v3 5.64 µs5.52 µs 5.93 µs5.10 µs 27
trav: closedNeighborhood()gpu 2.15 µs2.20 µs 2.67 µs2.12 µs 72
trav: connectedEdges()v3 995 ns1.08 µs 1.84 µs977 ns 155
trav: connectedEdges()gpu 383 ns399 ns 661 ns370 ns 424
trav: outgoers()v3 2.28 µs2.40 µs 2.93 µs2.21 µs 67
trav: outgoers()gpu 449 ns528 ns 1.96 µs428 ns 315
trav: incomers()v3 2.27 µs2.40 µs 2.99 µs2.17 µs 67
trav: incomers()gpu 468 ns556 ns 2.11 µs454 ns 296
trav: successors()v3 432 ms435 ms 445 ms428 ms 12
trav: successors()gpu 584 µs618 µs 1.80 ms569 µs 1111
trav: predecessors()v3 433 ms434 ms 446 ms424 ms 12
trav: predecessors()gpu 600 µs627 µs 1.82 ms574 µs 1082
trav: band neighborhood()v3 186 µs198 µs 264 µs179 µs 3521
trav: band neighborhood()gpu 36.6 µs37.3 µs 38.3 µs36.2 µs 12
trav: band connectedEdges()v3 24.9 µs25.2 µs 25.4 µs24.4 µs 12
trav: band connectedEdges()gpu 16.4 µs16.9 µs 18.0 µs16.1 µs 12
trav: band roots()v3 108 µs118 µs 176 µs103 µs 5869
trav: band roots()gpu 4.52 µs4.53 µs 4.69 µs4.42 µs 34
trav: band sources()v3 6.65 µs6.65 µs 6.85 µs6.42 µs 22
trav: band sources()gpu 4.36 µs4.41 µs 4.63 µs4.26 µs 34
trav: band connectedNodes()v3 14.3 µs14.4 µs 14.8 µs13.9 µs 12
trav: band connectedNodes()gpu 4.92 µs4.95 µs 5.13 µs4.85 µs 30

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

algo: bfs (whole graph)
58×
algo: dfs (whole graph)
61×
algo: dijkstra + pathTo
57×
algo: aStar
3.4×
algo: bellmanFord
20×
algo: kruskal
28×
algo: tarjan SCC
35×
algo: hopcroft-tarjan biconnected
25×
algo: hierholzer (directed)
2.9×
algo: betweennessCentrality (unweighted)
11×
algo: degreeCentralityNormalized
38×
algo: closenessCentrality (one root)
72×
algo: degreeCentrality (one root)
35×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 51.3 ms53.3 ms 59.4 ms49.3 ms 9
algo: bfs (whole graph)gpu 881 µs913 µs 1.43 ms863 µs 761
algo: dfs (whole graph)v3 50.6 ms51.5 ms 51.1 ms50.1 ms 10
algo: dfs (whole graph)gpu 833 µs855 µs 1.23 ms824 µs 816
algo: dijkstra + pathTov3 54.0 ms54.9 ms 57.5 ms52.9 ms 9
algo: dijkstra + pathTogpu 951 µs970 µs 1.42 ms918 µs 718
algo: aStarv3 1.66 ms1.70 ms 2.24 ms1.61 ms 408
algo: aStargpu 493 µs506 µs 617 µs482 µs 1381
algo: bellmanFordv3 230 ms233 ms 282 ms205 ms 12
algo: bellmanFordgpu 11.7 ms11.8 ms 12.4 ms11.6 ms 56
algo: kruskalv3 13.1 ms14.2 ms 17.3 ms12.8 ms 45
algo: kruskalgpu 472 µs490 µs 924 µs465 µs 1426
algo: tarjan SCCv3 22.8 ms23.6 ms 26.6 ms21.5 ms 26
algo: tarjan SCCgpu 653 µs794 µs 5.43 ms602 µs 869
algo: hopcroft-tarjan biconnectedv3 89.5 ms90.9 ms 93.9 ms85.2 ms 12
algo: hopcroft-tarjan biconnectedgpu 3.58 ms3.73 ms 4.84 ms3.45 ms 182
algo: hierholzer (directed)v3 23.2 ms23.9 ms 26.3 ms22.3 ms 25
algo: hierholzer (directed)gpu 7.86 ms8.05 ms 10.0 ms7.66 ms 78
algo: betweennessCentrality (unweighted)v3 4.02 s4.04 s 4.10 s3.98 s 12
algo: betweennessCentrality (unweighted)gpu 356 ms374 ms 431 ms342 ms 12
algo: degreeCentralityNormalizedv3 14.8 ms15.8 ms 19.3 ms14.1 ms 40
algo: degreeCentralityNormalizedgpu 390 µs402 µs 704 µs385 µs 1738
algo: closenessCentrality (one root)v3 60.2 ms63.8 ms 74.2 ms58.9 ms 12
algo: closenessCentrality (one root)gpu 840 µs872 µs 1.51 ms827 µs 803
algo: degreeCentrality (one root)v3 7.61 µs7.40 µs 7.81 µs6.79 µs 19
algo: degreeCentrality (one root)gpu 216 ns222 ns 312 ns213 ns 763

algorithms N=500 · 10.2 minv4 (gpu) v3

algo: bfs (whole graph)
56×
algo: dfs (whole graph)
56×
algo: dijkstra + pathTo
50×
algo: aStar
3.6×
algo: bellmanFord
20×
algo: kruskal
25×
algo: tarjan SCC
31×
algo: hopcroft-tarjan biconnected
25×
algo: hierholzer (directed)
5.2×
algo: betweennessCentrality (unweighted)
13×
algo: degreeCentralityNormalized
35×
algo: closenessCentrality (one root)
65×
algo: degreeCentrality (one root)
35×
algo: pageRank (20 iters)
70×
algo: closenessCentrality (weighted, one root)
52×
algo: floydWarshall
1.93×
algo: closenessCentralityNormalized
2.5×
algo: markovClustering
1.11×
algo: hierarchicalClustering (threshold)
8.3×
algo: kMeans (fixed centroids)
4.7×
algo: kMedoids
7.7×
algo: fuzzyCMeans
11×
algo: affinityPropagation
4.9×
algo: kargerStein
1.06×
algo: betweennessCentrality (weighted)
8.5×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 12.5 ms12.9 ms 17.6 ms10.7 ms 49
algo: bfs (whole graph)gpu 222 µs226 µs 297 µs206 µs 3094
algo: dfs (whole graph)v3 11.3 ms12.0 ms 14.6 ms10.8 ms 54
algo: dfs (whole graph)gpu 201 µs207 µs 281 µs194 µs 3376
algo: dijkstra + pathTov3 11.7 ms12.5 ms 15.7 ms11.1 ms 52
algo: dijkstra + pathTogpu 232 µs241 µs 346 µs222 µs 2875
algo: aStarv3 442 µs456 µs 744 µs424 µs 1536
algo: aStargpu 124 µs129 µs 179 µs119 µs 5416
algo: bellmanFordv3 16.8 ms16.9 ms 18.1 ms16.4 ms 38
algo: bellmanFordgpu 823 µs845 µs 1.92 ms816 µs 823
algo: kruskalv3 3.18 ms3.46 ms 6.88 ms3.15 ms 198
algo: kruskalgpu 128 µs136 µs 258 µs124 µs 5122
algo: tarjan SCCv3 5.29 ms5.73 ms 9.07 ms5.24 ms 117
algo: tarjan SCCgpu 169 µs176 µs 379 µs149 µs 3893
algo: hopcroft-tarjan biconnectedv3 20.0 ms20.9 ms 23.4 ms19.0 ms 30
algo: hopcroft-tarjan biconnectedgpu 801 µs827 µs 1.13 ms768 µs 842
algo: hierholzer (directed)v3 4.26 ms4.49 ms 7.44 ms4.09 ms 149
algo: hierholzer (directed)gpu 819 µs836 µs 1.12 ms786 µs 813
algo: betweennessCentrality (unweighted)v3 254 ms256 ms 257 ms251 ms 12
algo: betweennessCentrality (unweighted)gpu 20.3 ms20.3 ms 21.0 ms20.0 ms 30
algo: degreeCentralityNormalizedv3 3.45 ms3.79 ms 7.44 ms3.33 ms 181
algo: degreeCentralityNormalizedgpu 97.3 µs99.1 µs 137 µs95.5 µs 7040
algo: closenessCentrality (one root)v3 13.3 ms14.2 ms 18.0 ms12.8 ms 45
algo: closenessCentrality (one root)gpu 203 µs208 µs 267 µs197 µs 3362
algo: degreeCentrality (one root)v3 7.50 µs7.32 µs 7.80 µs6.67 µs 20
algo: degreeCentrality (one root)gpu 213 ns218 ns 326 ns202 ns 781
algo: pageRank (20 iters)v3 2.74 ms2.85 ms 6.09 ms2.68 ms 241
algo: pageRank (20 iters)gpu 39.4 µs44.9 µs 155 µs38.5 µs 15405
algo: closenessCentrality (weighted, one root)v3 13.4 ms14.1 ms 17.2 ms12.9 ms 45
algo: closenessCentrality (weighted, one root)gpu 256 µs262 µs 341 µs247 µs 2672
algo: floydWarshallv3 245 ms270 ms 377 ms243 ms 12
algo: floydWarshallgpu 127 ms127 ms 130 ms124 ms 12
algo: closenessCentralityNormalizedv3 274 ms273 ms 276 ms268 ms 12
algo: closenessCentralityNormalizedgpu 112 ms115 ms 130 ms110 ms 12
algo: markovClusteringv3 4.14 s4.36 s 4.63 s4.07 s 12
algo: markovClusteringgpu 3.74 s3.74 s 3.76 s3.70 s 12
algo: hierarchicalClustering (threshold)v3 34.7 ms34.9 ms 35.9 ms34.2 ms 16
algo: hierarchicalClustering (threshold)gpu 4.19 ms4.40 ms 6.52 ms4.04 ms 154
algo: kMeans (fixed centroids)v3 9.06 ms9.23 ms 10.9 ms8.83 ms 72
algo: kMeans (fixed centroids)gpu 1.92 ms1.96 ms 3.06 ms1.86 ms 354
algo: kMedoidsv3 312 ms276 ms 403 ms108 ms 12
algo: kMedoidsgpu 40.5 ms36.5 ms 43.3 ms20.0 ms 16
algo: fuzzyCMeansv3 77.9 ms79.4 ms 82.0 ms77.0 ms 12
algo: fuzzyCMeansgpu 6.79 ms6.83 ms 7.36 ms6.53 ms 98
algo: affinityPropagationv3 208 ms211 ms 222 ms198 ms 12
algo: affinityPropagationgpu 42.2 ms43.8 ms 45.6 ms39.5 ms 9
algo: kargerSteinv3 321 ms324 ms 338 ms313 ms 12
algo: kargerSteingpu 303 ms305 ms 324 ms293 ms 12
algo: betweennessCentrality (weighted)v3 705 ms710 ms 719 ms698 ms 12
algo: betweennessCentrality (weighted)gpu 82.9 ms84.4 ms 85.6 ms81.6 ms 12

mappers N=2,000 · 24.0 s

mapper: bulk write, color — cpu eval
1.31 ms
mapper: bulk write, color — gpu path
175 µs
mapper: bulk write, color + size — cpu eval
1.56 ms
mapper: bulk write, color + size — gpu color / cpu size
1.47 ms
mapper: bulk write, mapped labels (round-5 path) — label refresh
3.95 ms
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
mapper: bulk write, colorcpu eval 1.31 ms1.36 ms 2.10 ms1.28 ms 509
mapper: bulk write, colorgpu path 175 µs185 µs 350 µs172 µs 3793
mapper: bulk write, color + sizecpu eval 1.56 ms1.60 ms 2.27 ms1.52 ms 434
mapper: bulk write, color + sizegpu color / cpu size 1.47 ms1.50 ms 1.94 ms1.43 ms 456
mapper: bulk write, mapped labels (round-5 path)label refresh 3.95 ms4.20 ms 6.84 ms3.41 ms 161

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

layout: grid
89×
layout: preset
19×
layout: preset (fn form)
37×
layout: circle
6.7×
layout: concentric
15×
layout: breadthfirst
30×
layout: random
8.6×
layout: radial vs breadthfirst-circle (unbalanced tree) — radial
2.63 ms
layout: radial vs breadthfirst-circle (unbalanced tree) — breadthfirst circle
8.09 ms
layout: flow vs breadthfirst (staged DAG) — flow
168 ms
layout: flow vs breadthfirst (staged DAG) — breadthfirst
10.3 ms
layout: force (CPU executor, 20 iterations) — gpu
117 ms
layout: force constrained vs plain (CPU, 20 iterations) — constrained
115 ms
layout: force constrained vs plain (CPU, 20 iterations) — plain
110 ms
layout: force seed — spectral vs scatter (20 iterations) — spectral (landmark MDS, the default)
115 ms
layout: force seed — spectral vs scatter (20 iterations) — scatter
56.5 ms
layout: plumbing (layoutPositions vs setPositions) — finisher
454 µs
layout: plumbing (layoutPositions vs setPositions) — bulk
31.9 µs
layout: contract fixed cost (empty impl vs bulk placement) — wrapper only
535 ns
layout: contract fixed cost (empty impl vs bulk placement) — wrapper + bulk write
40.1 µs
layout: scope (eles.layout, 10% of nodes)
7.1×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
layout: gridv3 11.3 ms12.0 ms 15.2 ms10.2 ms 53
layout: gridgpu 127 µs136 µs 512 µs78.6 µs 4833
layout: presetv3 5.62 ms5.92 ms 8.99 ms5.34 ms 108
layout: presetgpu 295 µs324 µs 691 µs284 µs 2139
layout: preset (fn form)v3 5.55 ms5.83 ms 9.15 ms5.28 ms 114
layout: preset (fn form)gpu 150 µs157 µs 289 µs144 µs 4229
layout: circlev3 9.52 ms10.1 ms 14.9 ms8.99 ms 64
layout: circlegpu 1.42 ms1.57 ms 4.06 ms1.35 ms 435
layout: concentricv3 31.7 ms31.6 ms 36.1 ms27.4 ms 18
layout: concentricgpu 2.05 ms2.31 ms 5.47 ms2.00 ms 291
layout: breadthfirstv3 387 ms396 ms 433 ms378 ms 12
layout: breadthfirstgpu 13.0 ms13.7 ms 19.1 ms12.3 ms 45
layout: randomv3 5.57 ms5.86 ms 9.32 ms5.40 ms 114
layout: randomgpu 646 µs702 µs 1.54 ms628 µs 981
layout: radial vs breadthfirst-circle (unbalanced tree)radial 2.63 ms2.92 ms 5.88 ms2.50 ms 233
layout: radial vs breadthfirst-circle (unbalanced tree)breadthfirst circle 8.09 ms8.51 ms 17.5 ms7.72 ms 76
layout: flow vs breadthfirst (staged DAG)flow 168 ms181 ms 210 ms165 ms 12
layout: flow vs breadthfirst (staged DAG)breadthfirst 10.3 ms10.5 ms 12.2 ms9.96 ms 58
layout: force (CPU executor, 20 iterations)gpu 117 ms120 ms 123 ms111 ms 12
layout: force constrained vs plain (CPU, 20 iterations)constrained 115 ms116 ms 127 ms110 ms 12
layout: force constrained vs plain (CPU, 20 iterations)plain 110 ms115 ms 134 ms101 ms 12
layout: force seed — spectral vs scatter (20 iterations)spectral (landmark MDS, the default) 115 ms115 ms 122 ms111 ms 12
layout: force seed — spectral vs scatter (20 iterations)scatter 56.5 ms56.6 ms 57.0 ms56.1 ms 9
layout: plumbing (layoutPositions vs setPositions)finisher 454 µs497 µs 1.06 ms438 µs 1395
layout: plumbing (layoutPositions vs setPositions)bulk 31.9 µs40.8 µs 188 µs29.9 µs 15982
layout: contract fixed cost (empty impl vs bulk placement)wrapper only 535 ns981 ns 3.58 µs516 ns 159
layout: contract fixed cost (empty impl vs bulk placement)wrapper + bulk write 40.1 µs41.6 µs 45.1 µs39.1 µs 12
layout: scope (eles.layout, 10% of nodes)v3 987 µs1.06 ms 2.39 ms923 µs 574
layout: scope (eles.layout, 10% of nodes)gpu 139 µs155 µs 327 µs130 µs 4412

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

style: sheet swap (compile + applyAll)
5.4×
style: compile vs compile + apply — compile only (in batch)
24.4 µs
style: compile vs compile + apply — compile + apply
2.30 ms
style: first apply on add (256-node band)
1.86×
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — flat
2.29 ms
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — compound
2.79 ms
style: applyAll — constant vs state-case (the 57.1d partition) — constant sheet
2.32 ms
style: applyAll — constant vs state-case (the 57.1d partition) — state-case sheet
2.30 ms
style: applyAll — state-case vs data-case (what the partition avoids) — state-case sheet
2.29 ms
style: applyAll — state-case vs data-case (what the partition avoids) — data-case sheet
10.2 ms
style: select+unselect 256-band — constant vs state-case sheet — constant sheet (skips restyle)
6.75 µs
style: select+unselect 256-band — constant vs state-case sheet — paint-only state sheet (round-61 diff path)
33.8 µs
style: select+unselect 256-band — constant vs state-case sheet — state-case sheet (all channels; full write)
383 µs
style: read one prop (color)
1.67×
style: read one prop (width)
2.2×
style: numericStyle
2.9×
style: renderedStyle (one prop)
14×
style: whole-object style()
5.9×
style: bypass set (ele.style name,value)
4.1×
style: bypass set + removeStyle round-trip
5.9×
style: select+unselect 256-band under the default sheet — bypass punch-out — no bypasses (diff path; the O(0) gate row)
34.4 µs
style: select+unselect 256-band under the default sheet — bypass punch-out — 128 of 256 bypassed (punched out to merged writes)
226 µs
style: sheet swap (applyAll) — 0 vs 128 bypasses — no bypasses
2.45 ms
style: sheet swap (applyAll) — 0 vs 128 bypasses — 128 bypassed
8.83 ms
10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
style: sheet swap (compile + applyAll)v3 12.5 ms12.8 ms 15.8 ms11.8 ms 49
style: sheet swap (compile + applyAll)gpu 2.30 ms2.34 ms 2.92 ms2.21 ms 285
style: compile vs compile + applycompile only (in batch) 24.4 µs26.7 µs 26.1 µs23.8 µs 12
style: compile vs compile + applycompile + apply 2.30 ms2.32 ms 2.82 ms2.21 ms 286
style: first apply on add (256-node band)v3 1.34 ms1.66 ms 6.85 ms1.13 ms 404
style: first apply on add (256-node band)gpu 721 µs830 µs 2.44 ms675 µs 825
style: applyAll, flat vs compound (100 parents — the 14.6 partition)flat 2.29 ms2.35 ms 3.08 ms2.24 ms 294
style: applyAll, flat vs compound (100 parents — the 14.6 partition)compound 2.79 ms2.92 ms 4.63 ms2.73 ms 236
style: applyAll — constant vs state-case (the 57.1d partition)constant sheet 2.32 ms2.40 ms 3.18 ms2.20 ms 289
style: applyAll — constant vs state-case (the 57.1d partition)state-case sheet 2.30 ms2.32 ms 2.57 ms2.23 ms 283
style: applyAll — state-case vs data-case (what the partition avoids)state-case sheet 2.29 ms2.33 ms 2.77 ms2.21 ms 298
style: applyAll — state-case vs data-case (what the partition avoids)data-case sheet 10.2 ms10.4 ms 11.4 ms9.89 ms 60
style: select+unselect 256-band — constant vs state-case sheetconstant sheet (skips restyle) 6.75 µs6.79 µs 6.98 µs6.66 µs 20
style: select+unselect 256-band — constant vs state-case sheetpaint-only state sheet (round-61 diff path) 33.8 µs35.0 µs 63.7 µs32.5 µs 18830
style: select+unselect 256-band — constant vs state-case sheetstate-case sheet (all channels; full write) 383 µs396 µs 564 µs371 µs 1724
style: read one prop (color)v3 95.0 ns108 ns 641 ns82.0 ns 1992887
style: read one prop (color)gpu 56.7 ns62.3 ns 125 ns54.9 ns 2740
style: read one prop (width)v3 114 ns123 ns 431 ns104 ns 1940202
style: read one prop (width)gpu 51.9 ns55.9 ns 305 ns50.0 ns 3052
style: numericStylev3 141 ns135 ns 386 ns86.0 ns 1768034
style: numericStylegpu 49.3 ns51.6 ns 110 ns47.5 ns 3332
style: renderedStyle (one prop)v3 879 ns941 ns 1.94 µs842 ns 561104
style: renderedStyle (one prop)gpu 64.0 ns68.0 ns 179 ns61.4 ns 2513
style: whole-object style()v3 84.5 µs89.5 µs 181 µs81.8 µs 7785
style: whole-object style()gpu 14.3 µs15.9 µs 52.4 µs13.5 µs 42749
style: bypass set (ele.style name,value)v3 10.1 µs10.1 µs 10.4 µs9.81 µs 11
style: bypass set (ele.style name,value)gpu 2.45 µs2.70 µs 4.00 µs2.32 µs 58
style: bypass set + removeStyle round-tripv3 20.5 µs21.8 µs 21.8 µs20.0 µs 12
style: bypass set + removeStyle round-tripgpu 3.46 µs3.64 µs 4.44 µs3.31 µs 42
style: select+unselect 256-band under the default sheet — bypass punch-outno bypasses (diff path; the O(0) gate row) 34.4 µs36.1 µs 68.9 µs33.3 µs 19159
style: select+unselect 256-band under the default sheet — bypass punch-out128 of 256 bypassed (punched out to merged writes) 226 µs236 µs 388 µs218 µs 2948
style: sheet swap (applyAll) — 0 vs 128 bypassesno bypasses 2.45 ms2.47 ms 2.74 ms2.37 ms 264
style: sheet swap (applyAll) — 0 vs 128 bypasses128 bypassed 8.83 ms8.98 ms 10.8 ms8.64 ms 74

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

style( 'background-color' ) (was #4 in the switch)
1.09×
style( 'border-width' ) (was #6 in the switch)
1.21×
style( 'text-wrap' ) (was #73 in the switch)
1.69×
style( 'text-max-width' ) (was #74 in the switch)
1.77×
style( 'taxi-radius' ) (was #142 in the switch)
1.28×
style( 'target-distance-from-node' ) (was #150 in the switch)
1.31×
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.1 µs
colour-valued vs numeric reads (the string build) — gpu background-color (colour)
76.0 ns
colour-valued vs numeric reads (the string build) — gpu border-color (colour)
67.0 ns
colour-valued vs numeric reads (the string build) — gpu border-width (number)
60.9 ns
colour-valued vs numeric reads (the string build) — gpu width (number)
67.3 ns
the getters that ride readProp — gpu numericStyle( width )
67.9 ns
the getters that ride readProp — gpu effectiveOpacity()
20.7 ns
the getters that ride readProp — gpu renderedStyle( width )
86.8 ns
10 ns100 ns1 µs10 µs100 µs
All stats (table view)
groupbenchp50avgp99minsamples
style( 'background-color' ) (was #4 in the switch)v3 60.8 ns62.4 ns 88.6 ns57.0 ns 2747
style( 'background-color' ) (was #4 in the switch)gpu 55.9 ns58.2 ns 94.8 ns53.3 ns 2940
style( 'border-width' ) (was #6 in the switch)v3 60.4 ns61.1 ns 72.8 ns57.8 ns 2810
style( 'border-width' ) (was #6 in the switch)gpu 49.8 ns51.0 ns 65.2 ns47.6 ns 3352
style( 'text-wrap' ) (was #73 in the switch)v3 60.8 ns62.1 ns 76.1 ns59.3 ns 2755
style( 'text-wrap' ) (was #73 in the switch)gpu 36.0 ns37.3 ns 61.7 ns34.6 ns 4603
style( 'text-max-width' ) (was #74 in the switch)v3 60.5 ns63.1 ns 113 ns59.5 ns 2720
style( 'text-max-width' ) (was #74 in the switch)gpu 34.2 ns34.9 ns 47.4 ns33.2 ns 4917
style( 'taxi-radius' ) (was #142 in the switch)v3 62.7 ns63.5 ns 74.3 ns60.4 ns 2707
style( 'taxi-radius' ) (was #142 in the switch)gpu 48.9 ns52.5 ns 80.7 ns47.4 ns 3244
style( 'target-distance-from-node' ) (was #150 in the switch)v3 62.7 ns63.8 ns 78.4 ns60.5 ns 2691
style( 'target-distance-from-node' ) (was #150 in the switch)gpu 48.0 ns49.6 ns 81.0 ns45.9 ns 3448
whole-object style() (gpu-only: v3 returns a different shape)gpu node 13.3 µs13.8 µs 26.2 µs12.8 µs 48745
whole-object style() (gpu-only: v3 returns a different shape)gpu edge 14.1 µs15.2 µs 33.5 µs13.5 µs 44287
colour-valued vs numeric reads (the string build)gpu background-color (colour) 76.0 ns78.3 ns 106 ns73.7 ns 2184
colour-valued vs numeric reads (the string build)gpu border-color (colour) 67.0 ns69.3 ns 101 ns65.3 ns 2471
colour-valued vs numeric reads (the string build)gpu border-width (number) 60.9 ns62.9 ns 91.0 ns59.1 ns 2718
colour-valued vs numeric reads (the string build)gpu width (number) 67.3 ns69.6 ns 130 ns65.5 ns 2460
the getters that ride readPropgpu numericStyle( width ) 67.9 ns69.7 ns 96.5 ns66.2 ns 2457
the getters that ride readPropgpu effectiveOpacity() 20.7 ns21.0 ns 30.3 ns19.8 ns 8130
the getters that ride readPropgpu renderedStyle( width ) 86.8 ns90.0 ns 124 ns83.9 ns 1899

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

load: init from the definition form (construct + dispose)
28×
load: v4 ingest forms (construct + dispose) — definition form
4.35 ms
load: v4 ingest forms (construct + dispose) — columnar form
3.28 ms
load: v4 ingest forms (construct + dispose) — wire buffer
2.88 ms
load: v4 ingest forms (construct + dispose) — def clone alone (control)
301 µs
load: conversion — toColumnarElements
692 µs
load: conversion — serializeElements (from columnar)
179 µs
load: conversion — serializeElements (from defs)
875 µs
load: conversion — deserializeElements
4.45 µs
load: export from a live graph — cy.serialize() (wire)
500 µs
load: export from a live graph — cy.json() (v4)
728 µs
load: cy.json()
2.8×
load: add a 256-node band (add + remove)
1.59×
load: add a 256-node band, v4 forms — definition form
2.22 ms
load: add a 256-node band, v4 forms — columnar form
1.89 ms
load: add a 256-node band, v4 forms — wire buffer
1.91 ms
1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
load: init from the definition form (construct + dispose)v3 135 ms147 ms 173 ms129 ms 12
load: init from the definition form (construct + dispose)gpu 4.89 ms6.39 ms 18.9 ms4.24 ms 100
load: v4 ingest forms (construct + dispose)definition form 4.35 ms6.50 ms 16.6 ms4.11 ms 102
load: v4 ingest forms (construct + dispose)columnar form 3.28 ms4.44 ms 13.2 ms3.17 ms 151
load: v4 ingest forms (construct + dispose)wire buffer 2.88 ms4.24 ms 13.5 ms2.75 ms 160
load: v4 ingest forms (construct + dispose)def clone alone (control) 301 µs627 µs 16.9 ms209 µs 1063
load: conversiontoColumnarElements 692 µs730 µs 1.14 ms661 µs 949
load: conversionserializeElements (from columnar) 179 µs362 µs 957 µs172 µs 1924
load: conversionserializeElements (from defs) 875 µs892 µs 1.32 ms836 µs 779
load: conversiondeserializeElements 4.45 µs4.30 µs 5.85 µs3.25 µs 31
load: export from a live graphcy.serialize() (wire) 500 µs576 µs 2.04 ms485 µs 1193
load: export from a live graphcy.json() (v4) 728 µs1.04 ms 6.66 ms685 µs 653
load: cy.json()v3 2.02 ms2.40 ms 6.22 ms1.93 ms 281
load: cy.json()gpu 722 µs812 µs 3.14 ms696 µs 854
load: add a 256-node band (add + remove)v3 3.60 ms4.32 ms 10.6 ms3.17 ms 152
load: add a 256-node band (add + remove)gpu 2.26 ms2.59 ms 7.77 ms1.53 ms 260
load: add a 256-node band, v4 formsdefinition form 2.22 ms2.23 ms 4.85 ms1.49 ms 306
load: add a 256-node band, v4 formscolumnar form 1.89 ms1.93 ms 3.55 ms1.30 ms 349
load: add a 256-node band, v4 formswire buffer 1.91 ms1.96 ms 3.52 ms1.29 ms 349

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

pick: hit (the walk; one inside-test) — zoom 1
21.0 µs
pick: hit (the walk; one inside-test) — zoom 2
21.0 µs
pick: miss walk — exact vs 24 px touch halo (57.9) — exact
46.4 µs
pick: miss walk — exact vs 24 px touch halo (57.9) — padPx 24
44.4 µs
pick: shape inside-test, 2000 coincident misses — ellipse
87.2 µs
pick: shape inside-test, 2000 coincident misses — star
234 µs
pick: shape inside-test, 2000 coincident misses — round-hexagon
796 µs
pick: shape inside-test, 2000 coincident misses — barrel
696 µs
pick: shape inside-test, 2000 coincident misses — cut-rectangle
99.3 µs
pick: shape inside-test, 2000 coincident misses — polygon
211 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 1
796 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 2
802 µs
pick: background miss (full highWater walk) — gpu
44.9 µs
pick: label box in the scan (text-events) — text-events: no
44.9 µs
pick: label box in the scan (text-events) — text-events: yes
125 µs
box: elementsInBox by covered fraction — 10%
150 µs
box: elementsInBox by covered fraction — 50%
196 µs
box: elementsInBox by covered fraction — 100%
325 µs
box: label containment (boxSelectionIncludesLabels) — off
229 µs
box: label containment (boxSelectionIncludesLabels) — on
264 µs
box: overlap vs contain (straight edges) — contain
239 µs
box: overlap vs contain (straight edges) — overlap
481 µs
box: overlap vs contain (curved edges — the segment walk) — contain
1.25 ms
box: overlap vs contain (curved edges — the segment walk) — overlap
1.21 ms
bounds: whole-graph boundingBox()
6.2×
bounds: boundingBox, labels in vs out (v4) — includeLabels: true (default)
1.25 ms
bounds: boundingBox, labels in vs out (v4) — includeLabels: false
657 µs
bounds: cy.fit() (whole-graph scan)
33×
bounds: getFitViewport() (compute without committing)
33×
bounds: boundingBoxAt (v4 only) — gpu
1.49 ms
bounds: one node boundingBox()
1.58×
bounds: labelBoundingBox (v4 only) — gpu
450 ns
bounds: compound + taxi exact scan (rounds 54/92, v4 only) — warm (curve bbs memoized)
19.3 µs
bounds: compound + taxi exact scan (rounds 54/92, v4 only) — cold (geometry write per call)
207 µs
bounds: straight-only scan (ndex-shaped, round 92, v4 only) — warm
34.2 µs
bounds: straight-only scan (ndex-shaped, round 92, v4 only) — cold (geometry write per call)
34.4 µ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.5 µs 39.2 µs20.1 µs 31904
pick: hit (the walk; one inside-test)zoom 2 21.0 µs21.6 µs 22.9 µs20.8 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)exact 46.4 µs46.6 µs 47.3 µs45.1 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)padPx 24 44.4 µs45.6 µs 83.6 µs43.0 µs 15258
pick: shape inside-test, 2000 coincident missesellipse 87.2 µs89.5 µs 134 µs83.2 µs 7802
pick: shape inside-test, 2000 coincident missesstar 234 µs247 µs 391 µs224 µs 2832
pick: shape inside-test, 2000 coincident missesround-hexagon 796 µs808 µs 949 µs776 µs 866
pick: shape inside-test, 2000 coincident missesbarrel 696 µs713 µs 987 µs675 µs 979
pick: shape inside-test, 2000 coincident missescut-rectangle 99.3 µs102 µs 154 µs95.6 µs 6888
pick: shape inside-test, 2000 coincident missespolygon 211 µs215 µs 282 µs203 µs 3253
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 1 796 µs814 µs 1.02 ms783 µs 859
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 2 802 µs821 µs 1.16 ms777 µs 852
pick: background miss (full highWater walk)gpu 44.9 µs45.4 µs 46.0 µs44.3 µs 12
pick: label box in the scan (text-events)text-events: no 44.9 µs45.1 µs 45.8 µs44.3 µs 12
pick: label box in the scan (text-events)text-events: yes 125 µs128 µs 202 µs120 µs 5424
box: elementsInBox by covered fraction10% 150 µs157 µs 294 µs145 µs 4470
box: elementsInBox by covered fraction50% 196 µs201 µs 269 µs191 µs 3462
box: elementsInBox by covered fraction100% 325 µs338 µs 791 µs308 µs 2065
box: label containment (boxSelectionIncludesLabels)off 229 µs239 µs 423 µs221 µs 2930
box: label containment (boxSelectionIncludesLabels)on 264 µs273 µs 580 µs252 µs 2557
box: overlap vs contain (straight edges)contain 239 µs247 µs 462 µs228 µs 2826
box: overlap vs contain (straight edges)overlap 481 µs488 µs 802 µs425 µs 1430
box: overlap vs contain (curved edges — the segment walk)contain 1.25 ms1.28 ms 1.66 ms1.24 ms 545
box: overlap vs contain (curved edges — the segment walk)overlap 1.21 ms1.26 ms 1.94 ms1.17 ms 554
bounds: whole-graph boundingBox()v3 7.66 ms7.92 ms 10.1 ms7.44 ms 82
bounds: whole-graph boundingBox()gpu 1.24 ms1.26 ms 1.63 ms1.21 ms 549
bounds: boundingBox, labels in vs out (v4)includeLabels: true (default) 1.25 ms1.28 ms 1.96 ms1.21 ms 543
bounds: boundingBox, labels in vs out (v4)includeLabels: false 657 µs672 µs 971 µs639 µs 1041
bounds: cy.fit() (whole-graph scan)v3 7.55 ms7.64 ms 8.56 ms7.35 ms 88
bounds: cy.fit() (whole-graph scan)gpu 231 µs241 µs 319 µs226 µs 2896
bounds: getFitViewport() (compute without committing)v3 7.54 ms7.71 ms 9.00 ms7.23 ms 87
bounds: getFitViewport() (compute without committing)gpu 231 µs239 µs 303 µs225 µs 2915
bounds: boundingBoxAt (v4 only)gpu 1.49 ms1.57 ms 2.71 ms1.42 ms 434
bounds: one node boundingBox()v3 1.63 µs1.67 µs 2.31 µs1.58 µs 98
bounds: one node boundingBox()gpu 1.03 µs1.04 µs 1.18 µs994 ns 157
bounds: labelBoundingBox (v4 only)gpu 450 ns473 ns 891 ns422 ns 354
bounds: compound + taxi exact scan (rounds 54/92, v4 only)warm (curve bbs memoized) 19.3 µs20.1 µs 43.0 µs18.5 µs 34084
bounds: compound + taxi exact scan (rounds 54/92, v4 only)cold (geometry write per call) 207 µs214 µs 326 µs200 µs 3260
bounds: straight-only scan (ndex-shaped, round 92, v4 only)warm 34.2 µs34.7 µs 36.0 µs33.8 µs 12
bounds: straight-only scan (ndex-shaped, round 92, v4 only)cold (geometry write per call) 34.4 µs34.8 µs 35.4 µs33.9 µs 12

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

data: bulk write, numeric column
21×
data: bulk write, dictionary string column (4 values)
18×
data: bulk write, one new dictionary entry per pass
19×
data: bulk write, object column (plain-array fallback)
22×
data: removeData (whole collection)
8.2×
data: read one numeric key
1.36×
data: read one string key (dictionary decode)
1.33×
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.4×
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.81 ms1.86 ms 3.03 ms1.69 ms 359
data: bulk write, numeric columngpu 84.9 µs89.7 µs 158 µs81.3 µs 7797
data: bulk write, dictionary string column (4 values)v3 1.80 ms1.84 ms 2.43 ms1.73 ms 368
data: bulk write, dictionary string column (4 values)gpu 102 µs107 µs 309 µs93.3 µs 6534
data: bulk write, one new dictionary entry per passv3 1.84 ms1.91 ms 3.24 ms1.72 ms 358
data: bulk write, one new dictionary entry per passgpu 98.8 µs104 µs 186 µs94.5 µs 6747
data: bulk write, object column (plain-array fallback)v3 1.81 ms1.90 ms 3.05 ms1.75 ms 363
data: bulk write, object column (plain-array fallback)gpu 83.3 µs85.8 µs 130 µs79.0 µs 8146
data: removeData (whole collection)v3 2.76 ms2.95 ms 5.22 ms2.64 ms 232
data: removeData (whole collection)gpu 335 µs348 µs 601 µs326 µs 1965
data: read one numeric keyv3 38.3 ns40.0 ns 53.6 ns36.6 ns 4291
data: read one numeric keygpu 28.2 ns29.7 ns 41.7 ns27.5 ns 5745
data: read one string key (dictionary decode)v3 41.4 ns43.0 ns 82.5 ns39.7 ns 3991
data: read one string key (dictionary decode)gpu 31.1 ns31.8 ns 71.8 ns26.7 ns 5381
data: read the whole objectv3 45.6 ns46.8 ns 67.8 ns43.5 ns 3676
data: read the whole objectgpu 21.0 ns22.5 ns 43.4 ns19.9 ns 7575
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })v3 664 µs687 µs 1.04 ms630 µs 1016
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })gpu 47.6 µs51.6 µs 127 µs41.3 µs 13381
query: data comparison ([weight > 3] vs { gt })v3 762 µs786 µs 1.17 ms731 µs 888
query: data comparison ([weight > 3] vs { gt })gpu 70.1 µs73.6 µs 174 µs57.0 µs 9439
query: two keys AND-edv3 801 µs823 µs 1.07 ms790 µs 847
query: two keys AND-edgpu 67.1 µs70.4 µs 129 µs64.4 µs 9892
query: membership ([bucket in ...] vs { in })v3 1.02 ms1.04 ms 1.38 ms979 µs 673
query: membership ([bucket in ...] vs { in })gpu 64.8 µs71.5 µs 189 µs61.6 µs 9479
query: predicate function (both sides)v3 672 µs687 µs 988 µs655 µs 1013
query: predicate function (both sides)gpu 90.3 µs97.6 µs 168 µs86.1 µs 7146
query: structural, parents (:parent vs { parent: true })v3 526 µs535 µs 634 µs514 µs 1306
query: structural, parents (:parent vs { parent: true })gpu 15.6 µs17.7 µs 23.3 µs15.1 µs 12
query: structural, childless (:childless vs { parent: false })v3 793 µs809 µs 988 µs774 µs 862
query: structural, childless (:childless vs { parent: false })gpu 60.4 µs80.0 µs 284 µs56.6 µs 8604
query: structural, orphans (:orphan vs { child: false })v3 504 µs524 µs 984 µs489 µs 1335
query: structural, orphans (:orphan vs { child: false })gpu 15.3 µs15.8 µs 15.5 µs15.1 µs 12

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

emit: position write, no listeners
25×
emit: 1 core listener
8.2×
emit: 1 element (ref-qualified) listener
7.7×
emit: delegated (v3 selector vs v4 predicate)
7.9×
emit: 10 core listeners
6.5×
emit: on() + off() round-trip
2.2×
emit: flat vs phased (compound bubbling, 14.5) — orphan (flat emit)
300 ns
emit: flat vs phased (compound bubbling, 14.5) — child of 2 ancestors (phased)
877 ns
emit: flat vs phased, no listeners — orphan (flat)
87.5 ns
emit: flat vs phased, no listeners — child (phased)
513 ns
anim: start + stop, one element
1.35×
anim: start against a running animation (round-21 eviction) — disjoint channels (composes)
1.31 µs
anim: start against a running animation (round-21 eviction) — overlapping channels (evicts)
831 ns
anim: start + stop, 512-node collection
3.0×
anim: delay() (no channels touched)
1.59×
anim: controls (v4 only) — pause + resume
466 ns
anim: controls (v4 only) — reverse
877 ns
anim: viewport animate + stop
2.7×
10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
emit: position write, no listenersv3 1.31 µs1.33 µs 1.60 µs1.27 µs 114
emit: position write, no listenersgpu 51.6 ns54.5 ns 117 ns49.6 ns 3132
emit: 1 core listenerv3 1.40 µs1.41 µs 1.57 µs1.35 µs 109
emit: 1 core listenergpu 170 ns191 ns 429 ns165 ns 835
emit: 1 element (ref-qualified) listenerv3 1.40 µs1.42 µs 1.58 µs1.36 µs 111
emit: 1 element (ref-qualified) listenergpu 182 ns186 ns 260 ns177 ns 848
emit: delegated (v3 selector vs v4 predicate)v3 1.46 µs1.55 µs 2.56 µs1.40 µs 102
emit: delegated (v3 selector vs v4 predicate)gpu 185 ns195 ns 357 ns178 ns 819
emit: 10 core listenersv3 1.97 µs1.99 µs 2.15 µs1.88 µs 77
emit: 10 core listenersgpu 304 ns338 ns 681 ns302 ns 487
emit: on() + off() round-tripv3 462 ns565 ns 1.44 µs423 ns 289
emit: on() + off() round-tripgpu 210 ns256 ns 921 ns180 ns 635
emit: flat vs phased (compound bubbling, 14.5)orphan (flat emit) 300 ns349 ns 2.08 µs279 ns 965040
emit: flat vs phased (compound bubbling, 14.5)child of 2 ancestors (phased) 877 ns932 ns 1.26 µs852 ns 169
emit: flat vs phased, no listenersorphan (flat) 87.5 ns97.3 ns 182 ns86.0 ns 1698
emit: flat vs phased, no listenerschild (phased) 513 ns545 ns 1.68 µs494 ns 305
anim: start + stop, one elementv3 848 ns1.25 µs 3.23 µs804 ns 410765
anim: start + stop, one elementgpu 630 ns1.06 µs 4.66 µs592 ns 457809
anim: start against a running animation (round-21 eviction)disjoint channels (composes) 1.31 µs2.02 µs 4.05 µs1.10 µs 75
anim: start against a running animation (round-21 eviction)overlapping channels (evicts) 831 ns1.43 µs 3.57 µs805 ns 106
anim: start + stop, 512-node collectionv3 297 µs419 µs 1.07 ms286 µs 1527
anim: start + stop, 512-node collectiongpu 99.5 µs111 µs 159 µs94.8 µs 5782
anim: delay() (no channels touched)v3 653 ns955 ns 3.21 µs638 ns 168
anim: delay() (no channels touched)gpu 412 ns719 ns 2.68 µs399 ns 226
anim: controls (v4 only)pause + resume 466 ns740 ns 2.59 µs444 ns 207
anim: controls (v4 only)reverse 877 ns1.52 µs 3.58 µs847 ns 100
anim: viewport animate + stopv3 553 ns843 ns 3.04 µs540 ns 192
anim: viewport animate + stopgpu 203 ns233 ns 1.38 µs196 ns 716

store N=2,000 · 1.0 min

id index: set x 2000 (build) — gpu
262 µs
id index: single-key operations — get (probe)
66.6 ns
id index: single-key operations — has
51.0 ns
id index: single-key operations — idAt (memoized hit)
8.99 ns
id index: single-key operations — hashAt
7.02 ns
id index: remove + re-set (churn, drives the round-11 reclaim) — gpu
232 ns
adjacency: rebuild (4000 edges, two counting passes) — gpu
39.0 µs
adjacency: reads — outDegree (O(1))
6.11 ns
adjacency: reads — outEdges
45.1 ns
adjacency: reads — connectedEdges
119 ns
adjacency: addEdge + removeEdge (the overlay path) — gpu
140 ns
blob: write x 2000 (build) — gpu
103 µs
blob: single-record operations — rewrite in place (same length)
29.8 ns
blob: single-record operations — offsetOf
4.24 ns
blob: single-record operations — free + rewrite
151 ns
dirty: mark (per-write span coalescing) — contiguous marks
12.8 ns
dirty: mark (per-write span coalescing) — scattered marks
17.7 ns
dirty: take (a frame's drain) — gpu
590 ns
images: registry bookkeeping — acquire (existing url)
206 ns
images: registry bookkeeping — acquire (new url) + release
533 ns
charts: sheet apply, chart vs no chart — no chart
2.26 ms
charts: sheet apply, chart vs no chart — pie from data (blob record per node)
2.69 ms
charts: data write refreshing chart-values — gpu
1.48 ms
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
id index: set x 2000 (build)gpu 262 µs272 µs 409 µs245 µs 2527
id index: single-key operationsget (probe) 66.6 ns66.5 ns 126 ns54.6 ns 2566
id index: single-key operationshas 51.0 ns52.8 ns 81.0 ns49.4 ns 3240
id index: single-key operationsidAt (memoized hit) 8.99 ns9.22 ns 17.5 ns8.53 ns 18401
id index: single-key operationshashAt 7.02 ns7.17 ns 12.3 ns6.80 ns 23643
id index: remove + re-set (churn, drives the round-11 reclaim)gpu 232 ns235 ns 294 ns222 ns 714
adjacency: rebuild (4000 edges, two counting passes)gpu 39.0 µs45.8 µs 193 µs36.7 µs 15151
adjacency: readsoutDegree (O(1)) 6.11 ns6.27 ns 11.3 ns5.78 ns 26946
adjacency: readsoutEdges 45.1 ns46.3 ns 69.0 ns44.1 ns 3691
adjacency: readsconnectedEdges 119 ns179 ns 2.08 µs111 ns 941
adjacency: addEdge + removeEdge (the overlay path)gpu 140 ns144 ns 203 ns135 ns 1188
blob: write x 2000 (build)gpu 103 µs124 µs 638 µs99.6 µs 5646
blob: single-record operationsrewrite in place (same length) 29.8 ns30.3 ns 40.9 ns28.8 ns 5628
blob: single-record operationsoffsetOf 4.24 ns4.39 ns 9.14 ns4.10 ns 38343
blob: single-record operationsfree + rewrite 151 ns171 ns 501 ns145 ns 999
dirty: mark (per-write span coalescing)contiguous marks 12.8 ns13.2 ns 22.5 ns12.2 ns 12893
dirty: mark (per-write span coalescing)scattered marks 17.7 ns18.3 ns 30.0 ns17.1 ns 9299
dirty: take (a frame's drain)gpu 590 ns690 ns 1.24 µs582 ns 239
images: registry bookkeepingacquire (existing url) 206 ns211 ns 265 ns200 ns 808
images: registry bookkeepingacquire (new url) + release 533 ns606 ns 2.83 µs521 ns 272
charts: sheet apply, chart vs no chartno chart 2.26 ms2.30 ms 3.11 ms2.20 ms 296
charts: sheet apply, chart vs no chartpie from data (blob record per node) 2.69 ms2.73 ms 3.18 ms2.61 ms 251
charts: data write refreshing chart-valuesgpu 1.48 ms1.52 ms 1.98 ms1.42 ms 458

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

viewport: zoom() get
4.7×
viewport: zoom( n ) set
1.87×
viewport: pan() get
1.18×
viewport: pan( p ) set
1.86×
viewport: panBy()
1.68×
viewport: extent()
1.52×
viewport: renderedExtent()
1.64×
viewport: width() + height() + size() (3 calls)
3.7×
viewport: minZoom/maxZoom get (2 calls)
15×
viewport: center( eles )
17×
viewport: reset()
107×
viewport: viewport({ zoom, pan })
58×
viewport: getCenterPan( eles ) — gpu
6.60 µs
core: instanceString + headless + styleEnabled (3 calls)
1.23×
core: hasElementWithId + hasCompoundNodes (2 calls)
1.17×
core: options()
85×
core: elements() memo hit (was mutableElements, round 90)
1.04×
core: gating getters (5 calls)
1.17×
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)
8387×
core: graph scratch() set + get (v3 restyles the graph)
16479×
core: batch( fn ) (empty)
6.6×
core: startBatch + endBatch + batching
5.9×
core: collection()
7.2×
core: compact() (no dead slots — the early-out) — gpu
16.7 µs
collection: element accessors (id/group/isNode/isEdge, 4 calls)
1.74×
collection: length + empty + nonempty (3 calls)
4.6×
collection: eq/first/last (3 calls)
1.83×
collection: slice()
2.2×
collection: toArray()
12×
collection: sort( fn )
1.58×
collection: reduce( fn )
1.40×
collection: min + max ( fn ) (2 calls)
1.97×
collection: some + every (2 calls)
1.59×
collection: same + anySame + contains (3 calls)
73×
collection: allAre (all match: the full walk)
1.41×
collection: is (none match: the full walk)
2.2×
collection: union
5.9×
collection: intersection
29×
collection: difference
29×
collection: symmetricDifference
3.7×
collection: absoluteComplement
16×
collection: byGroup
3.1×
collection: diff
3.1×
collection: indexOf
1.38×
traversal: openNeighborhood + closedNeighborhood (2 calls)
3.0×
traversal: connectedNodes
3.2×
traversal: sources + targets (2 calls)
3.2×
traversal: source() + target() (2 calls)
1.33×
traversal: edgesWith
1.29×
traversal: edgesTo
1.31×
traversal: parallelEdges + codirectedEdges (2 calls)
3.4×
traversal: roots + leaves (2 calls)
13×
traversal: allAreNeighbors
5.3×
traversal: isLoop + isSimple (2 calls)
2.7×
degree: indegree + outdegree (2 calls)
76×
degree: minDegree + maxDegree (2 calls)
43×
degree: minIndegree + maxOutdegree (2 calls)
25×
dimensions: renderedPosition get
2.5×
dimensions: relativePosition get
10×
dimensions: width + height + outerWidth + outerHeight (4 calls)
2.8×
dimensions: rendered dims (4 calls)
3.1×
dimensions: renderedBoundingBox
1.83×
dimensions: midpoint + renderedMidpoint (2 calls) — gpu
1.17 µs
dimensions: source/targetEndpoint (2 calls) — gpu
380 ns
dimensions: rendered source/targetEndpoint (2 calls) — gpu
389 ns
dimensions: shift + silentShift (round-trip)
60×
dimensions: silentPosition
15×
dimensions: positions( fn ) over 100
50×
dimensions: padding + paddedWidth + paddedHeight (3 calls)
13×
curves: isBundledBezier — gpu
20.6 ns
curves: controlPoints + renderedControlPoints (2 calls) — gpu
527 ns
curves: segmentPoints (undefined for bezier) — gpu
33.4 ns
compound: parent + parents + ancestors (3 calls)
3.6×
compound: children + descendants + siblings (3 calls)
4.7×
compound: orphans + nonorphans (2 calls)
7.0×
compound: commonAncestors
128×
compound: isParent/isChild/isChildless/isOrphan (4 calls)
1.58×
flags: select + unselect + selected (band)
16×
flags: selectify + unselectify + selectable
95×
flags: lock + unlock + locked
94×
flags: grabify + ungrabify + grabbable
96×
flags: show + hide + visible
231×
flags: active/activate/unactivate (3 calls)
16×
flags: panify + unpanify + pannable
97×
flags: takesUpSpace + interactive + transparent (3 calls)
3.1×
flags: effectiveOpacity
2.3×
element data: scratch get + set
7.7×
element data: json() one element
1.97×
element data: jsons() over 100
1.95×
element data: label() — gpu
15.2 ns
core: batch + per-id data() (was batchData, round 90)
8.9×
core: animated()
4.9×
core: zoomRange get — gpu
2.16 ns
core: resize() / invalidateSize()
2.4×
core: on('render') + off('render') (was onRender/offRender, round 90)
2.5×
core: removeScratch()
9509×
core: selectionType get
2.0×
core: isReady()
2.2×
core: window()
2.8×
core: container()
2.6×
core: destroyed()
2.2×
core: removeAllListeners()
8.5×
collection: cy()
3.5×
collection: indexOfId()
1.76×
collection: removed() + inside() (2 calls)
1.18×
collection: silentPositions( fn ) over 100
31×
collection: animated()
2.9×
collection: delayAnimation()
2.9×
collection: removeScratch()
8.9×
collection: component()
45×
collection: layoutDimensions()
3.6×
degree: maxIndegree + minOutdegree (2 calls)
25×
flags: grabbed + hidden + inactive (3 calls)
2.2×
curves: renderedSegmentPoints — gpu
35.9 ns
layout contract: edgeSlots + endpoints + degreeOf — gpu
34.7 µs
formats: isColumnarElements + isSerializedElements + isPackedIds — gpu
4.61 ns
0.100 ns1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
viewport: zoom() getv3 5.61 ns5.72 ns 10.2 ns5.45 ns 29426
viewport: zoom() getgpu 1.21 ns1.24 ns 1.77 ns1.18 ns 127419
viewport: zoom( n ) setv3 615 ns622 ns 746 ns588 ns 267
viewport: zoom( n ) setgpu 329 ns338 ns 518 ns310 ns 498
viewport: pan() getv3 5.75 ns6.63 ns 14.2 ns5.38 ns 25344
viewport: pan() getgpu 4.86 ns5.06 ns 11.3 ns4.76 ns 33457
viewport: pan( p ) setv3 607 ns626 ns 1.00 µs582 ns 269
viewport: pan( p ) setgpu 326 ns333 ns 397 ns316 ns 507
viewport: panBy()v3 587 ns593 ns 688 ns568 ns 284
viewport: panBy()gpu 348 ns353 ns 537 ns319 ns 471
viewport: extent()v3 29.4 ns45.1 ns 219 ns28.0 ns 3736
viewport: extent()gpu 19.3 ns26.4 ns 108 ns18.1 ns 6352
viewport: renderedExtent()v3 27.1 ns28.2 ns 50.1 ns25.8 ns 6001
viewport: renderedExtent()gpu 16.5 ns23.1 ns 97.8 ns15.1 ns 7325
viewport: width() + height() + size() (3 calls)v3 20.8 ns21.7 ns 43.0 ns20.0 ns 7819
viewport: width() + height() + size() (3 calls)gpu 5.58 ns5.92 ns 12.4 ns5.33 ns 28407
viewport: minZoom/maxZoom get (2 calls)v3 14.7 ns15.3 ns 26.6 ns14.0 ns 11122
viewport: minZoom/maxZoom get (2 calls)gpu 0.998 ns1.03 ns 1.45 ns0.977 ns 152604
viewport: center( eles )v3 117 µs122 µs 240 µs110 µs 5684
viewport: center( eles )gpu 6.68 µs6.67 µs 6.75 µs6.57 µs 21
viewport: reset()v3 935 ns1.02 µs 1.58 µs910 ns 163
viewport: reset()gpu 8.76 ns9.07 ns 15.8 ns8.43 ns 18636
viewport: viewport({ zoom, pan })v3 920 ns1.00 µs 1.54 µs880 ns 164
viewport: viewport({ zoom, pan })gpu 15.8 ns16.6 ns 37.1 ns15.0 ns 10241
viewport: getCenterPan( eles )gpu 6.60 µs6.60 µs 6.70 µs6.48 µs 22
core: instanceString + headless + styleEnabled (3 calls)v3 32.2 ns33.2 ns 48.2 ns30.9 ns 5133
core: instanceString + headless + styleEnabled (3 calls)gpu 26.3 ns27.0 ns 37.8 ns25.4 ns 6322
core: hasElementWithId + hasCompoundNodes (2 calls)v3 38.4 ns41.6 ns 66.1 ns37.5 ns 4117
core: hasElementWithId + hasCompoundNodes (2 calls)gpu 32.8 ns34.0 ns 60.4 ns32.0 ns 5020
core: options()v3 90.9 ns93.8 ns 155 ns88.1 ns 1821
core: options()gpu 1.07 ns1.18 ns 2.20 ns1.05 ns 135670
core: elements() memo hit (was mutableElements, round 90)v3 2.40 ns2.48 ns 4.62 ns2.35 ns 66654
core: elements() memo hit (was mutableElements, round 90)gpu 2.30 ns2.38 ns 4.07 ns2.20 ns 69479
core: gating getters (5 calls)v3 15.6 ns16.3 ns 31.3 ns15.0 ns 10505
core: gating getters (5 calls)gpu 13.3 ns13.7 ns 23.3 ns12.3 ns 12456
core: gating setters round-trip (autolock/autoungrabify/autounselectify)v3 11.2 ns11.7 ns 22.8 ns10.6 ns 14632
core: gating setters round-trip (autolock/autoungrabify/autounselectify)gpu 6.00 ns6.20 ns 13.2 ns5.73 ns 27343
core: interaction tuning getters (5 calls)gpu 7.30 ns7.47 ns 11.5 ns7.14 ns 22719
core: graph data() set + get (v3 restyles the graph)v3 2.76 ms2.80 ms 3.14 ms2.67 ms 246
core: graph data() set + get (v3 restyles the graph)gpu 329 ns336 ns 491 ns315 ns 497
core: graph scratch() set + get (v3 restyles the graph)v3 2.79 ms2.83 ms 3.22 ms2.71 ms 243
core: graph scratch() set + get (v3 restyles the graph)gpu 169 ns172 ns 277 ns162 ns 995
core: batch( fn ) (empty)v3 545 ns651 ns 1.60 µs517 ns 254
core: batch( fn ) (empty)gpu 82.6 ns84.6 ns 111 ns81.0 ns 2000
core: startBatch + endBatch + batchingv3 537 ns657 ns 1.63 µs516 ns 255
core: startBatch + endBatch + batchinggpu 90.7 ns164 ns 2.86 µs87.2 ns 1017
core: collection()v3 447 ns514 ns 1.50 µs428 ns 326
core: collection()gpu 62.1 ns64.4 ns 96.5 ns60.2 ns 2623
core: compact() (no dead slots — the early-out)gpu 16.7 µs21.5 µs 105 µs16.4 µs 31937
collection: element accessors (id/group/isNode/isEdge, 4 calls)v3 60.1 ns62.7 ns 92.1 ns55.7 ns 2719
collection: element accessors (id/group/isNode/isEdge, 4 calls)gpu 34.5 ns36.3 ns 64.4 ns33.5 ns 4693
collection: length + empty + nonempty (3 calls)v3 6.70 ns6.92 ns 12.7 ns6.34 ns 24506
collection: length + empty + nonempty (3 calls)gpu 1.47 ns1.51 ns 1.92 ns1.43 ns 107651
collection: eq/first/last (3 calls)v3 15.1 ns15.6 ns 24.7 ns14.6 ns 10959
collection: eq/first/last (3 calls)gpu 8.24 ns8.48 ns 15.3 ns7.77 ns 20017
collection: slice()v3 3.73 µs3.83 µs 4.27 µs3.63 µs 41
collection: slice()gpu 1.71 µs1.72 µs 1.87 µs1.64 µs 95
collection: toArray()v3 8.94 µs9.08 µs 9.42 µs8.77 µs 15
collection: toArray()gpu 739 ns760 ns 944 ns717 ns 213
collection: sort( fn )v3 14.2 µs14.7 µs 14.5 µs13.8 µs 12
collection: sort( fn )gpu 8.97 µs9.03 µs 9.26 µs8.86 µs 15
collection: reduce( fn )v3 156 ns157 ns 171 ns116 ns 1083
collection: reduce( fn )gpu 111 ns113 ns 129 ns108 ns 1520
collection: min + max ( fn ) (2 calls)v3 10.9 µs11.0 µs 11.0 µs10.8 µs 12
collection: min + max ( fn ) (2 calls)gpu 5.54 µs5.61 µs 5.91 µs5.48 µs 26
collection: some + every (2 calls)v3 887 ns900 ns 1.15 µs860 ns 181
collection: some + every (2 calls)gpu 559 ns560 ns 598 ns539 ns 303
collection: same + anySame + contains (3 calls)v3 7.49 µs7.50 µs 7.64 µs7.39 µs 19
collection: same + anySame + contains (3 calls)gpu 102 ns104 ns 120 ns97.4 ns 1646
collection: allAre (all match: the full walk)v3 3.61 µs3.60 µs 3.96 µs3.36 µs 43
collection: allAre (all match: the full walk)gpu 2.56 µs2.61 µs 3.40 µs2.48 µs 60
collection: is (none match: the full walk)v3 5.59 µs5.60 µs 5.91 µs5.37 µs 27
collection: is (none match: the full walk)gpu 2.50 µs2.56 µs 3.28 µs2.50 µs 61
collection: unionv3 96.6 µs103 µs 132 µs93.5 µs 6704
collection: uniongpu 16.3 µs16.6 µs 16.7 µs15.7 µs 12
collection: intersectionv3 92.2 µs101 µs 138 µs90.3 µs 6835
collection: intersectiongpu 3.21 µs3.22 µs 3.37 µs3.12 µs 48
collection: differencev3 93.6 µs105 µs 209 µs92.2 µs 6590
collection: differencegpu 3.20 µs3.23 µs 3.51 µs3.13 µs 48
collection: symmetricDifferencev3 24.9 µs25.4 µs 25.4 µs24.4 µs 12
collection: symmetricDifferencegpu 6.69 µs6.72 µs 6.91 µs6.63 µs 21
collection: absoluteComplementv3 6.34 ms6.90 ms 10.6 ms6.10 ms 98
collection: absoluteComplementgpu 407 µs413 µs 545 µs393 µs 1696
collection: byGroupv3 1.01 ms1.03 ms 1.49 ms972 µs 681
collection: byGroupgpu 322 µs331 µs 551 µs238 µs 2118
collection: diffv3 36.4 µs36.9 µs 39.0 µs34.5 µs 12
collection: diffgpu 11.6 µs11.6 µs 11.8 µs11.4 µs 11
collection: indexOfv3 32.2 ns33.6 ns 66.9 ns31.1 ns 5112
collection: indexOfgpu 23.4 ns24.2 ns 35.9 ns22.6 ns 7063
traversal: openNeighborhood + closedNeighborhood (2 calls)v3 9.33 µs9.51 µs 10.2 µs9.28 µs 14
traversal: openNeighborhood + closedNeighborhood (2 calls)gpu 3.16 µs3.37 µs 3.86 µs3.05 µs 46
traversal: connectedNodesv3 970 ns1.05 µs 1.86 µs941 ns 158
traversal: connectedNodesgpu 303 ns309 ns 373 ns295 ns 549
traversal: sources + targets (2 calls)v3 1.72 µs1.89 µs 3.12 µs1.68 µs 84
traversal: sources + targets (2 calls)gpu 539 ns744 ns 2.49 µs511 ns 223
traversal: source() + target() (2 calls)v3 74.7 ns75.9 ns 96.6 ns61.8 ns 2250
traversal: source() + target() (2 calls)gpu 56.2 ns57.3 ns 68.4 ns53.9 ns 2989
traversal: edgesWithv3 68.8 µs71.6 µs 125 µs66.4 µs 9739
traversal: edgesWithgpu 53.3 µs53.7 µs 54.9 µs51.9 µs 12
traversal: edgesTov3 69.7 µs72.2 µs 143 µs67.5 µs 9626
traversal: edgesTogpu 53.1 µs53.5 µs 54.3 µs52.1 µs 12
traversal: parallelEdges + codirectedEdges (2 calls)v3 3.56 µs3.86 µs 4.62 µs3.45 µs 40
traversal: parallelEdges + codirectedEdges (2 calls)gpu 1.04 µs1.24 µs 2.06 µs1.03 µs 130
traversal: roots + leaves (2 calls)v3 4.88 ms5.29 ms 8.62 ms4.69 ms 128
traversal: roots + leaves (2 calls)gpu 389 µs397 µs 575 µs372 µs 1764
traversal: allAreNeighborsv3 198 µs211 µs 275 µs193 µs 3303
traversal: allAreNeighborsgpu 37.2 µs38.1 µs 40.5 µs36.9 µs 12
traversal: isLoop + isSimple (2 calls)v3 131 ns133 ns 149 ns125 ns 1292
traversal: isLoop + isSimple (2 calls)gpu 49.3 ns50.7 ns 65.9 ns47.5 ns 3372
degree: indegree + outdegree (2 calls)v3 3.53 µs3.91 µs 4.96 µs3.48 µs 40
degree: indegree + outdegree (2 calls)gpu 46.4 ns47.7 ns 69.8 ns44.9 ns 3578
degree: minDegree + maxDegree (2 calls)v3 15.9 ms17.0 ms 20.4 ms15.3 ms 37
degree: minDegree + maxDegree (2 calls)gpu 368 µs377 µs 530 µs356 µs 1861
degree: minIndegree + maxOutdegree (2 calls)v3 9.07 ms9.77 ms 13.9 ms8.81 ms 67
degree: minIndegree + maxOutdegree (2 calls)gpu 357 µs363 µs 471 µs347 µs 1933
dimensions: renderedPosition getv3 73.8 ns79.3 ns 181 ns71.2 ns 2139
dimensions: renderedPosition getgpu 29.2 ns33.4 ns 117 ns28.4 ns 5068
dimensions: relativePosition getv3 832 ns838 ns 997 ns799 ns 200
dimensions: relativePosition getgpu 79.4 ns84.2 ns 157 ns76.5 ns 2009
dimensions: width + height + outerWidth + outerHeight (4 calls)v3 615 ns619 ns 745 ns590 ns 274
dimensions: width + height + outerWidth + outerHeight (4 calls)gpu 219 ns224 ns 343 ns214 ns 759
dimensions: rendered dims (4 calls)v3 706 ns712 ns 856 ns683 ns 235
dimensions: rendered dims (4 calls)gpu 224 ns230 ns 301 ns218 ns 741
dimensions: renderedBoundingBoxv3 1.69 µs1.73 µs 2.23 µs1.64 µs 95
dimensions: renderedBoundingBoxgpu 926 ns943 ns 1.26 µs889 ns 177
dimensions: midpoint + renderedMidpoint (2 calls)gpu 1.17 µs1.18 µs 1.24 µs1.13 µs 138
dimensions: source/targetEndpoint (2 calls)gpu 380 ns385 ns 432 ns371 ns 440
dimensions: rendered source/targetEndpoint (2 calls)gpu 389 ns398 ns 545 ns378 ns 426
dimensions: shift + silentShift (round-trip)v3 289 µs301 µs 632 µs280 µs 2328
dimensions: shift + silentShift (round-trip)gpu 4.82 µs4.82 µs 4.90 µs4.71 µs 31
dimensions: silentPositionv3 870 ns875 ns 972 ns843 ns 191
dimensions: silentPositiongpu 56.6 ns58.9 ns 86.1 ns54.9 ns 2880
dimensions: positions( fn ) over 100v3 175 µs181 µs 262 µs169 µs 3861
dimensions: positions( fn ) over 100gpu 3.48 µs3.50 µs 3.59 µs3.44 µs 45
dimensions: padding + paddedWidth + paddedHeight (3 calls)v3 2.02 µs2.04 µs 2.13 µs1.98 µs 80
dimensions: padding + paddedWidth + paddedHeight (3 calls)gpu 150 ns153 ns 182 ns149 ns 1118
curves: isBundledBeziergpu 20.6 ns21.2 ns 31.1 ns20.0 ns 8042
curves: controlPoints + renderedControlPoints (2 calls)gpu 527 ns543 ns 750 ns525 ns 302
curves: segmentPoints (undefined for bezier)gpu 33.4 ns34.1 ns 43.8 ns32.0 ns 5014
compound: parent + parents + ancestors (3 calls)v3 2.99 µs3.27 µs 4.39 µs2.80 µs 48
compound: parent + parents + ancestors (3 calls)gpu 832 ns1.18 µs 2.62 µs791 ns 142
compound: children + descendants + siblings (3 calls)v3 8.53 µs8.58 µs 9.42 µs7.73 µs 16
compound: children + descendants + siblings (3 calls)gpu 1.82 µs2.35 µs 3.76 µs1.76 µs 67
compound: orphans + nonorphans (2 calls)v3 3.72 µs3.99 µs 4.77 µs3.58 µs 39
compound: orphans + nonorphans (2 calls)gpu 534 ns763 ns 3.06 µs519 ns 216
compound: commonAncestorsv3 9.60 µs9.89 µs 11.0 µs9.38 µs 14
compound: commonAncestorsgpu 75.3 ns77.3 ns 134 ns71.9 ns 2205
compound: isParent/isChild/isChildless/isOrphan (4 calls)v3 71.7 ns75.4 ns 169 ns59.7 ns 2269
compound: isParent/isChild/isChildless/isOrphan (4 calls)gpu 45.3 ns46.7 ns 66.2 ns43.3 ns 3659
flags: select + unselect + selected (band)v3 193 µs200 µs 414 µs187 µs 3501
flags: select + unselect + selected (band)gpu 12.4 µs12.6 µs 13.1 µs12.3 µs 10
flags: selectify + unselectify + selectablev3 194 µs201 µs 350 µs188 µs 3482
flags: selectify + unselectify + selectablegpu 2.03 µs2.04 µs 2.15 µs1.98 µs 81
flags: lock + unlock + lockedv3 191 µs197 µs 321 µs186 µs 3542
flags: lock + unlock + lockedgpu 2.04 µs2.07 µs 2.71 µs1.99 µs 78
flags: grabify + ungrabify + grabbablev3 195 µs199 µs 307 µs189 µs 3509
flags: grabify + ungrabify + grabbablegpu 2.04 µs2.04 µs 2.20 µs1.97 µs 81
flags: show + hide + visiblev3 2.61 ms2.74 ms 4.07 ms2.53 ms 252
flags: show + hide + visiblegpu 11.3 µs11.3 µs 11.4 µs11.2 µs 11
flags: active/activate/unactivate (3 calls)v3 194 µs200 µs 294 µs188 µs 3500
flags: active/activate/unactivate (3 calls)gpu 12.2 µs12.3 µs 12.3 µs12.2 µs 10
flags: panify + unpanify + pannablev3 195 µs199 µs 288 µs188 µs 3502
flags: panify + unpanify + pannablegpu 2.01 µs2.02 µs 2.14 µs1.96 µs 81
flags: takesUpSpace + interactive + transparent (3 calls)v3 196 ns200 ns 229 ns191 ns 857
flags: takesUpSpace + interactive + transparent (3 calls)gpu 63.9 ns67.3 ns 83.5 ns61.6 ns 2534
flags: effectiveOpacityv3 49.1 ns50.2 ns 60.9 ns47.0 ns 3418
flags: effectiveOpacitygpu 21.3 ns22.9 ns 38.3 ns20.5 ns 7480
element data: scratch get + setv3 1.31 µs1.32 µs 1.41 µs1.28 µs 126
element data: scratch get + setgpu 171 ns176 ns 264 ns166 ns 969
element data: json() one elementv3 297 ns382 ns 3.53 µs290 ns 437
element data: json() one elementgpu 151 ns193 ns 550 ns149 ns 830
element data: jsons() over 100v3 39.3 µs39.5 µs 40.4 µs38.0 µs 12
element data: jsons() over 100gpu 20.1 µs21.5 µs 24.2 µs15.4 µs 12
element data: label()gpu 15.2 ns15.9 ns 29.5 ns14.4 ns 10710
core: batch + per-id data() (was batchData, round 90)v3 2.37 µs2.48 µs 3.02 µs2.28 µs 64
core: batch + per-id data() (was batchData, round 90)gpu 266 ns351 ns 2.15 µs259 ns 471
core: animated()v3 7.52 ns7.77 ns 13.9 ns7.21 ns 21833
core: animated()gpu 1.53 ns1.57 ns 2.02 ns1.50 ns 105160
core: zoomRange getgpu 2.16 ns2.30 ns 6.01 ns2.01 ns 72452
core: resize() / invalidateSize()v3 315 ns320 ns 380 ns302 ns 531
core: resize() / invalidateSize()gpu 129 ns131 ns 182 ns124 ns 1291
core: on('render') + off('render') (was onRender/offRender, round 90)v3 486 ns541 ns 1.04 µs469 ns 311
core: on('render') + off('render') (was onRender/offRender, round 90)gpu 196 ns203 ns 270 ns192 ns 821
core: removeScratch()v3 2.65 ms2.70 ms 3.19 ms2.58 ms 254
core: removeScratch()gpu 279 ns283 ns 365 ns270 ns 600
core: selectionType getv3 4.55 ns4.93 ns 11.3 ns4.35 ns 34200
core: selectionType getgpu 2.26 ns2.38 ns 6.17 ns2.11 ns 70083
core: isReady()v3 3.25 ns3.37 ns 6.58 ns3.18 ns 49765
core: isReady()gpu 1.48 ns1.53 ns 1.91 ns1.45 ns 107963
core: window()v3 4.10 ns4.24 ns 7.39 ns4.01 ns 39816
core: window()gpu 1.48 ns1.54 ns 2.20 ns1.45 ns 106830
core: container()v3 3.90 ns4.05 ns 7.80 ns3.75 ns 41602
core: container()gpu 1.48 ns1.53 ns 2.08 ns1.45 ns 107330
core: destroyed()v3 3.26 ns3.38 ns 6.56 ns3.25 ns 49772
core: destroyed()gpu 1.48 ns1.55 ns 2.45 ns1.45 ns 106224
core: removeAllListeners()v3 13.5 ns14.2 ns 27.5 ns13.0 ns 11951
core: removeAllListeners()gpu 1.58 ns1.63 ns 2.32 ns1.55 ns 100650
collection: cy()v3 7.58 ns8.13 ns 16.6 ns7.17 ns 20906
collection: cy()gpu 2.16 ns2.41 ns 6.24 ns2.06 ns 69387
collection: indexOfId()v3 66.6 ns69.0 ns 132 ns62.1 ns 2482
collection: indexOfId()gpu 37.8 ns38.4 ns 54.1 ns36.0 ns 4456
collection: removed() + inside() (2 calls)v3 17.7 ns18.1 ns 26.9 ns17.3 ns 9448
collection: removed() + inside() (2 calls)gpu 15.1 ns15.5 ns 25.0 ns14.6 ns 11075
collection: silentPositions( fn ) over 100v3 107 µs113 µs 186 µs104 µs 6193
collection: silentPositions( fn ) over 100gpu 3.50 µs3.51 µs 3.59 µs3.46 µs 45
collection: animated()v3 12.1 ns12.4 ns 21.5 ns11.9 ns 13778
collection: animated()gpu 4.19 ns4.30 ns 7.85 ns4.00 ns 39293
collection: delayAnimation()v3 467 ns594 ns 1.97 µs456 ns 283
collection: delayAnimation()gpu 162 ns171 ns 320 ns156 ns 991
collection: removeScratch()v3 1.79 µs1.81 µs 2.22 µs1.72 µs 90
collection: removeScratch()gpu 202 ns205 ns 242 ns196 ns 833
collection: component()v3 82.2 ms83.1 ms 93.1 ms75.1 ms 12
collection: component()gpu 1.84 ms2.06 ms 5.47 ms1.78 ms 334
collection: layoutDimensions()v3 611 ns618 ns 805 ns587 ns 274
collection: layoutDimensions()gpu 169 ns175 ns 294 ns163 ns 973
degree: maxIndegree + minOutdegree (2 calls)v3 9.05 ms9.79 ms 13.7 ms8.82 ms 68
degree: maxIndegree + minOutdegree (2 calls)gpu 359 µs371 µs 652 µs348 µs 1889
flags: grabbed + hidden + inactive (3 calls)v3 86.3 ns90.2 ns 142 ns80.4 ns 1902
flags: grabbed + hidden + inactive (3 calls)gpu 38.4 ns39.5 ns 56.8 ns36.2 ns 4341
curves: renderedSegmentPointsgpu 35.9 ns37.0 ns 51.9 ns34.5 ns 4627
layout contract: edgeSlots + endpoints + degreeOfgpu 34.7 µs36.3 µs 55.9 µs29.7 µs 18962
formats: isColumnarElements + isSerializedElements + isPackedIdsgpu 4.61 ns4.71 ns 9.66 ns4.51 ns 34936

compaction N=20,000 · 53.9 s

cpu pick: background miss (full highWater walk) — peak
207 µs
cpu pick: background miss (full highWater walk) — compacted
48.7 µs
cpu pick: node hit — peak
223 µs
cpu pick: node hit — compacted
49.8 µs
isCurrent: current ref (forwards present vs absent) — no forwards (peak)
5.87 ns
isCurrent: current ref (forwards present vs absent) — forwards present (compacted)
5.85 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — current (baseline alloc)
8.89 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — stale → repair
48.3 ns
control: nodes({ selected }) scan (order-list, expected parity) — peak
22.4 µs
control: nodes({ selected }) scan (order-list, expected parity) — compacted
22.4 µs
control: whole-graph boundingBox (expected parity) — peak
100 µs
control: whole-graph boundingBox (expected parity) — compacted
101 µs
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
cpu pick: background miss (full highWater walk)peak 207 µs212 µs 318 µs203 µs 3301
cpu pick: background miss (full highWater walk)compacted 48.7 µs49.3 µs 50.1 µs48.2 µs 12
cpu pick: node hitpeak 223 µs225 µs 275 µs217 µs 3124
cpu pick: node hitcompacted 49.8 µs50.3 µs 51.6 µs48.8 µs 12
isCurrent: current ref (forwards present vs absent)no forwards (peak) 5.87 ns6.05 ns 9.51 ns5.62 ns 28047
isCurrent: current ref (forwards present vs absent)forwards present (compacted) 5.85 ns6.04 ns 10.5 ns5.63 ns 28129
isCurrent: stale-ref repair (chase + rewrite, alloc included)current (baseline alloc) 8.89 ns9.48 ns 21.4 ns8.25 ns 17793
isCurrent: stale-ref repair (chase + rewrite, alloc included)stale → repair 48.3 ns49.9 ns 69.9 ns46.8 ns 3421
control: nodes({ selected }) scan (order-list, expected parity)peak 22.4 µs27.1 µs 34.3 µs21.5 µs 12
control: nodes({ selected }) scan (order-list, expected parity)compacted 22.4 µs23.4 µs 24.8 µs21.8 µs 12
control: whole-graph boundingBox (expected parity)peak 100 µs104 µs 165 µs96.4 µs 6684
control: whole-graph boundingBox (expected parity)compacted 101 µs103 µs 146 µs97.5 µs 6756

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

parent drag (shift subtree + bb settle)
182×
child drag (move + parent re-derive)
51×
reparent round-trip
79×
1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
parent drag (shift subtree + bb settle)v3 251 µs277 µs 593 µs238 µs 2509
parent drag (shift subtree + bb settle)gpu 1.38 µs1.40 µs 1.61 µs1.34 µs 114
child drag (move + parent re-derive)v3 79.0 µs86.0 µs 153 µs74.8 µs 7982
child drag (move + parent re-derive)gpu 1.56 µs1.60 µs 1.90 µs1.53 µs 101
reparent round-tripv3 83.8 µs90.6 µs 153 µs80.6 µs 7602
reparent round-tripgpu 1.06 µs1.07 µs 1.21 µs1.03 µs 153

curves N=2,000 · 1.6 s

curve premium: build (style apply + derivation) — curved
11.5 ms
curve premium: build (style apply + derivation) — straight
6.42 ms
curve premium: node.position x 1000 (drag) — curved
374 µs
curve premium: node.position x 1000 (drag) — straight
302 µs
curve premium: nodes().positions() (bulk move) — curved
319 µs
curve premium: nodes().positions() (bulk move) — straight
305 µs
curve premium: first read after a bulk move (cold) — curved
5.24 ms
curve premium: first read after a bulk move (cold) — straight
2.60 ms
curve premium: same read again (warm) — curved
1.42 ms
curve premium: same read again (warm) — straight
1.42 ms
curve premium: edge.midpoint x 4000 — curved
2.35 ms
curve premium: edge.midpoint x 4000 — straight
4.19 ms
curve premium: edge.controlPoints x 4000 — curved
2.34 ms
curve premium: edge.controlPoints x 4000 — straight
2.70 ms
curve premium: cy.elements().boundingBox() x 20 — curved
18.1 ms
curve premium: cy.elements().boundingBox() x 20 — straight
19.6 ms
curve premium: cy.fit() x 20 (store scan) — curved
3.71 ms
curve premium: cy.fit() x 20 (store scan) — straight
3.40 ms
curve premium: elementsInBox x 20 (half the graph) — curved
23.4 ms
curve premium: elementsInBox x 20 (half the graph) — straight
5.71 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — curved
4.50 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — straight
2.21 ms
100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
curve premium: build (style apply + derivation)curved 11.5 ms11.5 ms 11.5 ms11.5 ms 1
curve premium: build (style apply + derivation)straight 6.42 ms6.42 ms 6.42 ms6.42 ms 1
curve premium: node.position x 1000 (drag)curved 374 µs374 µs 374 µs374 µs 1
curve premium: node.position x 1000 (drag)straight 302 µs302 µs 302 µs302 µs 1
curve premium: nodes().positions() (bulk move)curved 319 µs319 µs 319 µs319 µs 1
curve premium: nodes().positions() (bulk move)straight 305 µs305 µs 305 µs305 µs 1
curve premium: first read after a bulk move (cold)curved 5.24 ms5.24 ms 5.24 ms5.24 ms 1
curve premium: first read after a bulk move (cold)straight 2.60 ms2.60 ms 2.60 ms2.60 ms 1
curve premium: same read again (warm)curved 1.42 ms1.42 ms 1.42 ms1.42 ms 1
curve premium: same read again (warm)straight 1.42 ms1.42 ms 1.42 ms1.42 ms 1
curve premium: edge.midpoint x 4000curved 2.35 ms2.35 ms 2.35 ms2.35 ms 1
curve premium: edge.midpoint x 4000straight 4.19 ms4.19 ms 4.19 ms4.19 ms 1
curve premium: edge.controlPoints x 4000curved 2.34 ms2.34 ms 2.34 ms2.34 ms 1
curve premium: edge.controlPoints x 4000straight 2.70 ms2.70 ms 2.70 ms2.70 ms 1
curve premium: cy.elements().boundingBox() x 20curved 18.1 ms18.1 ms 18.1 ms18.1 ms 1
curve premium: cy.elements().boundingBox() x 20straight 19.6 ms19.6 ms 19.6 ms19.6 ms 1
curve premium: cy.fit() x 20 (store scan)curved 3.71 ms3.71 ms 3.71 ms3.71 ms 1
curve premium: cy.fit() x 20 (store scan)straight 3.40 ms3.40 ms 3.40 ms3.40 ms 1
curve premium: elementsInBox x 20 (half the graph)curved 23.4 ms23.4 ms 23.4 ms23.4 ms 1
curve premium: elementsInBox x 20 (half the graph)straight 5.71 ms5.71 ms 5.71 ms5.71 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)curved 4.50 ms4.50 ms 4.50 ms4.50 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)straight 2.21 ms2.21 ms 2.21 ms2.21 ms 1

arrows N=2,000 · 8.6 s

arrow premium: build (style apply + arrow fold) — arrowed
6.94 ms
arrow premium: build (style apply + arrow fold) — none
6.33 ms
arrow premium: cy.style() re-apply x 4 — arrowed
7.68 ms
arrow premium: cy.style() re-apply x 4 — none
7.93 ms
arrow premium: node.position x 200000 (drag) — arrowed
21.6 ms
arrow premium: node.position x 200000 (drag) — none
21.6 ms
arrow premium: edge.sourceEndpoint x 200000 — arrowed
59.6 ms
arrow premium: edge.sourceEndpoint x 200000 — none
60.2 ms
arrow premium: edge.targetEndpoint x 200000 — arrowed
59.0 ms
arrow premium: edge.targetEndpoint x 200000 — none
58.7 ms
arrow premium: edge.midpoint x 200000 — arrowed
139 ms
arrow premium: edge.midpoint x 200000 — none
137 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — arrowed
31.5 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — none
27.5 ms
arrow premium: cy.elements().boundingBox() x 20 — arrowed
18.3 ms
arrow premium: cy.elements().boundingBox() x 20 — none
18.2 ms
arrow premium: elementsInBox x 20 (half the graph) — arrowed
5.47 ms
arrow premium: elementsInBox x 20 (half the graph) — none
5.53 ms
arrow premium: control: sourceEndpoint, bezier vs straight — arrowed
75.4 ms
arrow premium: control: sourceEndpoint, bezier vs straight — none
60.4 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 6.94 ms6.94 ms 6.94 ms6.94 ms 1
arrow premium: build (style apply + arrow fold)none 6.33 ms6.33 ms 6.33 ms6.33 ms 1
arrow premium: cy.style() re-apply x 4arrowed 7.68 ms7.68 ms 7.68 ms7.68 ms 1
arrow premium: cy.style() re-apply x 4none 7.93 ms7.93 ms 7.93 ms7.93 ms 1
arrow premium: node.position x 200000 (drag)arrowed 21.6 ms21.6 ms 21.6 ms21.6 ms 1
arrow premium: node.position x 200000 (drag)none 21.6 ms21.6 ms 21.6 ms21.6 ms 1
arrow premium: edge.sourceEndpoint x 200000arrowed 59.6 ms59.6 ms 59.6 ms59.6 ms 1
arrow premium: edge.sourceEndpoint x 200000none 60.2 ms60.2 ms 60.2 ms60.2 ms 1
arrow premium: edge.targetEndpoint x 200000arrowed 59.0 ms59.0 ms 59.0 ms59.0 ms 1
arrow premium: edge.targetEndpoint x 200000none 58.7 ms58.7 ms 58.7 ms58.7 ms 1
arrow premium: edge.midpoint x 200000arrowed 139 ms139 ms 139 ms139 ms 1
arrow premium: edge.midpoint x 200000none 137 ms137 ms 137 ms137 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000arrowed 31.5 ms31.5 ms 31.5 ms31.5 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000none 27.5 ms27.5 ms 27.5 ms27.5 ms 1
arrow premium: cy.elements().boundingBox() x 20arrowed 18.3 ms18.3 ms 18.3 ms18.3 ms 1
arrow premium: cy.elements().boundingBox() x 20none 18.2 ms18.2 ms 18.2 ms18.2 ms 1
arrow premium: elementsInBox x 20 (half the graph)arrowed 5.47 ms5.47 ms 5.47 ms5.47 ms 1
arrow premium: elementsInBox x 20 (half the graph)none 5.53 ms5.53 ms 5.53 ms5.53 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightarrowed 75.4 ms75.4 ms 75.4 ms75.4 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightnone 60.4 ms60.4 ms 60.4 ms60.4 ms 1
arrow premium: edge column bytesB/edge 156 ms156 ms 156 ms156 ms 1

labels N=20,000 · 1.8 s

labels: breakLines x 20000 — gpu
84.0 ms
labels: estimateBlock x 20000 — gpu
91.3 ms
labels: addNode x 20000 — gpu
30.4 ms
labels: setLabel (build) x 20000 — gpu
97.7 ms
labels: setLabel (rewrite) x 20000 — gpu
101 ms
labels: boundingBox with 20000 label terms — gpu
3.04 ms
labels: computeSdf tier 1 (30x42) x 96 glyphs — gpu
14.7 ms
labels: computeSdf tier 2 (59x85) x 96 glyphs — gpu
37.8 ms
1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
labels: breakLines x 20000gpu 84.0 ms84.0 ms 84.0 ms84.0 ms 1
labels: estimateBlock x 20000gpu 91.3 ms91.3 ms 91.3 ms91.3 ms 1
labels: addNode x 20000gpu 30.4 ms30.4 ms 30.4 ms30.4 ms 1
labels: setLabel (build) x 20000gpu 97.7 ms97.7 ms 97.7 ms97.7 ms 1
labels: setLabel (rewrite) x 20000gpu 101 ms101 ms 101 ms101 ms 1
labels: boundingBox with 20000 label termsgpu 3.04 ms3.04 ms 3.04 ms3.04 ms 1
labels: computeSdf tier 1 (30x42) x 96 glyphsgpu 14.7 ms14.7 ms 14.7 ms14.7 ms 1
labels: computeSdf tier 2 (59x85) x 96 glyphsgpu 37.8 ms37.8 ms 37.8 ms37.8 ms 1

transitions N=2,000 · 28.8 s

transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions off
1.20 ms
transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions on
3.78 ms
transition: bulk tween tick (2000 slots, one manager tick) — tick
129 µs
transition: explicit-domain write (O(changed) — one element) — transitions off
14.7 µs
transition: explicit-domain write (O(changed) — one element) — transitions on
18.3 µs
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions off
2.09 ms
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions on
4.88 ms
10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions off 1.20 ms1.25 ms 2.11 ms1.16 ms 550
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions on 3.78 ms3.97 ms 6.10 ms3.49 ms 171
transition: bulk tween tick (2000 slots, one manager tick)tick 129 µs136 µs 245 µs124 µs 5146
transition: explicit-domain write (O(changed) — one element)transitions off 14.7 µs15.1 µs 15.9 µs14.2 µs 12
transition: explicit-domain write (O(changed) — one element)transitions on 18.3 µs18.6 µs 19.1 µs17.8 µs 12
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions off 2.09 ms2.14 ms 2.87 ms2.03 ms 319
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions on 4.88 ms4.46 ms 6.08 ms3.61 ms 152

geometry-tween N=2,000 · 32.6 s

size tick: unlabelled (2000 slots) — tick
527 µs
size tick: labelled, center/center (re-anchor early-out) (2000 slots) — tick
562 µs
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots) — tick
1.22 ms
edge width tick (4000 slots) — bare
285 µs
edge width tick (4000 slots) — with rides (casing + match-line arrows)
722 µs
padding tick + auto-bounds flush (250 parents × 8 children) — tick + flush
173 µs
font-size tick (2000 labels) — wrap none (dims scale-patch)
350 µs
font-size tick (2000 labels) — wrapped (re-break per tick)
5.82 ms
baseline: paint (opacity) tick (2000 slots) — tick
151 µs
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
size tick: unlabelled (2000 slots)tick 527 µs553 µs 868 µs509 µs 1244
size tick: labelled, center/center (re-anchor early-out) (2000 slots)tick 562 µs583 µs 898 µs537 µs 1182
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots)tick 1.22 ms1.29 ms 2.08 ms1.20 ms 520
edge width tick (4000 slots)bare 285 µs295 µs 537 µs275 µs 2362
edge width tick (4000 slots)with rides (casing + match-line arrows) 722 µs744 µs 1.05 ms685 µs 938
padding tick + auto-bounds flush (250 parents × 8 children)tick + flush 173 µs180 µs 359 µs168 µs 3888
font-size tick (2000 labels)wrap none (dims scale-patch) 350 µs380 µs 879 µs323 µs 1820
font-size tick (2000 labels)wrapped (re-break per tick) 5.82 ms5.91 ms 6.60 ms5.55 ms 113
baseline: paint (opacity) tick (2000 slots)tick 151 µs162 µs 284 µs144 µs 4305