Cytoscape.js GPU benchmarks

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

Machine and provenance
CPUIntel(R) Core(TM) i9-9900K CPU @ 3.60GHz
Cores8 physical / 16 logical · 3.6 GHz base · 5 GHz max
Memory62.6 GiB
GPUCoffeeLake-S GT2 [UHD Graphics 630] i915
Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (8.0 GiB) amdgpu
OSFedora Linux 43 (Workstation Edition) · 6.19.14-200.fc43.x86_64 · x64
Nodev24.18.0 (v8 13.6.233.17-node.50)
Commitcf5727b4
perf(collection): _liveNodeRef reads the raw ref (round 62.6c)
Machine id5cf3f79c

Failed jobs

Median speedup (geo-mean) 11× 262 v3-vs-gpu comparisons
Biggest win 290398× sweep: edges() @ N=2k
v3 still ahead 0 comparisons
Total run time 17.9 min all profile

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

sweep: edges() @ 2k
290398×
sweep: nodes() @ 2k
171180×
core: edges() @ 2k
92914×
core: nodes() @ 2k
51238×
sweep: elements() @ 2k
29346×
core: elements() @ 2k
21280×
core: graph scratch() set + get (v3 restyles the graph) @ 2k
16571×
core: removeScratch() @ 2k
9678×
core: graph data() set + get (v3 restyles the graph) @ 2k
8610×
compare: same() @ 2k
7831×
trav: successors() @ 2k
781×
trav: predecessors() @ 2k
736×
mut-bulk: hide + show @ 2k
283×
flags: show + hide + visible @ 2k
224×
parent drag (shift subtree + bb settle) @ 2k
186×
degree: nodes.totalDegree() @ 2k
179×
degree: nodes.maxDegree() @ 2k
145×
compound: commonAncestors @ 2k
131×
degree: node.degree() @ 2k
127×
viewport: reset() @ 2k
121×
mut-bulk: positions(obj) @ 2k
112×
mut-bulk: shift @ 2k
100×
mut-bulk: positions(fn) @ 2k
97×
flags: selectify + unselectify + selectable @ 2k
95×
flags: panify + unpanify + pannable @ 2k
95×
flags: grabify + ungrabify + grabbable @ 2k
94×
flags: lock + unlock + locked @ 2k
92×
layout: grid @ 2k
91×
core: options() @ 2k
86×
algo: closenessCentrality (one root) @ 500
77×
collection: same + anySame + contains (3 calls) @ 2k
72×
algo: closenessCentrality (one root) @ 2k
72×
degree: indegree + outdegree (2 calls) @ 2k
72×
reparent round-trip @ 2k
70×
viewport: viewport({ zoom, pan }) @ 2k
64×
algo: bfs (whole graph) @ 500
64×
algo: dfs (whole graph) @ 500
62×
dimensions: shift + silentShift (round-trip) @ 2k
60×
sweep: nodes(":selected") vs nodes({selected}) @ 2k
59×
algo: closenessCentrality (weighted, one root) @ 500
59×
algo: dfs (whole graph) @ 2k
59×
algo: dijkstra + pathTo @ 500
58×
layout: preset (fn form) @ 2k
57×
algo: dijkstra + pathTo @ 2k
56×
dimensions: positions( fn ) over 100 @ 2k
55×
algo: bfs (whole graph) @ 2k
55×
mut-bulk: lock + unlock @ 2k
52×
child drag (move + parent re-derive) @ 2k
51×
collection: component() @ 2k
42×
algo: degreeCentralityNormalized @ 500
40×
traverse: components() @ 2k
40×
algo: degreeCentralityNormalized @ 2k
39×
algo: tarjan SCC @ 500
38×
algo: tarjan SCC @ 2k
36×
sweep: selected nodes ($("node:selected") vs filter({group, selected})) @ 2k
36×
collection: silentPositions( fn ) over 100 @ 2k
35×
layout: breadthfirst @ 2k
35×
degree: minDegree + maxDegree (2 calls) @ 2k
35×
algo: degreeCentrality (one root) @ 500
34×
bounds: getFitViewport() (compute without committing) @ 2k
33×
query: structural, parents (:parent vs { parent: true }) @ 2k
33×
bounds: cy.fit() (whole-graph scan) @ 2k
33×
query: structural, orphans (:orphan vs { child: false }) @ 2k
33×
algo: degreeCentrality (one root) @ 2k
30×
emit: position write, no listeners @ 2k
29×
collection: difference @ 2k
28×
scn: select-all + fit (listeners on) @ 2k
28×
algo: hopcroft-tarjan biconnected @ 500
28×
core: id lookup ($("#id") vs $id()) @ 2k
28×
mut: position set @ 2k
27×
collection: intersection @ 2k
27×
algo: kruskal @ 2k
27×
layout: concentric @ 2k
26×
algo: kruskal @ 500
26×
algo: hopcroft-tarjan biconnected @ 2k
25×
set: intersection() @ 2k
24×
set: difference() @ 2k
24×
trav: band roots() @ 2k
23×
degree: maxIndegree + minOutdegree (2 calls) @ 2k
22×
degree: minIndegree + maxOutdegree (2 calls) @ 2k
21×
data: bulk write, numeric column @ 2k
21×
algo: bellmanFord @ 500
21×
data: bulk write, object column (plain-array fallback) @ 2k
20×
viewport: center( eles ) @ 2k
19×
layout: preset @ 2k
19×
algo: bellmanFord @ 2k
19×
core: add + remove @ 2k
17×
dimensions: silentPosition @ 2k
17×
data: bulk write, one new dictionary entry per pass @ 2k
17×
data: bulk write, dictionary string column (4 values) @ 2k
17×
scn: drag (select band of 100 + 8-step shift, position listener) @ 2k
16×
core: forceRender() (headless no-op) @ 2k
16×
query: membership ([bucket in ...] vs { in }) @ 2k
15×
dimensions: padding + paddedWidth + paddedHeight (3 calls) @ 2k
15×
flags: select + unselect + selected (band) @ 2k
15×
flags: active/activate/unactivate (3 calls) @ 2k
15×
traversal: roots + leaves (2 calls) @ 2k
15×
viewport: minZoom/maxZoom get (2 calls) @ 2k
15×
mut-bulk: data set @ 2k
15×
style: renderedStyle (one prop) @ 2k
14×
core: selected ($(":selected") vs filter({selected})) @ 2k
14×
sweep: selected ($(":selected") vs filter({selected})) @ 2k
14×
query: structural, childless (:childless vs { parent: false }) @ 2k
13×
collection: absoluteComplement @ 2k
13×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } }) @ 2k
13×
query: data comparison ([weight > 3] vs { gt }) @ 2k
12×
layout: circle @ 2k
12×
collection: toArray() @ 2k
12×
query: two keys AND-ed @ 2k
12×
algo: betweennessCentrality (unweighted) @ 2k
12×
dimensions: relativePosition get @ 2k
12×
algo: betweennessCentrality (unweighted) @ 500
11×
layout: random @ 2k
11×
layout: scope (eles.layout, 10% of nodes) @ 2k
9.5×
collection: removeScratch() @ 2k
9.0×
emit: delegated (v3 selector vs v4 predicate) @ 2k
8.9×
sweep: all nodes ($("node") vs filter({group})) @ 2k
8.9×
algo: betweennessCentrality (weighted) @ 500
8.9×
core: removeAllListeners() @ 2k
8.8×
mut-bulk: select + unselect @ 2k
8.7×
algo: kMedoids @ 500
8.6×
core: batchData() @ 2k
8.6×
emit: 1 core listener @ 2k
8.5×
emit: 1 element (ref-qualified) listener @ 2k
8.3×
algo: fuzzyCMeans @ 500
8.1×
scn: explore (expand 2-hop + select + fit) @ 2k
7.9×
data: removeData (whole collection) @ 2k
7.7×
element data: scratch get + set @ 2k
7.3×
core: collection() @ 2k
7.2×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners) @ 2k
7.2×
core: collection() @ 2k
7.0×
emit: 10 core listeners @ 2k
6.9×
core: batch( fn ) (empty) @ 2k
6.8×
query: predicate function (both sides) @ 2k
6.7×
compound: orphans + nonorphans (2 calls) @ 2k
6.6×
collection: union @ 2k
6.3×
style: whole-object style() @ 2k
6.2×
bounds: whole-graph boundingBox() @ 2k
6.1×
mut-bulk: remove + re-add (256 nodes + cascade) @ 2k
6.0×
load: init from the definition form (construct + dispose) @ 2k
5.9×
set: union() @ 2k
5.9×
core: startBatch + endBatch + batching @ 2k
5.8×
core: nodes ($("node") vs filter({group})) @ 2k
5.6×
algo: hierholzer (directed) @ 500
5.6×
trav: outgoers() @ 2k
5.1×
trav: incomers() @ 2k
5.1×
traversal: allAreNeighbors @ 2k
5.1×
trav: band neighborhood() @ 2k
5.0×
core: animated() @ 2k
4.9×
traverse: incomers() @ 2k
4.9×
traverse: outgoers() @ 2k
4.8×
compare: contains() @ 2k
4.8×
viewport: zoom() get @ 2k
4.7×
compound: children + descendants + siblings (3 calls) @ 2k
4.6×
collection: length + empty + nonempty (3 calls) @ 2k
4.5×
mut: data set @ 2k
4.1×
mut: select + unselect @ 2k
4.0×
trav: neighborhood() @ 2k
3.9×
algo: kMeans (fixed centroids) @ 500
3.8×
collection: symmetricDifference @ 2k
3.7×
compound: parent + parents + ancestors (3 calls) @ 2k
3.6×
collection: layoutDimensions() @ 2k
3.6×
algo: aStar @ 500
3.6×
collection: cy() @ 2k
3.5×
traverse: neighborhood() @ 2k
3.5×
traversal: sources + targets (2 calls) @ 2k
3.4×
traversal: parallelEdges + codirectedEdges (2 calls) @ 2k
3.3×
algo: aStar @ 2k
3.3×
traversal: connectedNodes @ 2k
3.3×
anim: start + stop, 512-node collection @ 2k
3.0×
dimensions: rendered dims (4 calls) @ 2k
2.9×
traversal: openNeighborhood + closedNeighborhood (2 calls) @ 2k
2.9×
collection: diff @ 2k
2.9×
collection: animated() @ 2k
2.9×
flags: takesUpSpace + interactive + transparent (3 calls) @ 2k
2.9×
viewport: width() + height() + size() (3 calls) @ 2k
2.9×
trav: band connectedNodes() @ 2k
2.8×
algo: hierholzer (directed) @ 2k
2.8×
core: window() @ 2k
2.8×
anim: viewport animate + stop @ 2k
2.8×
style: numericStyle @ 2k
2.8×
trav: closedNeighborhood() @ 2k
2.7×
core: resize() / invalidateSize() @ 2k
2.7×
collection: delayAnimation() @ 2k
2.7×
load: cy.json() @ 2k
2.7×
core: container() @ 2k
2.7×
collection: byGroup @ 2k
2.6×
dimensions: renderedPosition get @ 2k
2.5×
trav: connectedEdges() @ 2k
2.5×
dimensions: width + height + outerWidth + outerHeight (4 calls) @ 2k
2.5×
iter: map() @ 2k
2.4×
core: onRender + offRender @ 2k
2.4×
traverse: connectedEdges() @ 2k
2.4×
traversal: isLoop + isSimple (2 calls) @ 2k
2.3×
algo: hierarchicalClustering (threshold) @ 500
2.3×
data: read the whole object @ 2k
2.3×
core: isReady() @ 2k
2.2×
core: destroyed() @ 2k
2.2×
emit: on() + off() round-trip @ 2k
2.2×
collection: is (none match: the full walk) @ 2k
2.2×
flags: effectiveOpacity @ 2k
2.1×
collection: slice() @ 2k
2.1×
style: read one prop (width) @ 2k
2.1×
collection: min + max ( fn ) (2 calls) @ 2k
2.0×
flags: grabbed + hidden + inactive (3 calls) @ 2k
2.0×
core: selectionType get @ 2k
1.99×
element data: json() one element @ 2k
1.98×
json: element @ 2k
1.98×
viewport: pan( p ) set @ 2k
1.95×
core: zoom set @ 2k
1.93×
dimensions: renderedBoundingBox @ 2k
1.91×
style: read one prop (color) @ 2k
1.90×
algo: pageRank (20 iters) @ 500
1.89×
collection: indexOfId() @ 2k
1.87×
element data: jsons() over 100 @ 2k
1.87×
core: gating setters round-trip (autolock/autoungrabify/autounselectify) @ 2k
1.85×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener) @ 2k
1.84×
collection: eq/first/last (3 calls) @ 2k
1.83×
viewport: zoom( n ) set @ 2k
1.80×
collection: element accessors (id/group/isNode/isEdge, 4 calls) @ 2k
1.79×
algo: floydWarshall @ 500
1.78×
algo: affinityPropagation @ 500
1.77×
bounds: one node boundingBox() @ 2k
1.75×
viewport: panBy() @ 2k
1.73×
sweep: filter(fn) @ 2k
1.70×
algo: closenessCentralityNormalized @ 500
1.68×
iter: filter(fn) @ 2k
1.67×
viewport: renderedExtent() @ 2k
1.65×
viewport: extent() @ 2k
1.58×
anim: delay() (no channels touched) @ 2k
1.58×
compound: isParent/isChild/isChildless/isOrphan (4 calls) @ 2k
1.57×
collection: sort( fn ) @ 2k
1.57×
style: first apply on add (256-node band) @ 2k
1.57×
collection: some + every (2 calls) @ 2k
1.57×
collection: allAre (all match: the full walk) @ 2k
1.52×
position: get @ 2k
1.49×
trav: band sources() @ 2k
1.48×
trav: band connectedEdges() @ 2k
1.45×
collection: indexOf @ 2k
1.41×
collection: reduce( fn ) @ 2k
1.38×
anim: start + stop, one element @ 2k
1.37×
load: add a 256-node band (add + remove) @ 2k
1.36×
data: read one numeric key @ 2k
1.36×
core: mutableElements() (v4 materializes; v3 is O(1)) @ 2k
1.36×
core: pan() get (x32) @ 2k
1.35×
data: read one string key (dictionary decode) @ 2k
1.33×
core: hasElementWithId + hasCompoundNodes (2 calls) @ 2k
1.27×
traversal: source() + target() (2 calls) @ 2k
1.27×
algo: markovClustering @ 500
1.25×
core: instanceString + headless + styleEnabled (3 calls) @ 2k
1.25×
traversal: edgesWith @ 2k
1.21×
core: filter(fn) @ 2k
1.21×
style: sheet swap (compile + applyAll) @ 2k
1.20×
traversal: edgesTo @ 2k
1.17×
core: gating getters (5 calls) @ 2k
1.16×
core: getElementById() @ 2k
1.12×
collection: removed() + inside() (2 calls) @ 2k
1.11×
core: extent() @ 2k
1.09×
data: get @ 2k
1.09×
viewport: pan() get @ 2k
1.08×
iter: forEach() @ 2k
1.05×
algo: kargerStein @ 500
1.03×
10×100×1000×10000×100000×1000000×

Scaling speedup vs graph size

algorithms

group× @ N=500× @ N=2k
algo: bfs (whole graph)64×55×
algo: dfs (whole graph)62×59×
algo: dijkstra + pathTo58×56×
algo: aStar3.6×3.3×
algo: bellmanFord21×19×
algo: kruskal26×27×
algo: tarjan SCC38×36×
algo: hopcroft-tarjan biconnected28×25×
algo: hierholzer (directed)5.6×2.8×
algo: betweennessCentrality (unweighted)11×12×
algo: degreeCentralityNormalized40×39×
algo: closenessCentrality (one root)77×72×
algo: degreeCentrality (one root)34×30×
algo: pageRank (20 iters)1.89×
algo: closenessCentrality (weighted, one root)59×
algo: floydWarshall1.78×
algo: closenessCentralityNormalized1.68×
algo: markovClustering1.25×
algo: hierarchicalClustering (threshold)2.3×
algo: kMeans (fixed centroids)3.8×
algo: kMedoids8.6×
algo: fuzzyCMeans8.1×
algo: affinityPropagation1.77×
algo: kargerStein1.03×
algo: betweennessCentrality (weighted)8.9×

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

core: getElementById()
1.12×
core: id lookup ($("#id") vs $id())
28×
core: nodes()
51238×
core: edges()
92914×
core: elements()
21280×
core: nodes ($("node") vs filter({group}))
5.6×
core: selected ($(":selected") vs filter({selected}))
14×
core: filter(fn)
1.21×
core: collection()
7.0×
core: pan() get (x32)
1.35×
core: extent()
1.09×
core: add + remove
17×
core: zoom set
1.93×
traverse: neighborhood()
3.5×
traverse: connectedEdges()
2.4×
traverse: outgoers()
4.8×
traverse: incomers()
4.9×
traverse: components()
40×
degree: node.degree()
127×
degree: nodes.totalDegree()
179×
degree: nodes.maxDegree()
145×
data: get
1.09×
position: get
1.49×
json: element
1.98×
set: union()
5.9×
set: intersection()
24×
set: difference()
24×
iter: map()
2.4×
iter: forEach()
1.05×
iter: filter(fn)
1.67×
compare: same()
7831×
compare: contains()
4.8×
mut: data set
4.1×
mut: position set
27×
mut: select + unselect
4.0×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
core: getElementById()v3 96.2 ns99.9 ns 158 ns92.8 ns 1714
core: getElementById()gpu 86.2 ns91.7 ns 164 ns84.4 ns 1867
core: id lookup ($("#id") vs $id())v3 2.19 µs2.45 µs 3.83 µs1.94 µs 63
core: id lookup ($("#id") vs $id())gpu 79.4 ns85.8 ns 154 ns77.6 ns 1991
core: nodes()v3 421 µs449 µs 820 µs409 µs 1558
core: nodes()gpu 8.21 ns9.18 ns 31.2 ns7.88 ns 18483
core: edges()v3 733 µs776 µs 1.45 ms716 µs 899
core: edges()gpu 7.89 ns8.65 ns 16.5 ns7.72 ns 19589
core: elements()v3 147 µs157 µs 275 µs144 µs 4442
core: elements()gpu 6.93 ns7.40 ns 17.5 ns6.77 ns 22941
core: nodes ($("node") vs filter({group}))v3 553 µs589 µs 1.21 ms536 µs 1184
core: nodes ($("node") vs filter({group}))gpu 98.3 µs107 µs 259 µs65.9 µs 6368
core: selected ($(":selected") vs filter({selected}))v3 347 µs368 µs 729 µs340 µs 1860
core: selected ($(":selected") vs filter({selected}))gpu 25.3 µs26.2 µs 27.1 µs25.1 µs 12
core: filter(fn)v3 416 µs437 µs 946 µs411 µs 1597
core: filter(fn)gpu 344 µs373 µs 751 µs340 µs 1846
core: collection()v3 477 ns562 ns 1.59 µs453 ns 292
core: collection()gpu 68.2 ns71.7 ns 123 ns67.1 ns 2276
core: pan() get (x32)v3 45.6 ns47.9 ns 83.0 ns43.4 ns 3552
core: pan() get (x32)gpu 33.8 ns36.2 ns 53.1 ns32.9 ns 4724
core: extent()v3 22.7 ns40.3 ns 144 ns22.0 ns 4123
core: extent()gpu 20.7 ns27.7 ns 92.5 ns19.3 ns 6029
core: add + removev3 120 µs127 µs 236 µs110 µs 5428
core: add + removegpu 6.96 µs8.12 µs 24.9 µs6.54 µs 78345
core: zoom setv3 1.28 µs1.29 µs 1.45 µs1.21 µs 125
core: zoom setgpu 662 ns685 ns 1.07 µs641 ns 238
traverse: neighborhood()v3 3.61 µs3.92 µs 4.86 µs3.50 µs 40
traverse: neighborhood()gpu 1.03 µs1.18 µs 2.36 µs998 ns 136
traverse: connectedEdges()v3 1.05 µs1.16 µs 2.01 µs1.02 µs 143
traverse: connectedEdges()gpu 442 ns494 ns 1.42 µs431 ns 339
traverse: outgoers()v3 2.38 µs2.55 µs 3.62 µs2.27 µs 63
traverse: outgoers()gpu 495 ns604 ns 2.07 µs483 ns 268
traverse: incomers()v3 2.42 µs2.66 µs 3.87 µs2.33 µs 59
traverse: incomers()gpu 497 ns611 ns 2.11 µs485 ns 264
traverse: components()v3 79.7 ms81.7 ms 83.9 ms76.3 ms 12
traverse: components()gpu 2.02 ms2.12 ms 3.25 ms1.94 ms 315
degree: node.degree()v3 3.63 µs3.83 µs 5.09 µs3.30 µs 41
degree: node.degree()gpu 28.7 ns30.4 ns 58.1 ns27.4 ns 5626
degree: nodes.totalDegree()v3 7.81 ms8.70 ms 13.0 ms7.38 ms 76
degree: nodes.totalDegree()gpu 43.7 µs45.1 µs 85.8 µs42.2 µs 15268
degree: nodes.maxDegree()v3 7.47 ms8.31 ms 11.8 ms7.09 ms 80
degree: nodes.maxDegree()gpu 51.6 µs53.3 µs 91.1 µs49.1 µs 13078
data: getv3 30.1 ns31.4 ns 53.2 ns28.8 ns 5455
data: getgpu 27.6 ns28.4 ns 39.3 ns26.4 ns 6015
position: getv3 31.0 ns32.7 ns 67.4 ns30.4 ns 5230
position: getgpu 20.9 ns24.9 ns 54.3 ns20.2 ns 6723
json: elementv3 303 ns391 ns 3.59 µs295 ns 419
json: elementgpu 153 ns159 ns 240 ns149 ns 1021
set: union()v3 102 µs112 µs 167 µs94.2 µs 6020
set: union()gpu 17.2 µs17.8 µs 18.4 µs16.9 µs 12
set: intersection()v3 92.3 µs105 µs 156 µs88.0 µs 6566
set: intersection()gpu 3.84 µs3.88 µs 4.16 µs3.74 µs 38
set: difference()v3 93.3 µs107 µs 179 µs88.4 µs 6418
set: difference()gpu 3.92 µs4.01 µs 4.59 µs3.84 µs 37
iter: map()v3 27.1 µs29.5 µs 74.9 µs26.0 µs 23242
iter: map()gpu 11.1 µs11.1 µs 11.2 µs11.0 µs 11
iter: forEach()v3 3.48 µs3.75 µs 4.15 µs3.44 µs 36
iter: forEach()gpu 3.31 µs3.35 µs 3.54 µs3.27 µs 45
iter: filter(fn)v3 245 µs255 µs 385 µs243 µs 2740
iter: filter(fn)gpu 147 µs154 µs 256 µs142 µs 4539
compare: same()v3 117 µs120 µs 173 µs112 µs 5823
compare: same()gpu 14.9 ns15.6 ns 26.0 ns14.1 ns 10927
compare: contains()v3 6.01 µs6.00 µs 6.15 µs5.88 µs 25
compare: contains()gpu 1.25 µs1.26 µs 1.36 µs1.23 µs 129
mut: data setv3 445 ns462 ns 734 ns432 ns 361
mut: data setgpu 108 ns114 ns 169 ns105 ns 1484
mut: position setv3 1.30 µs1.32 µs 1.49 µs1.27 µs 123
mut: position setgpu 47.6 ns50.1 ns 98.7 ns46.3 ns 3306
mut: select + unselectv3 2.76 µs2.91 µs 3.44 µs2.59 µs 53
mut: select + unselectgpu 686 ns743 ns 1.21 µs628 ns 680626

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

sweep: nodes()
171180×
sweep: edges()
290398×
sweep: elements()
29346×
sweep: all nodes ($("node") vs filter({group}))
8.9×
sweep: selected ($(":selected") vs filter({selected}))
14×
sweep: selected nodes ($("node:selected") vs filter({group, selected}))
36×
sweep: nodes(":selected") vs nodes({selected})
59×
sweep: filter(fn)
1.70×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
sweep: nodes()v3 412 µs424 µs 520 µs400 µs 1654
sweep: nodes()gpu 2.41 ns2.49 ns 4.76 ns2.30 ns 66454
sweep: edges()v3 729 µs743 µs 972 µs708 µs 941
sweep: edges()gpu 2.51 ns2.61 ns 3.14 ns2.51 ns 63759
sweep: elements()v3 143 µs147 µs 207 µs139 µs 4745
sweep: elements()gpu 4.86 ns5.00 ns 11.2 ns4.54 ns 33635
sweep: all nodes ($("node") vs filter({group}))v3 544 µs573 µs 862 µs536 µs 1219
sweep: all nodes ($("node") vs filter({group}))gpu 61.2 µs73.6 µs 183 µs53.0 µs 9409
sweep: selected ($(":selected") vs filter({selected}))v3 349 µs361 µs 578 µs342 µs 1937
sweep: selected ($(":selected") vs filter({selected}))gpu 25.8 µs26.2 µs 26.9 µs25.4 µs 12
sweep: selected nodes ($("node:selected") vs filter({group, selected}))v3 322 µs334 µs 534 µs314 µs 2093
sweep: selected nodes ($("node:selected") vs filter({group, selected}))gpu 9.01 µs9.04 µs 9.32 µs8.89 µs 15
sweep: nodes(":selected") vs nodes({selected})v3 533 µs549 µs 903 µs517 µs 1274
sweep: nodes(":selected") vs nodes({selected})gpu 8.97 µs8.99 µs 9.21 µs8.87 µs 15
sweep: filter(fn)v3 412 µs421 µs 498 µs400 µs 1659
sweep: filter(fn)gpu 242 µs258 µs 570 µs236 µs 2696

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

mut-bulk: select + unselect
8.7×
mut-bulk: hide + show
283×
mut-bulk: lock + unlock
52×
mut-bulk: positions(obj)
112×
mut-bulk: positions(fn)
97×
mut-bulk: shift
100×
mut-bulk: data set
15×
mut-bulk: remove + re-add (256 nodes + cascade)
6.0×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
mut-bulk: select + unselectv3 2.21 ms2.24 ms 3.48 ms2.02 ms 295
mut-bulk: select + unselectgpu 254 µs261 µs 387 µs246 µs 2685
mut-bulk: hide + showv3 60.4 ms66.7 ms 73.8 ms58.8 ms 12
mut-bulk: hide + showgpu 214 µs224 µs 738 µs203 µs 3089
mut-bulk: lock + unlockv3 1.99 ms2.02 ms 2.39 ms1.95 ms 330
mut-bulk: lock + unlockgpu 38.5 µs38.9 µs 39.2 µs38.2 µs 12
mut-bulk: positions(obj)v3 2.28 ms2.33 ms 4.01 ms2.19 ms 293
mut-bulk: positions(obj)gpu 20.4 µs21.9 µs 47.2 µs19.3 µs 31436
mut-bulk: positions(fn)v3 3.37 ms3.56 ms 4.98 ms3.24 ms 190
mut-bulk: positions(fn)gpu 34.8 µs38.0 µs 101 µs33.0 µs 18168
mut-bulk: shiftv3 3.41 ms3.58 ms 4.88 ms3.27 ms 189
mut-bulk: shiftgpu 34.3 µs36.5 µs 66.8 µs33.0 µs 19002
mut-bulk: data setv3 919 µs949 µs 1.58 ms875 µs 722
mut-bulk: data setgpu 62.4 µs65.2 µs 136 µs59.9 µs 10524
mut-bulk: remove + re-add (256 nodes + cascade)v3 41.2 ms43.0 ms 47.6 ms40.2 ms 12
mut-bulk: remove + re-add (256 nodes + cascade)gpu 6.89 ms7.01 ms 8.33 ms6.17 ms 93

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

scn: explore (expand 2-hop + select + fit)
7.9×
scn: select-all + fit (listeners on)
28×
scn: drag (select band of 100 + 8-step shift, position listener)
16×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)
7.2×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)
1.84×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
scn: explore (expand 2-hop + select + fit)v3 297 µs349 µs 1.01 ms279 µs 1988
scn: explore (expand 2-hop + select + fit)gpu 37.6 µs40.8 µs 82.2 µs34.5 µs 16286
scn: select-all + fit (listeners on)v3 25.3 ms24.9 ms 26.6 ms23.3 ms 23
scn: select-all + fit (listeners on)gpu 910 µs955 µs 1.82 ms843 µs 700
scn: drag (select band of 100 + 8-step shift, position listener)v3 1.64 ms1.72 ms 2.47 ms1.58 ms 389
scn: drag (select band of 100 + 8-step shift, position listener)gpu 99.9 µs108 µs 323 µs96.4 µs 6297
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)v3 50.9 ms50.6 ms 52.1 ms46.7 ms 10
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)gpu 7.08 ms7.32 ms 8.98 ms6.44 ms 90
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)v3 7.72 ms8.28 ms 13.4 ms7.24 ms 79
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)gpu 4.20 ms4.33 ms 6.93 ms3.75 ms 149

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

trav: neighborhood()
3.9×
trav: closedNeighborhood()
2.7×
trav: connectedEdges()
2.5×
trav: outgoers()
5.1×
trav: incomers()
5.1×
trav: successors()
781×
trav: predecessors()
736×
trav: band neighborhood()
5.0×
trav: band connectedEdges()
1.45×
trav: band roots()
23×
trav: band sources()
1.48×
trav: band connectedNodes()
2.8×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
trav: neighborhood()v3 3.91 µs4.10 µs 5.43 µs3.43 µs 37
trav: neighborhood()gpu 1.01 µs1.08 µs 2.10 µs853 ns 154
trav: closedNeighborhood()v3 5.93 µs5.74 µs 6.15 µs5.23 µs 26
trav: closedNeighborhood()gpu 2.16 µs2.34 µs 2.97 µs2.09 µs 69
trav: connectedEdges()v3 978 ns1.06 µs 1.79 µs954 ns 158
trav: connectedEdges()gpu 397 ns414 ns 845 ns388 ns 408
trav: outgoers()v3 2.32 µs2.49 µs 3.09 µs2.25 µs 65
trav: outgoers()gpu 452 ns534 ns 2.06 µs442 ns 310
trav: incomers()v3 2.28 µs2.45 µs 3.02 µs2.21 µs 65
trav: incomers()gpu 448 ns532 ns 2.01 µs442 ns 313
trav: successors()v3 442 ms446 ms 462 ms433 ms 12
trav: successors()gpu 565 µs595 µs 1.90 ms547 µs 1145
trav: predecessors()v3 437 ms440 ms 458 ms431 ms 12
trav: predecessors()gpu 593 µs619 µs 1.83 ms577 µs 1098
trav: band neighborhood()v3 190 µs204 µs 399 µs183 µs 3415
trav: band neighborhood()gpu 38.1 µs38.7 µs 41.0 µs37.3 µs 12
trav: band connectedEdges()v3 24.7 µs25.4 µs 26.4 µs24.3 µs 12
trav: band connectedEdges()gpu 17.1 µs17.9 µs 19.6 µs16.7 µs 12
trav: band roots()v3 111 µs120 µs 188 µs106 µs 5773
trav: band roots()gpu 4.89 µs4.89 µs 5.07 µs4.75 µs 31
trav: band sources()v3 6.58 µs6.55 µs 6.72 µs6.30 µs 22
trav: band sources()gpu 4.43 µs4.52 µs 4.90 µs4.35 µs 34
trav: band connectedNodes()v3 14.1 µs14.4 µs 14.8 µs13.8 µs 12
trav: band connectedNodes()gpu 4.98 µs5.02 µs 5.17 µs4.90 µs 30

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

algo: bfs (whole graph)
55×
algo: dfs (whole graph)
59×
algo: dijkstra + pathTo
56×
algo: aStar
3.3×
algo: bellmanFord
19×
algo: kruskal
27×
algo: tarjan SCC
36×
algo: hopcroft-tarjan biconnected
25×
algo: hierholzer (directed)
2.8×
algo: betweennessCentrality (unweighted)
12×
algo: degreeCentralityNormalized
39×
algo: closenessCentrality (one root)
72×
algo: degreeCentrality (one root)
30×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 50.3 ms52.9 ms 60.0 ms48.7 ms 9
algo: bfs (whole graph)gpu 915 µs927 µs 1.44 ms851 µs 747
algo: dfs (whole graph)v3 48.5 ms48.4 ms 48.9 ms47.9 ms 11
algo: dfs (whole graph)gpu 825 µs844 µs 1.14 ms808 µs 813
algo: dijkstra + pathTov3 51.4 ms52.2 ms 54.1 ms50.9 ms 10
algo: dijkstra + pathTogpu 925 µs941 µs 1.12 ms906 µs 729
algo: aStarv3 1.65 ms1.69 ms 2.25 ms1.62 ms 410
algo: aStargpu 505 µs530 µs 886 µs488 µs 1316
algo: bellmanFordv3 226 ms226 ms 246 ms206 ms 12
algo: bellmanFordgpu 12.2 ms12.2 ms 14.0 ms11.8 ms 53
algo: kruskalv3 13.6 ms14.9 ms 19.3 ms12.6 ms 42
algo: kruskalgpu 506 µs520 µs 826 µs464 µs 1332
algo: tarjan SCCv3 23.3 ms24.0 ms 27.7 ms21.5 ms 25
algo: tarjan SCCgpu 652 µs818 µs 5.29 ms617 µs 826
algo: hopcroft-tarjan biconnectedv3 85.9 ms87.0 ms 91.5 ms81.8 ms 12
algo: hopcroft-tarjan biconnectedgpu 3.44 ms3.54 ms 4.65 ms3.38 ms 190
algo: hierholzer (directed)v3 22.4 ms23.5 ms 26.6 ms21.2 ms 26
algo: hierholzer (directed)gpu 8.07 ms8.25 ms 11.0 ms7.74 ms 75
algo: betweennessCentrality (unweighted)v3 3.98 s3.97 s 4.02 s3.91 s 12
algo: betweennessCentrality (unweighted)gpu 344 ms363 ms 433 ms334 ms 12
algo: degreeCentralityNormalizedv3 15.2 ms16.0 ms 19.5 ms14.0 ms 40
algo: degreeCentralityNormalizedgpu 392 µs405 µs 661 µs386 µs 1725
algo: closenessCentrality (one root)v3 58.9 ms61.3 ms 69.4 ms57.4 ms 12
algo: closenessCentrality (one root)gpu 816 µs842 µs 1.18 ms803 µs 827
algo: degreeCentrality (one root)v3 7.33 µs7.25 µs 8.21 µs6.55 µs 20
algo: degreeCentrality (one root)gpu 246 ns252 ns 332 ns240 ns 671

algorithms N=500 · 6.9 minv4 (gpu) v3

algo: bfs (whole graph)
64×
algo: dfs (whole graph)
62×
algo: dijkstra + pathTo
58×
algo: aStar
3.6×
algo: bellmanFord
21×
algo: kruskal
26×
algo: tarjan SCC
38×
algo: hopcroft-tarjan biconnected
28×
algo: hierholzer (directed)
5.6×
algo: betweennessCentrality (unweighted)
11×
algo: degreeCentralityNormalized
40×
algo: closenessCentrality (one root)
77×
algo: degreeCentrality (one root)
34×
algo: pageRank (20 iters)
1.89×
algo: closenessCentrality (weighted, one root)
59×
algo: floydWarshall
1.78×
algo: closenessCentralityNormalized
1.68×
algo: markovClustering
1.25×
algo: hierarchicalClustering (threshold)
2.3×
algo: kMeans (fixed centroids)
3.8×
algo: kMedoids
8.6×
algo: fuzzyCMeans
8.1×
algo: affinityPropagation
1.77×
algo: kargerStein
1.03×
algo: betweennessCentrality (weighted)
8.9×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 13.5 ms14.0 ms 19.3 ms11.6 ms 45
algo: bfs (whole graph)gpu 212 µs218 µs 358 µs195 µs 3154
algo: dfs (whole graph)v3 12.1 ms13.1 ms 16.5 ms11.6 ms 50
algo: dfs (whole graph)gpu 194 µs206 µs 355 µs190 µs 3379
algo: dijkstra + pathTov3 13.3 ms14.1 ms 17.2 ms12.4 ms 46
algo: dijkstra + pathTogpu 230 µs236 µs 336 µs221 µs 2955
algo: aStarv3 439 µs448 µs 589 µs430 µs 1556
algo: aStargpu 123 µs128 µs 197 µs118 µs 5450
algo: bellmanFordv3 16.9 ms17.0 ms 18.1 ms16.5 ms 37
algo: bellmanFordgpu 808 µs838 µs 1.93 ms786 µs 830
algo: kruskalv3 3.42 ms3.71 ms 7.46 ms3.31 ms 185
algo: kruskalgpu 131 µs140 µs 236 µs125 µs 4982
algo: tarjan SCCv3 5.71 ms6.09 ms 9.18 ms5.52 ms 110
algo: tarjan SCCgpu 151 µs164 µs 303 µs144 µs 4254
algo: hopcroft-tarjan biconnectedv3 22.1 ms22.8 ms 25.2 ms20.8 ms 27
algo: hopcroft-tarjan biconnectedgpu 798 µs819 µs 1.15 ms775 µs 834
algo: hierholzer (directed)v3 4.57 ms4.82 ms 7.67 ms4.32 ms 138
algo: hierholzer (directed)gpu 822 µs844 µs 1.15 ms794 µs 807
algo: betweennessCentrality (unweighted)v3 255 ms257 ms 266 ms250 ms 12
algo: betweennessCentrality (unweighted)gpu 22.4 ms22.8 ms 24.9 ms21.8 ms 27
algo: degreeCentralityNormalizedv3 3.79 ms4.07 ms 7.55 ms3.66 ms 168
algo: degreeCentralityNormalizedgpu 94.8 µs98.2 µs 154 µs91.6 µs 7090
algo: closenessCentrality (one root)v3 14.7 ms15.4 ms 18.1 ms13.9 ms 42
algo: closenessCentrality (one root)gpu 192 µs197 µs 282 µs185 µs 3479
algo: degreeCentrality (one root)v3 8.15 µs8.00 µs 8.48 µs7.28 µs 18
algo: degreeCentrality (one root)gpu 242 ns246 ns 301 ns236 ns 691
algo: pageRank (20 iters)v3 2.73 ms2.92 ms 6.31 ms2.64 ms 229
algo: pageRank (20 iters)gpu 1.45 ms1.66 ms 3.82 ms1.42 ms 418
algo: closenessCentrality (weighted, one root)v3 14.7 ms15.7 ms 18.7 ms14.1 ms 41
algo: closenessCentrality (weighted, one root)gpu 249 µs257 µs 414 µs243 µs 2715
algo: floydWarshallv3 248 ms274 ms 388 ms243 ms 12
algo: floydWarshallgpu 139 ms146 ms 142 ms137 ms 12
algo: closenessCentralityNormalizedv3 274 ms274 ms 278 ms270 ms 12
algo: closenessCentralityNormalizedgpu 164 ms165 ms 168 ms162 ms 12
algo: markovClusteringv3 4.12 s4.37 s 4.64 s4.10 s 12
algo: markovClusteringgpu 3.29 s3.46 s 3.80 s3.27 s 12
algo: hierarchicalClustering (threshold)v3 34.8 ms34.7 ms 35.7 ms33.9 ms 16
algo: hierarchicalClustering (threshold)gpu 15.0 ms15.3 ms 16.8 ms14.6 ms 42
algo: kMeans (fixed centroids)v3 8.97 ms9.04 ms 9.90 ms8.78 ms 74
algo: kMeans (fixed centroids)gpu 2.33 ms2.38 ms 3.51 ms2.26 ms 287
algo: kMedoidsv3 363 ms347 ms 429 ms226 ms 12
algo: kMedoidsgpu 42.1 ms44.6 ms 59.4 ms28.9 ms 12
algo: fuzzyCMeansv3 79.8 ms81.3 ms 85.2 ms78.0 ms 12
algo: fuzzyCMeansgpu 9.90 ms9.80 ms 10.9 ms9.05 ms 67
algo: affinityPropagationv3 215 ms214 ms 223 ms201 ms 12
algo: affinityPropagationgpu 121 ms133 ms 177 ms111 ms 12
algo: kargerSteinv3 316 ms321 ms 329 ms313 ms 12
algo: kargerSteingpu 308 ms310 ms 317 ms302 ms 12
algo: betweennessCentrality (weighted)v3 708 ms710 ms 721 ms703 ms 12
algo: betweennessCentrality (weighted)gpu 80.0 ms82.8 ms 93.9 ms76.4 ms 12

mappers N=2,000 · 8.2 s

mapper: bulk write, color — cpu eval
2.68 ms
mapper: bulk write, color — gpu path
177 µs
mapper: bulk write, color + size — cpu eval
3.13 ms
mapper: bulk write, color + size — gpu color / cpu size
2.61 ms
mapper: bulk write, mapped labels (round-5 path) — label refresh
4.07 ms
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
mapper: bulk write, colorcpu eval 2.68 ms2.73 ms 4.12 ms2.55 ms 250
mapper: bulk write, colorgpu path 177 µs187 µs 330 µs172 µs 3755
mapper: bulk write, color + sizecpu eval 3.13 ms3.19 ms 3.75 ms2.97 ms 215
mapper: bulk write, color + sizegpu color / cpu size 2.61 ms2.68 ms 3.52 ms2.51 ms 258
mapper: bulk write, mapped labels (round-5 path)label refresh 4.07 ms4.41 ms 7.29 ms3.47 ms 154

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

layout: grid
91×
layout: preset
19×
layout: preset (fn form)
57×
layout: circle
12×
layout: concentric
26×
layout: breadthfirst
35×
layout: random
11×
layout: force (CPU executor, 20 iterations) — gpu
119 ms
layout: force seed — spectral vs scatter (20 iterations) — spectral (landmark MDS, the default)
112 ms
layout: force seed — spectral vs scatter (20 iterations) — scatter
58.0 ms
layout: plumbing (layoutPositions vs setPositions) — finisher
371 µs
layout: plumbing (layoutPositions vs setPositions) — bulk
31.6 µs
layout: contract fixed cost (empty impl vs bulk placement) — wrapper only
526 ns
layout: contract fixed cost (empty impl vs bulk placement) — wrapper + bulk write
39.7 µs
layout: scope (eles.layout, 10% of nodes)
9.5×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
layout: gridv3 11.9 ms12.7 ms 18.2 ms10.7 ms 50
layout: gridgpu 130 µs145 µs 774 µs82.4 µs 4570
layout: presetv3 5.59 ms5.78 ms 7.69 ms5.40 ms 111
layout: presetgpu 297 µs327 µs 908 µs288 µs 2116
layout: preset (fn form)v3 5.64 ms6.02 ms 9.31 ms5.29 ms 112
layout: preset (fn form)gpu 98.3 µs109 µs 375 µs95.8 µs 6327
layout: circlev3 9.43 ms9.86 ms 15.7 ms8.99 ms 66
layout: circlegpu 778 µs877 µs 2.98 ms749 µs 766
layout: concentricv3 32.1 ms32.4 ms 36.0 ms28.3 ms 17
layout: concentricgpu 1.23 ms1.40 ms 4.83 ms1.16 ms 484
layout: breadthfirstv3 398 ms409 ms 441 ms390 ms 12
layout: breadthfirstgpu 11.4 ms11.8 ms 16.1 ms10.5 ms 51
layout: randomv3 5.53 ms5.77 ms 9.36 ms5.33 ms 116
layout: randomgpu 518 µs571 µs 1.46 ms494 µs 1208
layout: force (CPU executor, 20 iterations)gpu 119 ms131 ms 143 ms107 ms 12
layout: force seed — spectral vs scatter (20 iterations)spectral (landmark MDS, the default) 112 ms111 ms 119 ms103 ms 12
layout: force seed — spectral vs scatter (20 iterations)scatter 58.0 ms60.5 ms 63.4 ms57.1 ms 12
layout: plumbing (layoutPositions vs setPositions)finisher 371 µs415 µs 870 µs357 µs 1660
layout: plumbing (layoutPositions vs setPositions)bulk 31.6 µs44.2 µs 257 µs29.5 µs 14494
layout: contract fixed cost (empty impl vs bulk placement)wrapper only 526 ns984 ns 3.79 µs514 ns 164
layout: contract fixed cost (empty impl vs bulk placement)wrapper + bulk write 39.7 µs41.7 µs 49.6 µs38.6 µs 12
layout: scope (eles.layout, 10% of nodes)v3 958 µs1.07 ms 2.36 ms928 µs 635
layout: scope (eles.layout, 10% of nodes)gpu 100 µs114 µs 275 µs95.9 µs 6058

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

style: sheet swap (compile + applyAll)
1.20×
style: compile vs compile + apply — compile only (in batch)
27.3 µs
style: compile vs compile + apply — compile + apply
10.6 ms
style: first apply on add (256-node band)
1.57×
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — flat
10.5 ms
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — compound
11.1 ms
style: applyAll — constant vs state-case (the 57.1d partition) — constant sheet
10.4 ms
style: applyAll — constant vs state-case (the 57.1d partition) — state-case sheet
10.3 ms
style: applyAll — state-case vs data-case (what the partition avoids) — state-case sheet
10.5 ms
style: applyAll — state-case vs data-case (what the partition avoids) — data-case sheet
14.0 ms
style: select+unselect 256-band — constant vs state-case sheet — constant sheet (skips restyle)
6.76 µs
style: select+unselect 256-band — constant vs state-case sheet — paint-only state sheet (round-61 diff path)
34.7 µs
style: select+unselect 256-band — constant vs state-case sheet — state-case sheet (all channels; full write)
611 µs
style: read one prop (color)
1.90×
style: read one prop (width)
2.1×
style: numericStyle
2.8×
style: renderedStyle (one prop)
14×
style: whole-object style()
6.2×
10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
style: sheet swap (compile + applyAll)v3 13.1 ms13.4 ms 17.0 ms12.1 ms 46
style: sheet swap (compile + applyAll)gpu 10.8 ms10.9 ms 11.7 ms10.6 ms 57
style: compile vs compile + applycompile only (in batch) 27.3 µs34.8 µs 69.9 µs23.5 µs 19044
style: compile vs compile + applycompile + apply 10.6 ms10.7 ms 13.1 ms10.3 ms 62
style: first apply on add (256-node band)v3 1.31 ms1.56 ms 7.13 ms1.11 ms 440
style: first apply on add (256-node band)gpu 833 µs921 µs 2.68 ms805 µs 736
style: applyAll, flat vs compound (100 parents — the 14.6 partition)flat 10.5 ms10.6 ms 12.7 ms10.2 ms 62
style: applyAll, flat vs compound (100 parents — the 14.6 partition)compound 11.1 ms11.5 ms 15.0 ms10.8 ms 57
style: applyAll — constant vs state-case (the 57.1d partition)constant sheet 10.4 ms10.4 ms 11.0 ms10.2 ms 60
style: applyAll — constant vs state-case (the 57.1d partition)state-case sheet 10.3 ms10.4 ms 10.7 ms10.2 ms 62
style: applyAll — state-case vs data-case (what the partition avoids)state-case sheet 10.5 ms10.7 ms 12.4 ms10.2 ms 62
style: applyAll — state-case vs data-case (what the partition avoids)data-case sheet 14.0 ms14.1 ms 15.4 ms13.6 ms 43
style: select+unselect 256-band — constant vs state-case sheetconstant sheet (skips restyle) 6.76 µs6.80 µs 6.95 µs6.68 µs 20
style: select+unselect 256-band — constant vs state-case sheetpaint-only state sheet (round-61 diff path) 34.7 µs36.1 µs 65.9 µs33.3 µs 18530
style: select+unselect 256-band — constant vs state-case sheetstate-case sheet (all channels; full write) 611 µs636 µs 1.04 ms590 µs 1093
style: read one prop (color)v3 108 ns120 ns 598 ns96.0 ns 1994138
style: read one prop (color)gpu 56.9 ns59.7 ns 79.6 ns54.6 ns 2856
style: read one prop (width)v3 111 ns115 ns 442 ns96.0 ns 2005941
style: read one prop (width)gpu 53.0 ns56.5 ns 114 ns50.7 ns 3005
style: numericStylev3 138 ns127 ns 348 ns85.0 ns 1842844
style: numericStylegpu 49.8 ns52.4 ns 116 ns48.4 ns 3265
style: renderedStyle (one prop)v3 913 ns971 ns 1.97 µs880 ns 543032
style: renderedStyle (one prop)gpu 63.4 ns66.8 ns 211 ns61.5 ns 2567
style: whole-object style()v3 87.0 µs92.6 µs 177 µs84.6 µs 7522
style: whole-object style()gpu 14.0 µs15.6 µs 49.6 µs13.5 µs 43314

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

load: init from the definition form (construct + dispose)
5.9×
load: v4 ingest forms (construct + dispose) — definition form
21.7 ms
load: v4 ingest forms (construct + dispose) — columnar form
12.6 ms
load: v4 ingest forms (construct + dispose) — wire buffer
12.1 ms
load: v4 ingest forms (construct + dispose) — def clone alone (control)
308 µs
load: conversion — toColumnarElements
709 µs
load: conversion — serializeElements (from columnar)
206 µs
load: conversion — serializeElements (from defs)
891 µs
load: conversion — deserializeElements
4.55 µs
load: export from a live graph — cy.serialize() (wire)
493 µs
load: export from a live graph — cy.json() (v4)
730 µs
load: cy.json()
2.7×
load: add a 256-node band (add + remove)
1.36×
load: add a 256-node band, v4 forms — definition form
2.63 ms
load: add a 256-node band, v4 forms — columnar form
2.24 ms
load: add a 256-node band, v4 forms — wire buffer
2.20 ms
1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
load: init from the definition form (construct + dispose)v3 134 ms144 ms 172 ms126 ms 12
load: init from the definition form (construct + dispose)gpu 22.5 ms23.5 ms 28.8 ms20.1 ms 25
load: v4 ingest forms (construct + dispose)definition form 21.7 ms22.0 ms 26.0 ms18.9 ms 27
load: v4 ingest forms (construct + dispose)columnar form 12.6 ms13.4 ms 23.1 ms12.0 ms 47
load: v4 ingest forms (construct + dispose)wire buffer 12.1 ms13.2 ms 25.0 ms11.8 ms 47
load: v4 ingest forms (construct + dispose)def clone alone (control) 308 µs632 µs 11.1 ms218 µs 1040
load: conversiontoColumnarElements 709 µs774 µs 1.46 ms685 µs 888
load: conversionserializeElements (from columnar) 206 µs376 µs 1.05 ms173 µs 1836
load: conversionserializeElements (from defs) 891 µs947 µs 2.02 ms866 µs 734
load: conversiondeserializeElements 4.55 µs4.30 µs 5.76 µs3.29 µs 30
load: export from a live graphcy.serialize() (wire) 493 µs565 µs 1.92 ms485 µs 1217
load: export from a live graphcy.json() (v4) 730 µs1.07 ms 6.75 ms696 µs 618
load: cy.json()v3 2.00 ms2.32 ms 5.14 ms1.95 ms 293
load: cy.json()gpu 746 µs827 µs 2.78 ms727 µs 842
load: add a 256-node band (add + remove)v3 3.65 ms4.26 ms 10.7 ms3.17 ms 154
load: add a 256-node band (add + remove)gpu 2.68 ms2.96 ms 6.58 ms2.07 ms 227
load: add a 256-node band, v4 formsdefinition form 2.63 ms2.66 ms 4.13 ms2.06 ms 256
load: add a 256-node band, v4 formscolumnar form 2.24 ms2.31 ms 3.21 ms1.83 ms 292
load: add a 256-node band, v4 formswire buffer 2.20 ms2.27 ms 3.35 ms1.83 ms 302

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

pick: hit (the walk; one inside-test) — zoom 1
20.6 µ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.2 µs
pick: miss walk — exact vs 24 px touch halo (57.9) — padPx 24
45.6 µs
pick: shape inside-test, 2000 coincident misses — ellipse
87.2 µs
pick: shape inside-test, 2000 coincident misses — star
235 µs
pick: shape inside-test, 2000 coincident misses — round-hexagon
793 µs
pick: shape inside-test, 2000 coincident misses — barrel
681 µs
pick: shape inside-test, 2000 coincident misses — cut-rectangle
99.8 µs
pick: shape inside-test, 2000 coincident misses — polygon
214 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 1
802 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 2
799 µs
pick: background miss (full highWater walk) — gpu
45.1 µs
pick: label box in the scan (text-events) — text-events: no
45.3 µs
pick: label box in the scan (text-events) — text-events: yes
127 µs
box: elementsInBox by covered fraction — 10%
149 µs
box: elementsInBox by covered fraction — 50%
192 µs
box: elementsInBox by covered fraction — 100%
324 µs
box: label containment (boxSelectionIncludesLabels) — off
230 µs
box: label containment (boxSelectionIncludesLabels) — on
264 µs
box: overlap vs contain (straight edges) — contain
235 µs
box: overlap vs contain (straight edges) — overlap
475 µs
box: overlap vs contain (curved edges — the segment walk) — contain
1.26 ms
box: overlap vs contain (curved edges — the segment walk) — overlap
2.14 ms
bounds: whole-graph boundingBox()
6.1×
bounds: boundingBox, labels in vs out (v4) — includeLabels: true (default)
1.25 ms
bounds: boundingBox, labels in vs out (v4) — includeLabels: false
715 µs
bounds: cy.fit() (whole-graph scan)
33×
bounds: getFitViewport() (compute without committing)
33×
bounds: boundingBoxAt (v4 only) — gpu
2.53 ms
bounds: one node boundingBox()
1.75×
bounds: labelBoundingBox (v4 only) — gpu
409 ns
bounds: compound + taxi conservative scan (round 54, v4 only) — warm (curve bbs memoized)
75.2 µs
bounds: compound + taxi conservative scan (round 54, v4 only) — cold (geometry write per call)
152 µs
100 ns1 µs10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
pick: hit (the walk; one inside-test)zoom 1 20.6 µs21.5 µs 41.6 µs20.5 µs 31955
pick: hit (the walk; one inside-test)zoom 2 21.0 µs21.4 µs 21.8 µs20.8 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)exact 46.2 µs46.7 µs 48.5 µs45.8 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)padPx 24 45.6 µs47.8 µs 95.1 µs43.1 µs 14606
pick: shape inside-test, 2000 coincident missesellipse 87.2 µs90.7 µs 160 µs85.3 µs 7696
pick: shape inside-test, 2000 coincident missesstar 235 µs246 µs 340 µs225 µs 2835
pick: shape inside-test, 2000 coincident missesround-hexagon 793 µs809 µs 1.05 ms784 µs 865
pick: shape inside-test, 2000 coincident missesbarrel 681 µs712 µs 1.30 ms658 µs 978
pick: shape inside-test, 2000 coincident missescut-rectangle 99.8 µs103 µs 176 µs95.4 µs 6766
pick: shape inside-test, 2000 coincident missespolygon 214 µs217 µs 287 µs207 µs 3232
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 1 802 µs829 µs 1.37 ms788 µs 844
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 2 799 µs809 µs 1.01 ms780 µs 862
pick: background miss (full highWater walk)gpu 45.1 µs45.6 µs 46.1 µs44.9 µs 12
pick: label box in the scan (text-events)text-events: no 45.3 µs45.7 µs 46.3 µs44.8 µs 12
pick: label box in the scan (text-events)text-events: yes 127 µs131 µs 262 µs123 µs 5281
box: elementsInBox by covered fraction10% 149 µs156 µs 308 µs147 µs 4495
box: elementsInBox by covered fraction50% 192 µs199 µs 293 µs191 µs 3492
box: elementsInBox by covered fraction100% 324 µs337 µs 785 µs316 µs 2068
box: label containment (boxSelectionIncludesLabels)off 230 µs238 µs 455 µs224 µs 2931
box: label containment (boxSelectionIncludesLabels)on 264 µs279 µs 621 µs259 µs 2504
box: overlap vs contain (straight edges)contain 235 µs244 µs 406 µs230 µs 2863
box: overlap vs contain (straight edges)overlap 475 µs486 µs 901 µs418 µs 1433
box: overlap vs contain (curved edges — the segment walk)contain 1.26 ms1.28 ms 1.95 ms1.22 ms 541
box: overlap vs contain (curved edges — the segment walk)overlap 2.14 ms2.20 ms 2.96 ms2.11 ms 315
bounds: whole-graph boundingBox()v3 7.64 ms7.77 ms 8.93 ms7.34 ms 85
bounds: whole-graph boundingBox()gpu 1.25 ms1.29 ms 2.22 ms1.22 ms 539
bounds: boundingBox, labels in vs out (v4)includeLabels: true (default) 1.25 ms1.28 ms 1.85 ms1.22 ms 543
bounds: boundingBox, labels in vs out (v4)includeLabels: false 715 µs739 µs 1.43 ms683 µs 943
bounds: cy.fit() (whole-graph scan)v3 7.75 ms7.87 ms 9.00 ms7.52 ms 85
bounds: cy.fit() (whole-graph scan)gpu 238 µs247 µs 442 µs232 µs 2828
bounds: getFitViewport() (compute without committing)v3 7.85 ms8.08 ms 10.8 ms7.58 ms 82
bounds: getFitViewport() (compute without committing)gpu 235 µs245 µs 444 µs228 µs 2850
bounds: boundingBoxAt (v4 only)gpu 2.53 ms2.64 ms 3.64 ms2.52 ms 257
bounds: one node boundingBox()v3 1.74 µs1.75 µs 1.89 µs1.68 µs 92
bounds: one node boundingBox()gpu 995 ns1.03 µs 1.46 µs961 ns 160
bounds: labelBoundingBox (v4 only)gpu 409 ns439 ns 1.07 µs405 ns 382
bounds: compound + taxi conservative scan (round 54, v4 only)warm (curve bbs memoized) 75.2 µs83.2 µs 186 µs74.3 µs 8336
bounds: compound + taxi conservative scan (round 54, v4 only)cold (geometry write per call) 152 µs160 µs 232 µs149 µs 4349

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

data: bulk write, numeric column
21×
data: bulk write, dictionary string column (4 values)
17×
data: bulk write, one new dictionary entry per pass
17×
data: bulk write, object column (plain-array fallback)
20×
data: removeData (whole collection)
7.7×
data: read one numeric key
1.36×
data: read one string key (dictionary decode)
1.33×
data: read the whole object
2.3×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })
13×
query: data comparison ([weight > 3] vs { gt })
12×
query: two keys AND-ed
12×
query: membership ([bucket in ...] vs { in })
15×
query: predicate function (both sides)
6.7×
query: structural, parents (:parent vs { parent: true })
33×
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.80 ms1.85 ms 2.95 ms1.73 ms 362
data: bulk write, numeric columngpu 84.3 µs87.1 µs 128 µs81.3 µs 8027
data: bulk write, dictionary string column (4 values)v3 1.68 ms1.78 ms 3.69 ms1.64 ms 375
data: bulk write, dictionary string column (4 values)gpu 101 µs106 µs 316 µs94.8 µs 6592
data: bulk write, one new dictionary entry per passv3 1.66 ms1.75 ms 2.88 ms1.65 ms 390
data: bulk write, one new dictionary entry per passgpu 99.8 µs105 µs 189 µs96.8 µs 6698
data: bulk write, object column (plain-array fallback)v3 1.68 ms1.74 ms 2.90 ms1.64 ms 398
data: bulk write, object column (plain-array fallback)gpu 85.5 µs91.9 µs 130 µs82.9 µs 7600
data: removeData (whole collection)v3 2.52 ms2.66 ms 4.47 ms2.38 ms 257
data: removeData (whole collection)gpu 328 µs348 µs 906 µs322 µs 1984
data: read one numeric keyv3 38.5 ns40.4 ns 119 ns37.1 ns 4250
data: read one numeric keygpu 28.3 ns29.6 ns 76.2 ns27.8 ns 5596
data: read one string key (dictionary decode)v3 41.8 ns43.5 ns 88.1 ns40.5 ns 3943
data: read one string key (dictionary decode)gpu 31.4 ns32.8 ns 68.5 ns27.4 ns 5229
data: read the whole objectv3 48.0 ns49.8 ns 80.8 ns45.9 ns 3449
data: read the whole objectgpu 20.9 ns22.2 ns 43.3 ns20.3 ns 7680
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })v3 661 µs688 µs 1.12 ms641 µs 1014
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })gpu 52.3 µs56.5 µs 121 µs42.9 µs 12138
query: data comparison ([weight > 3] vs { gt })v3 738 µs757 µs 1.08 ms730 µs 920
query: data comparison ([weight > 3] vs { gt })gpu 59.6 µs67.7 µs 180 µs57.1 µs 9942
query: two keys AND-edv3 777 µs807 µs 1.25 ms768 µs 865
query: two keys AND-edgpu 67.0 µs69.9 µs 121 µs64.0 µs 9687
query: membership ([bucket in ...] vs { in })v3 1.01 ms1.04 ms 1.41 ms976 µs 660
query: membership ([bucket in ...] vs { in })gpu 65.3 µs71.8 µs 163 µs63.6 µs 9385
query: predicate function (both sides)v3 657 µs672 µs 911 µs638 µs 1040
query: predicate function (both sides)gpu 98.5 µs103 µs 179 µs95.7 µs 6754
query: structural, parents (:parent vs { parent: true })v3 516 µs525 µs 657 µs499 µs 1332
query: structural, parents (:parent vs { parent: true })gpu 15.6 µs17.9 µs 23.1 µs15.1 µs 12
query: structural, childless (:childless vs { parent: false })v3 798 µs818 µs 1.30 ms765 µs 852
query: structural, childless (:childless vs { parent: false })gpu 60.5 µs68.6 µs 188 µs56.3 µs 9772
query: structural, orphans (:orphan vs { child: false })v3 503 µs511 µs 604 µs491 µs 1365
query: structural, orphans (:orphan vs { child: false })gpu 15.5 µs16.3 µs 17.9 µs15.1 µs 12

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

emit: position write, no listeners
29×
emit: 1 core listener
8.5×
emit: 1 element (ref-qualified) listener
8.3×
emit: delegated (v3 selector vs v4 predicate)
8.9×
emit: 10 core listeners
6.9×
emit: on() + off() round-trip
2.2×
emit: flat vs phased (compound bubbling, 14.5) — orphan (flat emit)
307 ns
emit: flat vs phased (compound bubbling, 14.5) — child of 2 ancestors (phased)
915 ns
emit: flat vs phased, no listeners — orphan (flat)
76.2 ns
emit: flat vs phased, no listeners — child (phased)
468 ns
anim: start + stop, one element
1.37×
anim: start against a running animation (round-21 eviction) — disjoint channels (composes)
1.28 µs
anim: start against a running animation (round-21 eviction) — overlapping channels (evicts)
810 ns
anim: start + stop, 512-node collection
3.0×
anim: delay() (no channels touched)
1.58×
anim: controls (v4 only) — pause + resume
452 ns
anim: controls (v4 only) — reverse
903 ns
anim: viewport animate + stop
2.8×
10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
emit: position write, no listenersv3 1.31 µs1.39 µs 1.69 µs1.27 µs 114
emit: position write, no listenersgpu 45.7 ns48.4 ns 86.8 ns44.6 ns 3250
emit: 1 core listenerv3 1.35 µs1.39 µs 2.05 µs1.31 µs 119
emit: 1 core listenergpu 158 ns163 ns 284 ns154 ns 962
emit: 1 element (ref-qualified) listenerv3 1.38 µs1.46 µs 2.26 µs1.34 µs 106
emit: 1 element (ref-qualified) listenergpu 167 ns172 ns 257 ns165 ns 923
emit: delegated (v3 selector vs v4 predicate)v3 1.52 µs1.55 µs 2.16 µs1.47 µs 101
emit: delegated (v3 selector vs v4 predicate)gpu 169 ns179 ns 336 ns164 ns 898
emit: 10 core listenersv3 1.92 µs1.98 µs 2.30 µs1.87 µs 79
emit: 10 core listenersgpu 279 ns289 ns 432 ns277 ns 559
emit: on() + off() round-tripv3 477 ns587 ns 1.48 µs436 ns 278
emit: on() + off() round-tripgpu 216 ns262 ns 932 ns184 ns 628
emit: flat vs phased (compound bubbling, 14.5)orphan (flat emit) 307 ns357 ns 2.12 µs280 ns 955537
emit: flat vs phased (compound bubbling, 14.5)child of 2 ancestors (phased) 915 ns968 ns 1.31 µs834 ns 163
emit: flat vs phased, no listenersorphan (flat) 76.2 ns84.2 ns 169 ns72.5 ns 1970
emit: flat vs phased, no listenerschild (phased) 468 ns515 ns 1.59 µs456 ns 324
anim: start + stop, one elementv3 892 ns1.33 µs 3.58 µs814 ns 389399
anim: start + stop, one elementgpu 650 ns1.10 µs 4.67 µs604 ns 453288
anim: start against a running animation (round-21 eviction)disjoint channels (composes) 1.28 µs1.92 µs 3.88 µs1.08 µs 81
anim: start against a running animation (round-21 eviction)overlapping channels (evicts) 810 ns1.39 µs 3.58 µs795 ns 110
anim: start + stop, 512-node collectionv3 299 µs432 µs 1.25 ms288 µs 1443
anim: start + stop, 512-node collectiongpu 99.2 µs111 µs 168 µs95.2 µs 5762
anim: delay() (no channels touched)v3 656 ns957 ns 3.33 µs641 ns 167
anim: delay() (no channels touched)gpu 414 ns729 ns 2.73 µs410 ns 225
anim: controls (v4 only)pause + resume 452 ns729 ns 2.64 µs447 ns 210
anim: controls (v4 only)reverse 903 ns1.53 µs 3.53 µs879 ns 100
anim: viewport animate + stopv3 558 ns855 ns 2.91 µs551 ns 192
anim: viewport animate + stopgpu 201 ns238 ns 1.41 µs195 ns 700

store N=2,000 · 20.9 s

id index: set x 2000 (build) — gpu
283 µs
id index: single-key operations — get (probe)
57.5 ns
id index: single-key operations — has
51.3 ns
id index: single-key operations — idAt (memoized hit)
9.02 ns
id index: single-key operations — hashAt
7.01 ns
id index: remove + re-set (churn, drives the round-11 reclaim) — gpu
232 ns
adjacency: rebuild (4000 edges, two counting passes) — gpu
56.2 µs
adjacency: reads — outDegree (O(1))
6.19 ns
adjacency: reads — outEdges
45.0 ns
adjacency: reads — connectedEdges
124 ns
adjacency: addEdge + removeEdge (the overlay path) — gpu
137 ns
blob: write x 2000 (build) — gpu
103 µs
blob: single-record operations — rewrite in place (same length)
29.9 ns
blob: single-record operations — offsetOf
4.25 ns
blob: single-record operations — free + rewrite
149 ns
dirty: mark (per-write span coalescing) — contiguous marks
12.8 ns
dirty: mark (per-write span coalescing) — scattered marks
17.8 ns
dirty: take (a frame's drain) — gpu
598 ns
images: registry bookkeeping — acquire (existing url)
201 ns
images: registry bookkeeping — acquire (new url) + release
534 ns
charts: sheet apply, chart vs no chart — no chart
10.4 ms
charts: sheet apply, chart vs no chart — pie from data (blob record per node)
10.9 ms
charts: data write refreshing chart-values — gpu
2.43 ms
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
id index: set x 2000 (build)gpu 283 µs296 µs 467 µs272 µs 2368
id index: single-key operationsget (probe) 57.5 ns60.0 ns 93.6 ns56.2 ns 2858
id index: single-key operationshas 51.3 ns52.5 ns 74.0 ns49.5 ns 3257
id index: single-key operationsidAt (memoized hit) 9.02 ns9.33 ns 17.6 ns8.63 ns 18230
id index: single-key operationshashAt 7.01 ns7.22 ns 13.6 ns6.89 ns 23453
id index: remove + re-set (churn, drives the round-11 reclaim)gpu 232 ns241 ns 347 ns226 ns 695
adjacency: rebuild (4000 edges, two counting passes)gpu 56.2 µs64.4 µs 252 µs54.8 µs 10786
adjacency: readsoutDegree (O(1)) 6.19 ns6.28 ns 8.68 ns5.90 ns 27059
adjacency: readsoutEdges 45.0 ns46.7 ns 63.4 ns43.3 ns 3647
adjacency: readsconnectedEdges 124 ns188 ns 2.20 µs117 ns 890
adjacency: addEdge + removeEdge (the overlay path)gpu 137 ns141 ns 248 ns135 ns 1194
blob: write x 2000 (build)gpu 103 µs127 µs 790 µs99.8 µs 5469
blob: single-record operationsrewrite in place (same length) 29.9 ns30.7 ns 45.4 ns29.0 ns 5565
blob: single-record operationsoffsetOf 4.25 ns4.38 ns 7.99 ns4.09 ns 38412
blob: single-record operationsfree + rewrite 149 ns178 ns 629 ns146 ns 950
dirty: mark (per-write span coalescing)contiguous marks 12.8 ns13.2 ns 23.0 ns12.1 ns 12919
dirty: mark (per-write span coalescing)scattered marks 17.8 ns18.3 ns 28.2 ns17.1 ns 9322
dirty: take (a frame's drain)gpu 598 ns703 ns 1.32 µs583 ns 236
images: registry bookkeepingacquire (existing url) 201 ns208 ns 277 ns199 ns 820
images: registry bookkeepingacquire (new url) + release 534 ns616 ns 2.79 µs521 ns 267
charts: sheet apply, chart vs no chartno chart 10.4 ms10.6 ms 12.3 ms10.1 ms 61
charts: sheet apply, chart vs no chartpie from data (blob record per node) 10.9 ms11.0 ms 12.0 ms10.6 ms 59
charts: data write refreshing chart-valuesgpu 2.43 ms2.49 ms 3.54 ms2.34 ms 277

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

viewport: zoom() get
4.7×
viewport: zoom( n ) set
1.80×
viewport: pan() get
1.08×
viewport: pan( p ) set
1.95×
viewport: panBy()
1.73×
viewport: extent()
1.58×
viewport: renderedExtent()
1.65×
viewport: width() + height() + size() (3 calls)
2.9×
viewport: minZoom/maxZoom get (2 calls)
15×
viewport: center( eles )
19×
viewport: reset()
121×
viewport: viewport({ zoom, pan })
64×
viewport: getCenterPan( eles ) — gpu
6.26 µs
core: instanceString + headless + styleEnabled (3 calls)
1.25×
core: hasElementWithId + hasCompoundNodes (2 calls)
1.27×
core: options()
86×
core: mutableElements() (v4 materializes; v3 is O(1))
1.36×
core: gating getters (5 calls)
1.16×
core: gating setters round-trip (autolock/autoungrabify/autounselectify)
1.85×
core: interaction tuning getters (5 calls) — gpu
7.15 ns
core: graph data() set + get (v3 restyles the graph)
8610×
core: graph scratch() set + get (v3 restyles the graph)
16571×
core: batch( fn ) (empty)
6.8×
core: startBatch + endBatch + batching
5.8×
core: collection()
7.2×
core: compact() (no dead slots — the early-out) — gpu
16.9 µs
collection: element accessors (id/group/isNode/isEdge, 4 calls)
1.79×
collection: length + empty + nonempty (3 calls)
4.5×
collection: eq/first/last (3 calls)
1.83×
collection: slice()
2.1×
collection: toArray()
12×
collection: sort( fn )
1.57×
collection: reduce( fn )
1.38×
collection: min + max ( fn ) (2 calls)
2.0×
collection: some + every (2 calls)
1.57×
collection: same + anySame + contains (3 calls)
72×
collection: allAre (all match: the full walk)
1.52×
collection: is (none match: the full walk)
2.2×
collection: union
6.3×
collection: intersection
27×
collection: difference
28×
collection: symmetricDifference
3.7×
collection: absoluteComplement
13×
collection: byGroup
2.6×
collection: diff
2.9×
collection: indexOf
1.41×
traversal: openNeighborhood + closedNeighborhood (2 calls)
2.9×
traversal: connectedNodes
3.3×
traversal: sources + targets (2 calls)
3.4×
traversal: source() + target() (2 calls)
1.27×
traversal: edgesWith
1.21×
traversal: edgesTo
1.17×
traversal: parallelEdges + codirectedEdges (2 calls)
3.3×
traversal: roots + leaves (2 calls)
15×
traversal: allAreNeighbors
5.1×
traversal: isLoop + isSimple (2 calls)
2.3×
degree: indegree + outdegree (2 calls)
72×
degree: minDegree + maxDegree (2 calls)
35×
degree: minIndegree + maxOutdegree (2 calls)
21×
dimensions: renderedPosition get
2.5×
dimensions: relativePosition get
12×
dimensions: width + height + outerWidth + outerHeight (4 calls)
2.5×
dimensions: rendered dims (4 calls)
2.9×
dimensions: renderedBoundingBox
1.91×
dimensions: midpoint + renderedMidpoint (2 calls) — gpu
1.10 µs
dimensions: source/targetEndpoint (2 calls) — gpu
381 ns
dimensions: rendered source/targetEndpoint (2 calls) — gpu
393 ns
dimensions: shift + silentShift (round-trip)
60×
dimensions: silentPosition
17×
dimensions: positions( fn ) over 100
55×
dimensions: padding + paddedWidth + paddedHeight (3 calls)
15×
curves: isBundledBezier — gpu
20.6 ns
curves: controlPoints + renderedControlPoints (2 calls) — gpu
525 ns
curves: segmentPoints (undefined for bezier) — gpu
33.2 ns
compound: parent + parents + ancestors (3 calls)
3.6×
compound: children + descendants + siblings (3 calls)
4.6×
compound: orphans + nonorphans (2 calls)
6.6×
compound: commonAncestors
131×
compound: isParent/isChild/isChildless/isOrphan (4 calls)
1.57×
flags: select + unselect + selected (band)
15×
flags: selectify + unselectify + selectable
95×
flags: lock + unlock + locked
92×
flags: grabify + ungrabify + grabbable
94×
flags: show + hide + visible
224×
flags: active/activate/unactivate (3 calls)
15×
flags: panify + unpanify + pannable
95×
flags: takesUpSpace + interactive + transparent (3 calls)
2.9×
flags: effectiveOpacity
2.1×
element data: scratch get + set
7.3×
element data: json() one element
1.98×
element data: jsons() over 100
1.87×
element data: label() — gpu
15.4 ns
core: batchData()
8.6×
core: animated()
4.9×
core: zoomRange get — gpu
2.16 ns
core: forceRender() (headless no-op)
16×
core: resize() / invalidateSize()
2.7×
core: onRender + offRender
2.4×
core: removeScratch()
9678×
core: selectionType get
1.99×
core: isReady()
2.2×
core: window()
2.8×
core: container()
2.7×
core: destroyed()
2.2×
core: removeAllListeners()
8.8×
collection: cy()
3.5×
collection: indexOfId()
1.87×
collection: removed() + inside() (2 calls)
1.11×
collection: silentPositions( fn ) over 100
35×
collection: animated()
2.9×
collection: delayAnimation()
2.7×
collection: removeScratch()
9.0×
collection: component()
42×
collection: layoutDimensions()
3.6×
degree: maxIndegree + minOutdegree (2 calls)
22×
flags: grabbed + hidden + inactive (3 calls)
2.0×
curves: renderedSegmentPoints — gpu
36.1 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.70 ns6.00 ns 13.8 ns5.41 ns 28076
viewport: zoom() getgpu 1.21 ns1.25 ns 2.20 ns1.18 ns 126849
viewport: zoom( n ) setv3 620 ns628 ns 755 ns594 ns 264
viewport: zoom( n ) setgpu 344 ns360 ns 790 ns316 ns 463
viewport: pan() getv3 5.27 ns5.42 ns 9.26 ns5.17 ns 31112
viewport: pan() getgpu 4.86 ns5.08 ns 11.6 ns4.85 ns 33363
viewport: pan( p ) setv3 661 ns669 ns 745 ns640 ns 249
viewport: pan( p ) setgpu 339 ns343 ns 404 ns316 ns 484
viewport: panBy()v3 615 ns619 ns 703 ns591 ns 270
viewport: panBy()gpu 356 ns366 ns 660 ns315 ns 458
viewport: extent()v3 30.6 ns47.9 ns 197 ns28.6 ns 3515
viewport: extent()gpu 19.3 ns25.9 ns 107 ns18.1 ns 6493
viewport: renderedExtent()v3 27.2 ns28.5 ns 50.6 ns26.1 ns 5943
viewport: renderedExtent()gpu 16.5 ns23.3 ns 99.8 ns15.2 ns 7233
viewport: width() + height() + size() (3 calls)v3 20.9 ns21.9 ns 44.6 ns20.4 ns 7769
viewport: width() + height() + size() (3 calls)gpu 7.27 ns7.72 ns 17.1 ns6.99 ns 21867
viewport: minZoom/maxZoom get (2 calls)v3 14.7 ns15.3 ns 25.2 ns14.2 ns 11133
viewport: minZoom/maxZoom get (2 calls)gpu 0.999 ns1.04 ns 1.46 ns0.998 ns 151093
viewport: center( eles )v3 121 µs126 µs 204 µs114 µs 5532
viewport: center( eles )gpu 6.19 µs6.20 µs 6.29 µs6.11 µs 23
viewport: reset()v3 1.07 µs1.15 µs 1.73 µs1.00 µs 144
viewport: reset()gpu 8.83 ns9.22 ns 16.7 ns8.57 ns 18301
viewport: viewport({ zoom, pan })v3 1.01 µs1.11 µs 1.73 µs983 ns 148
viewport: viewport({ zoom, pan })gpu 15.8 ns16.7 ns 37.9 ns15.1 ns 10210
viewport: getCenterPan( eles )gpu 6.26 µs6.28 µs 6.48 µs6.12 µs 23
core: instanceString + headless + styleEnabled (3 calls)v3 32.9 ns34.4 ns 68.7 ns32.2 ns 4963
core: instanceString + headless + styleEnabled (3 calls)gpu 26.3 ns27.1 ns 37.8 ns25.2 ns 6291
core: hasElementWithId + hasCompoundNodes (2 calls)v3 40.5 ns41.7 ns 52.8 ns39.8 ns 4093
core: hasElementWithId + hasCompoundNodes (2 calls)gpu 31.8 ns33.0 ns 50.9 ns30.8 ns 5173
core: options()v3 91.5 ns94.9 ns 138 ns90.0 ns 1797
core: options()gpu 1.07 ns1.15 ns 2.20 ns1.05 ns 138738
core: mutableElements() (v4 materializes; v3 is O(1))v3 3.19 ns3.34 ns 4.42 ns3.14 ns 49947
core: mutableElements() (v4 materializes; v3 is O(1))gpu 2.35 ns2.43 ns 4.33 ns2.25 ns 68076
core: gating getters (5 calls)v3 15.7 ns16.4 ns 30.2 ns15.3 ns 10386
core: gating getters (5 calls)gpu 13.5 ns14.3 ns 37.5 ns12.6 ns 11896
core: gating setters round-trip (autolock/autoungrabify/autounselectify)v3 11.2 ns11.6 ns 20.2 ns10.6 ns 14725
core: gating setters round-trip (autolock/autoungrabify/autounselectify)gpu 6.06 ns6.27 ns 13.1 ns5.85 ns 27066
core: interaction tuning getters (5 calls)gpu 7.15 ns7.43 ns 13.7 ns7.00 ns 22771
core: graph data() set + get (v3 restyles the graph)v3 2.78 ms2.82 ms 3.74 ms2.66 ms 243
core: graph data() set + get (v3 restyles the graph)gpu 322 ns334 ns 403 ns315 ns 498
core: graph scratch() set + get (v3 restyles the graph)v3 2.79 ms2.86 ms 3.45 ms2.69 ms 241
core: graph scratch() set + get (v3 restyles the graph)gpu 168 ns170 ns 227 ns168 ns 1002
core: batch( fn ) (empty)v3 567 ns688 ns 1.74 µs562 ns 246
core: batch( fn ) (empty)gpu 83.9 ns86.6 ns 116 ns82.1 ns 1957
core: startBatch + endBatch + batchingv3 532 ns637 ns 1.58 µs518 ns 264
core: startBatch + endBatch + batchinggpu 91.3 ns165 ns 2.93 µs87.4 ns 1001
core: collection()v3 446 ns525 ns 1.55 µs443 ns 319
core: collection()gpu 61.7 ns64.5 ns 101 ns60.4 ns 2632
core: compact() (no dead slots — the early-out)gpu 16.9 µs21.6 µs 97.5 µs16.4 µs 31593
collection: element accessors (id/group/isNode/isEdge, 4 calls)v3 60.6 ns64.4 ns 192 ns57.1 ns 2642
collection: element accessors (id/group/isNode/isEdge, 4 calls)gpu 33.8 ns36.4 ns 79.2 ns32.6 ns 4660
collection: length + empty + nonempty (3 calls)v3 6.60 ns6.83 ns 11.1 ns6.34 ns 24802
collection: length + empty + nonempty (3 calls)gpu 1.47 ns1.53 ns 1.94 ns1.44 ns 106618
collection: eq/first/last (3 calls)v3 15.1 ns15.6 ns 25.2 ns14.6 ns 10919
collection: eq/first/last (3 calls)gpu 8.24 ns8.47 ns 15.0 ns7.93 ns 20047
collection: slice()v3 3.80 µs3.88 µs 4.29 µs3.61 µs 40
collection: slice()gpu 1.79 µs1.81 µs 2.06 µs1.70 µs 90
collection: toArray()v3 8.92 µs9.01 µs 9.25 µs8.75 µs 15
collection: toArray()gpu 751 ns769 ns 884 ns727 ns 213
collection: sort( fn )v3 14.1 µs14.6 µs 14.8 µs13.8 µs 12
collection: sort( fn )gpu 8.97 µs8.99 µs 9.16 µs8.85 µs 15
collection: reduce( fn )v3 157 ns159 ns 177 ns119 ns 1063
collection: reduce( fn )gpu 113 ns115 ns 135 ns111 ns 1500
collection: min + max ( fn ) (2 calls)v3 11.3 µs11.3 µs 11.6 µs11.2 µs 11
collection: min + max ( fn ) (2 calls)gpu 5.56 µs5.61 µs 5.71 µs5.48 µs 26
collection: some + every (2 calls)v3 887 ns904 ns 1.30 µs862 ns 181
collection: some + every (2 calls)gpu 565 ns570 ns 651 ns546 ns 297
collection: same + anySame + contains (3 calls)v3 7.28 µs7.30 µs 7.50 µs7.16 µs 20
collection: same + anySame + contains (3 calls)gpu 101 ns103 ns 145 ns97.2 ns 1664
collection: allAre (all match: the full walk)v3 3.75 µs3.75 µs 4.24 µs3.44 µs 41
collection: allAre (all match: the full walk)gpu 2.47 µs2.51 µs 2.90 µs2.41 µs 63
collection: is (none match: the full walk)v3 5.65 µs5.64 µs 5.88 µs5.38 µs 26
collection: is (none match: the full walk)gpu 2.62 µs2.62 µs 2.94 µs2.42 µs 61
collection: unionv3 94.7 µs108 µs 215 µs91.9 µs 6440
collection: uniongpu 15.1 µs15.6 µs 16.9 µs14.6 µs 12
collection: intersectionv3 89.7 µs102 µs 220 µs88.4 µs 6775
collection: intersectiongpu 3.31 µs3.36 µs 3.79 µs3.25 µs 46
collection: differencev3 90.5 µs100 µs 168 µs88.8 µs 6863
collection: differencegpu 3.25 µs3.28 µs 3.82 µs3.20 µs 47
collection: symmetricDifferencev3 24.7 µs25.1 µs 25.5 µs24.2 µs 12
collection: symmetricDifferencegpu 6.73 µs6.75 µs 6.87 µs6.58 µs 21
collection: absoluteComplementv3 6.03 ms6.58 ms 10.4 ms5.84 ms 102
collection: absoluteComplementgpu 462 µs473 µs 724 µs448 µs 1478
collection: byGroupv3 979 µs1.00 ms 1.26 ms953 µs 697
collection: byGroupgpu 380 µs389 µs 605 µs369 µs 1795
collection: diffv3 34.5 µs37.0 µs 80.1 µs33.6 µs 18377
collection: diffgpu 11.8 µs11.8 µs 12.3 µs10.1 µs 11
collection: indexOfv3 32.7 ns33.3 ns 40.8 ns32.4 ns 5137
collection: indexOfgpu 23.2 ns23.9 ns 33.8 ns22.5 ns 7138
traversal: openNeighborhood + closedNeighborhood (2 calls)v3 9.45 µs9.60 µs 10.9 µs8.79 µs 14
traversal: openNeighborhood + closedNeighborhood (2 calls)gpu 3.22 µs3.32 µs 3.79 µs3.13 µs 47
traversal: connectedNodesv3 984 ns1.07 µs 1.73 µs957 ns 156
traversal: connectedNodesgpu 301 ns307 ns 407 ns290 ns 540
traversal: sources + targets (2 calls)v3 1.74 µs1.89 µs 2.65 µs1.69 µs 85
traversal: sources + targets (2 calls)gpu 513 ns673 ns 2.17 µs501 ns 245
traversal: source() + target() (2 calls)v3 71.6 ns73.3 ns 126 ns61.7 ns 2333
traversal: source() + target() (2 calls)gpu 56.5 ns58.2 ns 71.2 ns55.0 ns 2938
traversal: edgesWithv3 68.1 µs69.6 µs 109 µs66.6 µs 10008
traversal: edgesWithgpu 56.2 µs60.7 µs 148 µs54.6 µs 11400
traversal: edgesTov3 68.6 µs71.3 µs 125 µs67.4 µs 9778
traversal: edgesTogpu 58.8 µs59.9 µs 62.4 µs57.4 µs 12
traversal: parallelEdges + codirectedEdges (2 calls)v3 3.57 µs3.86 µs 4.60 µs3.45 µs 40
traversal: parallelEdges + codirectedEdges (2 calls)gpu 1.07 µs1.22 µs 1.87 µs1.04 µs 133
traversal: roots + leaves (2 calls)v3 5.15 ms5.50 ms 8.79 ms5.03 ms 121
traversal: roots + leaves (2 calls)gpu 345 µs350 µs 406 µs334 µs 1996
traversal: allAreNeighborsv3 198 µs211 µs 280 µs191 µs 3307
traversal: allAreNeighborsgpu 38.9 µs39.8 µs 42.1 µs38.5 µs 12
traversal: isLoop + isSimple (2 calls)v3 126 ns128 ns 146 ns125 ns 1332
traversal: isLoop + isSimple (2 calls)gpu 53.9 ns55.5 ns 69.0 ns52.6 ns 3076
degree: indegree + outdegree (2 calls)v3 3.50 µs3.67 µs 4.38 µs3.29 µs 42
degree: indegree + outdegree (2 calls)gpu 48.8 ns50.3 ns 75.8 ns47.3 ns 3391
degree: minDegree + maxDegree (2 calls)v3 15.7 ms16.8 ms 19.9 ms15.0 ms 37
degree: minDegree + maxDegree (2 calls)gpu 453 µs465 µs 711 µs440 µs 1510
degree: minIndegree + maxOutdegree (2 calls)v3 9.30 ms10.1 ms 14.5 ms8.98 ms 64
degree: minIndegree + maxOutdegree (2 calls)gpu 434 µs438 µs 661 µs413 µs 1592
dimensions: renderedPosition getv3 74.1 ns79.3 ns 179 ns73.3 ns 2141
dimensions: renderedPosition getgpu 29.5 ns33.2 ns 115 ns28.5 ns 5080
dimensions: relativePosition getv3 837 ns850 ns 960 ns826 ns 196
dimensions: relativePosition getgpu 72.5 ns77.9 ns 201 ns70.1 ns 2179
dimensions: width + height + outerWidth + outerHeight (4 calls)v3 594 ns598 ns 653 ns581 ns 281
dimensions: width + height + outerWidth + outerHeight (4 calls)gpu 242 ns246 ns 285 ns241 ns 685
dimensions: rendered dims (4 calls)v3 696 ns704 ns 750 ns692 ns 239
dimensions: rendered dims (4 calls)gpu 237 ns239 ns 292 ns231 ns 711
dimensions: renderedBoundingBoxv3 1.74 µs1.77 µs 2.26 µs1.69 µs 90
dimensions: renderedBoundingBoxgpu 911 ns912 ns 982 ns892 ns 183
dimensions: midpoint + renderedMidpoint (2 calls)gpu 1.10 µs1.11 µs 1.22 µs1.09 µs 146
dimensions: source/targetEndpoint (2 calls)gpu 381 ns384 ns 425 ns364 ns 439
dimensions: rendered source/targetEndpoint (2 calls)gpu 393 ns398 ns 451 ns377 ns 425
dimensions: shift + silentShift (round-trip)v3 291 µs304 µs 666 µs283 µs 2297
dimensions: shift + silentShift (round-trip)gpu 4.85 µs4.87 µs 4.97 µs4.82 µs 31
dimensions: silentPositionv3 897 ns910 ns 1.05 µs874 ns 183
dimensions: silentPositiongpu 52.7 ns55.1 ns 81.6 ns51.0 ns 3083
dimensions: positions( fn ) over 100v3 169 µs176 µs 363 µs164 µs 3962
dimensions: positions( fn ) over 100gpu 3.06 µs3.07 µs 3.22 µs2.99 µs 51
dimensions: padding + paddedWidth + paddedHeight (3 calls)v3 1.99 µs2.00 µs 2.13 µs1.95 µs 80
dimensions: padding + paddedWidth + paddedHeight (3 calls)gpu 133 ns137 ns 175 ns131 ns 1244
curves: isBundledBeziergpu 20.6 ns21.0 ns 30.3 ns19.6 ns 8077
curves: controlPoints + renderedControlPoints (2 calls)gpu 525 ns535 ns 694 ns515 ns 308
curves: segmentPoints (undefined for bezier)gpu 33.2 ns34.2 ns 45.4 ns32.4 ns 5002
compound: parent + parents + ancestors (3 calls)v3 3.03 µs3.41 µs 4.43 µs2.92 µs 46
compound: parent + parents + ancestors (3 calls)gpu 835 ns1.07 µs 2.38 µs774 ns 152
compound: children + descendants + siblings (3 calls)v3 8.78 µs8.75 µs 9.37 µs7.88 µs 16
compound: children + descendants + siblings (3 calls)gpu 1.93 µs2.17 µs 3.05 µs1.87 µs 74
compound: orphans + nonorphans (2 calls)v3 3.67 µs3.89 µs 4.56 µs3.54 µs 40
compound: orphans + nonorphans (2 calls)gpu 556 ns712 ns 2.78 µs530 ns 229
compound: commonAncestorsv3 10.0 µs10.2 µs 10.9 µs9.84 µs 13
compound: commonAncestorsgpu 76.7 ns78.9 ns 113 ns74.5 ns 2156
compound: isParent/isChild/isChildless/isOrphan (4 calls)v3 71.7 ns74.8 ns 156 ns60.6 ns 2288
compound: isParent/isChild/isChildless/isOrphan (4 calls)gpu 45.6 ns46.9 ns 64.3 ns44.3 ns 3640
flags: select + unselect + selected (band)v3 193 µs200 µs 441 µs188 µs 3495
flags: select + unselect + selected (band)gpu 12.9 µs13.0 µs 13.0 µs12.9 µs 9
flags: selectify + unselectify + selectablev3 195 µs200 µs 319 µs188 µs 3458
flags: selectify + unselectify + selectablegpu 2.04 µs2.05 µs 2.17 µs2.00 µs 80
flags: lock + unlock + lockedv3 189 µs194 µs 292 µs185 µs 3605
flags: lock + unlock + lockedgpu 2.05 µs2.08 µs 2.77 µs2.02 µs 78
flags: grabify + ungrabify + grabbablev3 190 µs197 µs 324 µs186 µs 3553
flags: grabify + ungrabify + grabbablegpu 2.03 µs2.04 µs 2.17 µs2.01 µs 80
flags: show + hide + visiblev3 2.58 ms2.72 ms 4.10 ms2.50 ms 253
flags: show + hide + visiblegpu 11.5 µs11.6 µs 11.7 µs11.4 µs 11
flags: active/activate/unactivate (3 calls)v3 193 µs200 µs 398 µs186 µs 3494
flags: active/activate/unactivate (3 calls)gpu 12.9 µs13.0 µs 13.0 µs12.9 µs 9
flags: panify + unpanify + pannablev3 192 µs197 µs 399 µs182 µs 3543
flags: panify + unpanify + pannablegpu 2.02 µs2.03 µs 2.19 µs1.99 µs 81
flags: takesUpSpace + interactive + transparent (3 calls)v3 196 ns202 ns 278 ns195 ns 849
flags: takesUpSpace + interactive + transparent (3 calls)gpu 67.7 ns69.3 ns 84.9 ns66.3 ns 2468
flags: effectiveOpacityv3 51.0 ns52.0 ns 79.3 ns47.7 ns 3294
flags: effectiveOpacitygpu 23.9 ns24.5 ns 35.9 ns23.0 ns 6993
element data: scratch get + setv3 1.29 µs1.30 µs 1.41 µs1.24 µs 128
element data: scratch get + setgpu 176 ns178 ns 237 ns172 ns 961
element data: json() one elementv3 300 ns381 ns 3.47 µs292 ns 430
element data: json() one elementgpu 151 ns191 ns 528 ns147 ns 843
element data: jsons() over 100v3 39.9 µs40.2 µs 42.2 µs39.3 µs 12
element data: jsons() over 100gpu 21.3 µs21.5 µs 24.3 µs15.8 µs 12
element data: label()gpu 15.4 ns16.0 ns 30.2 ns14.6 ns 10622
core: batchData()v3 2.41 µs2.55 µs 3.24 µs2.34 µs 62
core: batchData()gpu 281 ns365 ns 2.30 µs274 ns 452
core: animated()v3 7.52 ns7.80 ns 13.8 ns7.22 ns 21735
core: animated()gpu 1.53 ns1.59 ns 2.35 ns1.50 ns 104004
core: zoomRange getgpu 2.16 ns2.31 ns 6.16 ns2.05 ns 72193
core: forceRender() (headless no-op)v3 23.4 ns24.6 ns 57.6 ns22.8 ns 6949
core: forceRender() (headless no-op)gpu 1.48 ns1.55 ns 2.54 ns1.45 ns 106355
core: resize() / invalidateSize()v3 339 ns345 ns 403 ns329 ns 490
core: resize() / invalidateSize()gpu 126 ns132 ns 288 ns121 ns 1291
core: onRender + offRenderv3 457 ns480 ns 970 ns437 ns 350
core: onRender + offRendergpu 191 ns234 ns 695 ns188 ns 715
core: removeScratch()v3 2.73 ms2.77 ms 3.16 ms2.67 ms 248
core: removeScratch()gpu 282 ns293 ns 559 ns273 ns 579
core: selectionType getv3 4.51 ns4.71 ns 8.70 ns4.35 ns 35812
core: selectionType getgpu 2.26 ns2.36 ns 4.13 ns2.11 ns 70630
core: isReady()v3 3.37 ns3.46 ns 4.84 ns3.32 ns 48536
core: isReady()gpu 1.51 ns1.56 ns 2.26 ns1.48 ns 105457
core: window()v3 4.11 ns4.28 ns 9.14 ns4.01 ns 39386
core: window()gpu 1.48 ns1.52 ns 2.01 ns1.45 ns 108140
core: container()v3 3.96 ns4.13 ns 9.49 ns3.75 ns 40859
core: container()gpu 1.48 ns1.54 ns 2.52 ns1.45 ns 106489
core: destroyed()v3 3.31 ns3.41 ns 6.51 ns3.18 ns 49276
core: destroyed()gpu 1.48 ns1.53 ns 1.95 ns1.45 ns 107619
core: removeAllListeners()v3 13.9 ns14.5 ns 27.1 ns13.4 ns 11738
core: removeAllListeners()gpu 1.58 ns1.64 ns 2.13 ns1.55 ns 100166
collection: cy()v3 7.63 ns8.11 ns 14.8 ns7.32 ns 21037
collection: cy()gpu 2.16 ns2.42 ns 6.18 ns2.10 ns 68732
collection: indexOfId()v3 67.4 ns68.4 ns 91.0 ns65.6 ns 2502
collection: indexOfId()gpu 36.0 ns36.7 ns 49.4 ns35.4 ns 4658
collection: removed() + inside() (2 calls)v3 17.2 ns17.7 ns 27.5 ns16.7 ns 9682
collection: removed() + inside() (2 calls)gpu 15.4 ns15.8 ns 18.9 ns15.2 ns 10797
collection: silentPositions( fn ) over 100v3 106 µs110 µs 160 µs103 µs 6347
collection: silentPositions( fn ) over 100gpu 3.03 µs3.04 µs 3.15 µs2.98 µs 52
collection: animated()v3 12.2 ns12.5 ns 20.6 ns11.7 ns 13629
collection: animated()gpu 4.19 ns4.35 ns 7.65 ns4.00 ns 38813
collection: delayAnimation()v3 450 ns581 ns 2.06 µs442 ns 286
collection: delayAnimation()gpu 168 ns173 ns 234 ns165 ns 952
collection: removeScratch()v3 1.80 µs1.81 µs 1.94 µs1.77 µs 88
collection: removeScratch()gpu 201 ns208 ns 393 ns200 ns 820
collection: component()v3 82.8 ms85.1 ms 96.3 ms78.5 ms 12
collection: component()gpu 1.98 ms2.09 ms 3.19 ms1.91 ms 330
collection: layoutDimensions()v3 613 ns627 ns 847 ns590 ns 269
collection: layoutDimensions()gpu 170 ns176 ns 319 ns165 ns 968
degree: maxIndegree + minOutdegree (2 calls)v3 9.27 ms10.1 ms 14.2 ms8.94 ms 66
degree: maxIndegree + minOutdegree (2 calls)gpu 428 µs447 µs 698 µs414 µs 1557
flags: grabbed + hidden + inactive (3 calls)v3 86.5 ns87.1 ns 100 ns82.3 ns 1962
flags: grabbed + hidden + inactive (3 calls)gpu 42.7 ns44.3 ns 86.8 ns41.0 ns 3860
curves: renderedSegmentPointsgpu 36.1 ns37.0 ns 55.1 ns34.8 ns 4629
layout contract: edgeSlots + endpoints + degreeOfgpu 34.7 µs36.7 µs 64.1 µs29.8 µs 18758
formats: isColumnarElements + isSerializedElements + isPackedIdsgpu 4.61 ns4.75 ns 8.20 ns4.60 ns 35671

compaction N=20,000 · 18.5 s

cpu pick: background miss (full highWater walk) — peak
221 µs
cpu pick: background miss (full highWater walk) — compacted
51.0 µs
cpu pick: node hit — peak
226 µs
cpu pick: node hit — compacted
49.7 µs
isCurrent: current ref (forwards present vs absent) — no forwards (peak)
5.92 ns
isCurrent: current ref (forwards present vs absent) — forwards present (compacted)
5.95 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — current (baseline alloc)
8.80 ns
isCurrent: stale-ref repair (chase + rewrite, alloc included) — stale → repair
49.3 ns
control: nodes({ selected }) scan (order-list, expected parity) — peak
24.8 µs
control: nodes({ selected }) scan (order-list, expected parity) — compacted
21.3 µs
control: whole-graph boundingBox (expected parity) — peak
96.3 µs
control: whole-graph boundingBox (expected parity) — compacted
95.5 µs
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
cpu pick: background miss (full highWater walk)peak 221 µs225 µs 269 µs221 µs 3125
cpu pick: background miss (full highWater walk)compacted 51.0 µs51.2 µs 51.7 µs49.9 µs 12
cpu pick: node hitpeak 226 µs230 µs 292 µs221 µs 3058
cpu pick: node hitcompacted 49.7 µs50.0 µs 50.3 µs49.2 µs 12
isCurrent: current ref (forwards present vs absent)no forwards (peak) 5.92 ns6.10 ns 10.0 ns5.74 ns 27793
isCurrent: current ref (forwards present vs absent)forwards present (compacted) 5.95 ns6.11 ns 9.72 ns5.74 ns 27744
isCurrent: stale-ref repair (chase + rewrite, alloc included)current (baseline alloc) 8.80 ns9.43 ns 21.7 ns8.38 ns 17900
isCurrent: stale-ref repair (chase + rewrite, alloc included)stale → repair 49.3 ns51.0 ns 72.6 ns48.8 ns 3352
control: nodes({ selected }) scan (order-list, expected parity)peak 24.8 µs26.3 µs 31.1 µs21.4 µs 12
control: nodes({ selected }) scan (order-list, expected parity)compacted 21.3 µs22.0 µs 24.5 µs20.6 µs 12
control: whole-graph boundingBox (expected parity)peak 96.3 µs102 µs 198 µs93.2 µs 6830
control: whole-graph boundingBox (expected parity)compacted 95.5 µs97.4 µs 140 µs92.6 µs 7166

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

parent drag (shift subtree + bb settle)
186×
child drag (move + parent re-derive)
51×
reparent round-trip
70×
1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
parent drag (shift subtree + bb settle)v3 253 µs285 µs 672 µs238 µs 2442
parent drag (shift subtree + bb settle)gpu 1.36 µs1.41 µs 2.16 µs1.32 µs 114
child drag (move + parent re-derive)v3 80.1 µs83.5 µs 127 µs75.3 µs 8216
child drag (move + parent re-derive)gpu 1.57 µs1.59 µs 1.72 µs1.54 µs 102
reparent round-tripv3 82.2 µs88.9 µs 155 µs79.8 µs 7744
reparent round-tripgpu 1.18 µs1.20 µs 1.58 µs1.13 µs 136

curves N=2,000 · 0.6 s

curve premium: build (style apply + derivation) — curved
25.7 ms
curve premium: build (style apply + derivation) — straight
22.6 ms
curve premium: node.position x 1000 (drag) — curved
589 µs
curve premium: node.position x 1000 (drag) — straight
253 µs
curve premium: nodes().positions() (bulk move) — curved
304 µs
curve premium: nodes().positions() (bulk move) — straight
297 µs
curve premium: first read after a bulk move (cold) — curved
7.56 ms
curve premium: first read after a bulk move (cold) — straight
2.99 ms
curve premium: same read again (warm) — curved
2.59 ms
curve premium: same read again (warm) — straight
1.64 ms
curve premium: edge.midpoint x 4000 — curved
1.89 ms
curve premium: edge.midpoint x 4000 — straight
3.01 ms
curve premium: edge.controlPoints x 4000 — curved
1.89 ms
curve premium: edge.controlPoints x 4000 — straight
1.11 ms
curve premium: cy.elements().boundingBox() x 20 — curved
35.1 ms
curve premium: cy.elements().boundingBox() x 20 — straight
21.9 ms
curve premium: cy.fit() x 20 (store scan) — curved
3.94 ms
curve premium: cy.fit() x 20 (store scan) — straight
3.58 ms
curve premium: elementsInBox x 20 (half the graph) — curved
23.7 ms
curve premium: elementsInBox x 20 (half the graph) — straight
5.86 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — curved
3.98 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — straight
2.14 ms
100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
curve premium: build (style apply + derivation)curved 25.7 ms25.7 ms 25.7 ms25.7 ms 1
curve premium: build (style apply + derivation)straight 22.6 ms22.6 ms 22.6 ms22.6 ms 1
curve premium: node.position x 1000 (drag)curved 589 µs589 µs 589 µs589 µs 1
curve premium: node.position x 1000 (drag)straight 253 µs253 µs 253 µs253 µs 1
curve premium: nodes().positions() (bulk move)curved 304 µs304 µs 304 µs304 µs 1
curve premium: nodes().positions() (bulk move)straight 297 µs297 µs 297 µs297 µs 1
curve premium: first read after a bulk move (cold)curved 7.56 ms7.56 ms 7.56 ms7.56 ms 1
curve premium: first read after a bulk move (cold)straight 2.99 ms2.99 ms 2.99 ms2.99 ms 1
curve premium: same read again (warm)curved 2.59 ms2.59 ms 2.59 ms2.59 ms 1
curve premium: same read again (warm)straight 1.64 ms1.64 ms 1.64 ms1.64 ms 1
curve premium: edge.midpoint x 4000curved 1.89 ms1.89 ms 1.89 ms1.89 ms 1
curve premium: edge.midpoint x 4000straight 3.01 ms3.01 ms 3.01 ms3.01 ms 1
curve premium: edge.controlPoints x 4000curved 1.89 ms1.89 ms 1.89 ms1.89 ms 1
curve premium: edge.controlPoints x 4000straight 1.11 ms1.11 ms 1.11 ms1.11 ms 1
curve premium: cy.elements().boundingBox() x 20curved 35.1 ms35.1 ms 35.1 ms35.1 ms 1
curve premium: cy.elements().boundingBox() x 20straight 21.9 ms21.9 ms 21.9 ms21.9 ms 1
curve premium: cy.fit() x 20 (store scan)curved 3.94 ms3.94 ms 3.94 ms3.94 ms 1
curve premium: cy.fit() x 20 (store scan)straight 3.58 ms3.58 ms 3.58 ms3.58 ms 1
curve premium: elementsInBox x 20 (half the graph)curved 23.7 ms23.7 ms 23.7 ms23.7 ms 1
curve premium: elementsInBox x 20 (half the graph)straight 5.86 ms5.86 ms 5.86 ms5.86 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)curved 3.98 ms3.98 ms 3.98 ms3.98 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)straight 2.14 ms2.14 ms 2.14 ms2.14 ms 1

arrows N=2,000 · 3.3 s

arrow premium: build (style apply + arrow fold) — arrowed
26.7 ms
arrow premium: build (style apply + arrow fold) — none
21.0 ms
arrow premium: cy.style() re-apply x 4 — arrowed
40.8 ms
arrow premium: cy.style() re-apply x 4 — none
39.6 ms
arrow premium: node.position x 200000 (drag) — arrowed
24.5 ms
arrow premium: node.position x 200000 (drag) — none
24.9 ms
arrow premium: edge.sourceEndpoint x 200000 — arrowed
61.7 ms
arrow premium: edge.sourceEndpoint x 200000 — none
59.8 ms
arrow premium: edge.targetEndpoint x 200000 — arrowed
60.8 ms
arrow premium: edge.targetEndpoint x 200000 — none
60.3 ms
arrow premium: edge.midpoint x 200000 — arrowed
151 ms
arrow premium: edge.midpoint x 200000 — none
155 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — arrowed
35.7 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — none
30.9 ms
arrow premium: cy.elements().boundingBox() x 20 — arrowed
21.6 ms
arrow premium: cy.elements().boundingBox() x 20 — none
21.7 ms
arrow premium: elementsInBox x 20 (half the graph) — arrowed
5.61 ms
arrow premium: elementsInBox x 20 (half the graph) — none
5.58 ms
arrow premium: control: sourceEndpoint, bezier vs straight — arrowed
76.0 ms
arrow premium: control: sourceEndpoint, bezier vs straight — none
60.6 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 26.7 ms26.7 ms 26.7 ms26.7 ms 1
arrow premium: build (style apply + arrow fold)none 21.0 ms21.0 ms 21.0 ms21.0 ms 1
arrow premium: cy.style() re-apply x 4arrowed 40.8 ms40.8 ms 40.8 ms40.8 ms 1
arrow premium: cy.style() re-apply x 4none 39.6 ms39.6 ms 39.6 ms39.6 ms 1
arrow premium: node.position x 200000 (drag)arrowed 24.5 ms24.5 ms 24.5 ms24.5 ms 1
arrow premium: node.position x 200000 (drag)none 24.9 ms24.9 ms 24.9 ms24.9 ms 1
arrow premium: edge.sourceEndpoint x 200000arrowed 61.7 ms61.7 ms 61.7 ms61.7 ms 1
arrow premium: edge.sourceEndpoint x 200000none 59.8 ms59.8 ms 59.8 ms59.8 ms 1
arrow premium: edge.targetEndpoint x 200000arrowed 60.8 ms60.8 ms 60.8 ms60.8 ms 1
arrow premium: edge.targetEndpoint x 200000none 60.3 ms60.3 ms 60.3 ms60.3 ms 1
arrow premium: edge.midpoint x 200000arrowed 151 ms151 ms 151 ms151 ms 1
arrow premium: edge.midpoint x 200000none 155 ms155 ms 155 ms155 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000arrowed 35.7 ms35.7 ms 35.7 ms35.7 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000none 30.9 ms30.9 ms 30.9 ms30.9 ms 1
arrow premium: cy.elements().boundingBox() x 20arrowed 21.6 ms21.6 ms 21.6 ms21.6 ms 1
arrow premium: cy.elements().boundingBox() x 20none 21.7 ms21.7 ms 21.7 ms21.7 ms 1
arrow premium: elementsInBox x 20 (half the graph)arrowed 5.61 ms5.61 ms 5.61 ms5.61 ms 1
arrow premium: elementsInBox x 20 (half the graph)none 5.58 ms5.58 ms 5.58 ms5.58 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightarrowed 76.0 ms76.0 ms 76.0 ms76.0 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightnone 60.6 ms60.6 ms 60.6 ms60.6 ms 1
arrow premium: edge column bytesB/edge 156 ms156 ms 156 ms156 ms 1

labels N=20,000 · 0.5 s

labels: breakLines x 20000 — gpu
78.8 ms
labels: estimateBlock x 20000 — gpu
89.0 ms
labels: addNode x 20000 — gpu
29.2 ms
labels: setLabel (build) x 20000 — gpu
110 ms
labels: setLabel (rewrite) x 20000 — gpu
101 ms
labels: boundingBox with 20000 label terms — gpu
3.20 ms
1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
labels: breakLines x 20000gpu 78.8 ms78.8 ms 78.8 ms78.8 ms 1
labels: estimateBlock x 20000gpu 89.0 ms89.0 ms 89.0 ms89.0 ms 1
labels: addNode x 20000gpu 29.2 ms29.2 ms 29.2 ms29.2 ms 1
labels: setLabel (build) x 20000gpu 110 ms110 ms 110 ms110 ms 1
labels: setLabel (rewrite) x 20000gpu 101 ms101 ms 101 ms101 ms 1
labels: boundingBox with 20000 label termsgpu 3.20 ms3.20 ms 3.20 ms3.20 ms 1

transitions N=2,000 · 9.5 s

transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions off
2.21 ms
transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions on
4.54 ms
transition: bulk tween tick (2000 slots, one manager tick) — tick
127 µs
transition: explicit-domain write (O(changed) — one element) — transitions off
2.35 µs
transition: explicit-domain write (O(changed) — one element) — transitions on
6.15 µs
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions off
9.97 ms
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions on
13.0 ms
1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions off 2.21 ms2.31 ms 4.36 ms2.15 ms 297
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions on 4.54 ms4.84 ms 7.87 ms4.24 ms 138
transition: bulk tween tick (2000 slots, one manager tick)tick 127 µs131 µs 207 µs123 µs 5329
transition: explicit-domain write (O(changed) — one element)transitions off 2.35 µs2.43 µs 3.41 µs2.29 µs 65
transition: explicit-domain write (O(changed) — one element)transitions on 6.15 µs6.06 µs 6.85 µs4.96 µs 24
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions off 9.97 ms10.0 ms 11.4 ms9.64 ms 65
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions on 13.0 ms12.9 ms 15.7 ms11.3 ms 50

geometry-tween N=2,000 · 11.1 s

size tick: unlabelled (2000 slots) — tick
589 µs
size tick: labelled, center/center (re-anchor early-out) (2000 slots) — tick
636 µs
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots) — tick
1.26 ms
edge width tick (4000 slots) — bare
297 µs
edge width tick (4000 slots) — with rides (casing + match-line arrows)
706 µs
padding tick + auto-bounds flush (250 parents × 8 children) — tick + flush
179 µs
font-size tick (2000 labels) — wrap none (dims scale-patch)
359 µs
font-size tick (2000 labels) — wrapped (re-break per tick)
5.69 ms
baseline: paint (opacity) tick (2000 slots) — tick
142 µs
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
size tick: unlabelled (2000 slots)tick 589 µs611 µs 930 µs582 µs 1121
size tick: labelled, center/center (re-anchor early-out) (2000 slots)tick 636 µs675 µs 1.25 ms617 µs 1037
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots)tick 1.26 ms1.34 ms 2.34 ms1.13 ms 502
edge width tick (4000 slots)bare 297 µs306 µs 442 µs293 µs 2276
edge width tick (4000 slots)with rides (casing + match-line arrows) 706 µs718 µs 863 µs686 µs 971
padding tick + auto-bounds flush (250 parents × 8 children)tick + flush 179 µs187 µs 383 µs173 µs 3738
font-size tick (2000 labels)wrap none (dims scale-patch) 359 µs400 µs 921 µs341 µs 1728
font-size tick (2000 labels)wrapped (re-break per tick) 5.69 ms5.77 ms 6.41 ms5.46 ms 116
baseline: paint (opacity) tick (2000 slots)tick 142 µs148 µs 261 µs138 µs 4726