Cytoscape.js GPU benchmarks

v4 (src/) vs v3 (v3/src/) · Mitata · times are per-iteration p50 · 2026-09-02 02:03 · 9ed49abc (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)
Commit9ed49abc
docs(113): the performance review recorded — what the sweep measured and what it fixed
Machine id5cf3f79c
Median speedup (geo-mean) 11× 269 v3-vs-gpu comparisons
Biggest win 283798× sweep: edges() @ N=2k
v3 still ahead 0 comparisons
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
283798×
sweep: nodes() @ 2k
169915×
core: edges() @ 2k
93566×
core: nodes() @ 2k
52815×
sweep: elements() @ 2k
29159×
core: elements() @ 2k
20919×
core: graph scratch() set + get (v3 restyles the graph) @ 2k
16146×
core: removeScratch() @ 2k
9890×
core: graph data() set + get (v3 restyles the graph) @ 2k
8660×
compare: same() @ 2k
8169×
trav: successors() @ 2k
735×
trav: predecessors() @ 2k
725×
mut-bulk: hide + show @ 2k
264×
flags: show + hide + visible @ 2k
228×
parent drag (shift subtree + bb settle) @ 2k
183×
compound: commonAncestors @ 2k
121×
degree: nodes.totalDegree() @ 2k
112×
viewport: reset() @ 2k
107×
mut-bulk: shift @ 2k
105×
flags: panify + unpanify + pannable @ 2k
94×
flags: selectify + unselectify + selectable @ 2k
94×
flags: grabify + ungrabify + grabbable @ 2k
94×
flags: lock + unlock + locked @ 2k
93×
degree: nodes.maxDegree() @ 2k
92×
layout: grid @ 2k
86×
core: options() @ 2k
85×
degree: node.degree() @ 2k
85×
reparent round-trip @ 2k
77×
degree: indegree + outdegree (2 calls) @ 2k
75×
collection: same + anySame + contains (3 calls) @ 2k
71×
algo: closenessCentrality (one root) @ 2k
71×
algo: pageRank (20 iters) @ 500
70×
algo: closenessCentrality (one root) @ 500
68×
mut-bulk: positions(obj) @ 2k
62×
algo: bfs (whole graph) @ 500
61×
dimensions: shift + silentShift (round-trip) @ 2k
60×
sweep: nodes(":selected") vs nodes({selected}) @ 2k
59×
algo: bfs (whole graph) @ 2k
58×
algo: dfs (whole graph) @ 2k
58×
viewport: viewport({ zoom, pan }) @ 2k
57×
algo: dfs (whole graph) @ 500
57×
algo: dijkstra + pathTo @ 2k
57×
mut-bulk: lock + unlock @ 2k
53×
algo: closenessCentrality (weighted, one root) @ 500
52×
algo: dijkstra + pathTo @ 500
51×
dimensions: positions( fn ) over 100 @ 2k
51×
child drag (move + parent re-derive) @ 2k
50×
degree: minDegree + maxDegree (2 calls) @ 2k
44×
collection: component() @ 2k
43×
traverse: components() @ 2k
41×
algo: degreeCentralityNormalized @ 2k
37×
layout: preset (fn form) @ 2k
37×
algo: degreeCentralityNormalized @ 500
37×
sweep: selected nodes ($("node:selected") vs filter({group, selected})) @ 2k
36×
algo: tarjan SCC @ 500
35×
query: structural, parents (:parent vs { parent: true }) @ 2k
35×
algo: degreeCentrality (one root) @ 500
35×
algo: tarjan SCC @ 2k
34×
algo: degreeCentrality (one root) @ 2k
34×
bounds: getFitViewport() (compute without committing) @ 2k
33×
bounds: cy.fit() (whole-graph scan) @ 2k
33×
query: structural, orphans (:orphan vs { child: false }) @ 2k
32×
layout: breadthfirst @ 2k
31×
collection: silentPositions( fn ) over 100 @ 2k
30×
collection: intersection @ 2k
29×
collection: difference @ 2k
29×
algo: kruskal @ 2k
29×
scn: select-all + fit (listeners on) @ 2k
27×
load: init from the definition form (construct + dispose) @ 2k
26×
emit: position write, no listeners @ 2k
26×
algo: kruskal @ 500
26×
set: difference() @ 2k
25×
degree: minIndegree + maxOutdegree (2 calls) @ 2k
25×
degree: maxIndegree + minOutdegree (2 calls) @ 2k
25×
set: intersection() @ 2k
25×
algo: hopcroft-tarjan biconnected @ 500
25×
core: id lookup ($("#id") vs $id()) @ 2k
25×
trav: band roots() @ 2k
24×
algo: hopcroft-tarjan biconnected @ 2k
24×
mut-bulk: positions(fn) @ 2k
23×
mut: position set @ 2k
23×
algo: bellmanFord @ 500
22×
data: bulk write, numeric column @ 2k
21×
data: bulk write, object column (plain-array fallback) @ 2k
20×
algo: bellmanFord @ 2k
19×
core: add + remove @ 2k
19×
viewport: center( eles ) @ 2k
19×
layout: preset @ 2k
19×
data: bulk write, one new dictionary entry per pass @ 2k
17×
data: bulk write, dictionary string column (4 values) @ 2k
17×
flags: select + unselect + selected (band) @ 2k
16×
dimensions: silentPosition @ 2k
16×
scn: drag (select band of 100 + 8-step shift, position listener) @ 2k
16×
layout: concentric @ 2k
16×
flags: active/activate/unactivate (3 calls) @ 2k
16×
query: membership ([bucket in ...] vs { in }) @ 2k
16×
viewport: minZoom/maxZoom get (2 calls) @ 2k
15×
collection: absoluteComplement @ 2k
15×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } }) @ 2k
14×
core: selected ($(":selected") vs filter({selected})) @ 2k
14×
traversal: roots + leaves (2 calls) @ 2k
13×
style: renderedStyle (one prop) @ 2k
13×
query: structural, childless (:childless vs { parent: false }) @ 2k
13×
mut-bulk: data set @ 2k
13×
sweep: selected ($(":selected") vs filter({selected})) @ 2k
13×
algo: betweennessCentrality (unweighted) @ 500
13×
dimensions: padding + paddedWidth + paddedHeight (3 calls) @ 2k
12×
query: two keys AND-ed @ 2k
12×
collection: toArray() @ 2k
12×
dimensions: relativePosition get @ 2k
12×
algo: fuzzyCMeans @ 500
11×
algo: betweennessCentrality (unweighted) @ 2k
11×
query: data comparison ([weight > 3] vs { gt }) @ 2k
11×
core: batch + per-id data() (was batchData, round 90) @ 2k
9.5×
emit: 1 core listener @ 2k
8.9×
collection: removeScratch() @ 2k
8.8×
core: removeAllListeners() @ 2k
8.7×
algo: betweennessCentrality (weighted) @ 500
8.7×
sweep: all nodes ($("node") vs filter({group})) @ 2k
8.6×
algo: hierarchicalClustering (threshold) @ 500
8.3×
emit: delegated (v3 selector vs v4 predicate) @ 2k
8.2×
mut-bulk: select + unselect @ 2k
8.1×
layout: random @ 2k
8.1×
scn: explore (expand 2-hop + select + fit) @ 2k
8.0×
emit: 1 element (ref-qualified) listener @ 2k
8.0×
query: predicate function (both sides) @ 2k
7.9×
data: removeData (whole collection) @ 2k
7.8×
algo: kMedoids @ 500
7.7×
element data: scratch get + set @ 2k
7.5×
layout: scope (eles.layout, 10% of nodes) @ 2k
7.5×
core: collection() @ 2k
7.2×
core: collection() @ 2k
7.2×
compound: orphans + nonorphans (2 calls) @ 2k
7.1×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners) @ 2k
6.8×
layout: circle @ 2k
6.8×
emit: 10 core listeners @ 2k
6.6×
mut-bulk: remove + re-add (256 nodes + cascade) @ 2k
6.6×
bounds: whole-graph boundingBox() @ 2k
6.4×
core: batch( fn ) (empty) @ 2k
6.3×
style: whole-object style() @ 2k
5.9×
core: startBatch + endBatch + batching @ 2k
5.9×
style: sheet swap (compile + applyAll) @ 2k
5.8×
style: bypass set + removeStyle round-trip @ 2k
5.7×
collection: union @ 2k
5.7×
sweep: filter(fn) @ 2k
5.3×
algo: affinityPropagation @ 500
5.3×
set: union() @ 2k
5.2×
traversal: allAreNeighbors @ 2k
5.2×
algo: hierholzer (directed) @ 500
5.2×
traverse: incomers() @ 2k
5.1×
trav: outgoers() @ 2k
5.1×
traverse: outgoers() @ 2k
5.1×
trav: band neighborhood() @ 2k
5.1×
compare: contains() @ 2k
5.0×
trav: incomers() @ 2k
4.9×
core: animated() @ 2k
4.8×
compound: children + descendants + siblings (3 calls) @ 2k
4.8×
core: nodes ($("node") vs filter({group})) @ 2k
4.7×
viewport: zoom() get @ 2k
4.7×
algo: kMeans (fixed centroids) @ 500
4.6×
collection: length + empty + nonempty (3 calls) @ 2k
4.5×
mut: select + unselect @ 2k
4.3×
core: filter(fn) @ 2k
4.2×
style: bypass set (ele.style name,value) @ 2k
4.1×
trav: neighborhood() @ 2k
3.9×
viewport: width() + height() + size() (3 calls) @ 2k
3.8×
collection: symmetricDifference @ 2k
3.8×
traverse: neighborhood() @ 2k
3.7×
compound: parent + parents + ancestors (3 calls) @ 2k
3.6×
algo: aStar @ 500
3.5×
collection: cy() @ 2k
3.5×
traversal: sources + targets (2 calls) @ 2k
3.4×
algo: aStar @ 2k
3.4×
traversal: connectedNodes @ 2k
3.3×
traversal: parallelEdges + codirectedEdges (2 calls) @ 2k
3.3×
collection: layoutDimensions() @ 2k
3.3×
collection: diff @ 2k
3.1×
collection: byGroup @ 2k
3.1×
flags: takesUpSpace + interactive + transparent (3 calls) @ 2k
3.0×
anim: start + stop, 512-node collection @ 2k
2.9×
collection: animated() @ 2k
2.9×
traversal: openNeighborhood + closedNeighborhood (2 calls) @ 2k
2.9×
algo: hierholzer (directed) @ 2k
2.9×
anim: viewport animate + stop @ 2k
2.9×
trav: band connectedNodes() @ 2k
2.8×
trav: closedNeighborhood() @ 2k
2.8×
traverse: connectedEdges() @ 2k
2.8×
collection: delayAnimation() @ 2k
2.8×
core: window() @ 2k
2.8×
dimensions: rendered dims (4 calls) @ 2k
2.8×
style: numericStyle @ 2k
2.7×
core: container() @ 2k
2.7×
load: cy.json() @ 2k
2.6×
mut: data set @ 2k
2.6×
traversal: isLoop + isSimple (2 calls) @ 2k
2.6×
trav: connectedEdges() @ 2k
2.6×
dimensions: width + height + outerWidth + outerHeight (4 calls) @ 2k
2.5×
core: resize() / invalidateSize() @ 2k
2.5×
algo: closenessCentralityNormalized @ 500
2.5×
iter: map() @ 2k
2.4×
core: on('render') + off('render') (was onRender/offRender, round 90) @ 2k
2.4×
collection: is (none match: the full walk) @ 2k
2.3×
flags: effectiveOpacity @ 2k
2.3×
core: zoom set @ 2k
2.3×
dimensions: renderedPosition get @ 2k
2.3×
data: read the whole object @ 2k
2.3×
collection: slice() @ 2k
2.3×
core: destroyed() @ 2k
2.2×
core: isReady() @ 2k
2.2×
flags: grabbed + hidden + inactive (3 calls) @ 2k
2.2×
emit: on() + off() round-trip @ 2k
2.1×
style: read one prop (width) @ 2k
2.1×
iter: filter(fn) @ 2k
2.1×
collection: min + max ( fn ) (2 calls) @ 2k
2.0×
element data: json() one element @ 2k
2.0×
element data: jsons() over 100 @ 2k
2.00×
core: selectionType get @ 2k
1.99×
dimensions: renderedBoundingBox @ 2k
1.92×
style: first apply on add (256-node band) @ 2k
1.89×
json: element @ 2k
1.88×
core: gating setters round-trip (autolock/autoungrabify/autounselectify) @ 2k
1.87×
viewport: zoom( n ) set @ 2k
1.86×
collection: eq/first/last (3 calls) @ 2k
1.83×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener) @ 2k
1.81×
viewport: pan( p ) set @ 2k
1.80×
collection: element accessors (id/group/isNode/isEdge, 4 calls) @ 2k
1.77×
style: read one prop (color) @ 2k
1.76×
algo: floydWarshall @ 500
1.76×
collection: indexOfId() @ 2k
1.75×
style( 'text-max-width' ) (was #74 in the switch) @ 2k
1.73×
style( 'text-wrap' ) (was #73 in the switch) @ 2k
1.72×
viewport: panBy() @ 2k
1.71×
viewport: renderedExtent() @ 2k
1.65×
bounds: one node boundingBox() @ 2k
1.63×
position: get @ 2k
1.61×
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.57×
collection: sort( fn ) @ 2k
1.57×
viewport: extent() @ 2k
1.55×
trav: band sources() @ 2k
1.49×
collection: allAre (all match: the full walk) @ 2k
1.48×
compound: isParent/isChild/isChildless/isOrphan (4 calls) @ 2k
1.48×
trav: band connectedEdges() @ 2k
1.47×
viewport: pan() get @ 2k
1.41×
collection: reduce( fn ) @ 2k
1.38×
collection: indexOf @ 2k
1.35×
style( 'target-distance-from-node' ) (was #150 in the switch) @ 2k
1.35×
data: read one string key (dictionary decode) @ 2k
1.34×
anim: start + stop, one element @ 2k
1.31×
core: pan() get (x32) @ 2k
1.30×
traversal: source() + target() (2 calls) @ 2k
1.28×
traversal: edgesTo @ 2k
1.28×
data: read one numeric key @ 2k
1.27×
style( 'taxi-radius' ) (was #142 in the switch) @ 2k
1.25×
traversal: edgesWith @ 2k
1.25×
core: instanceString + headless + styleEnabled (3 calls) @ 2k
1.25×
core: hasElementWithId + hasCompoundNodes (2 calls) @ 2k
1.18×
collection: removed() + inside() (2 calls) @ 2k
1.17×
core: gating getters (5 calls) @ 2k
1.16×
style( 'background-color' ) (was #4 in the switch) @ 2k
1.13×
core: extent() @ 2k
1.13×
style( 'border-width' ) (was #6 in the switch) @ 2k
1.11×
algo: markovClustering @ 500
1.10×
iter: forEach() @ 2k
1.06×
algo: kargerStein @ 500
1.05×
core: getElementById() @ 2k
1.04×
core: elements() memo hit (was mutableElements, round 90) @ 2k
1.02×
data: get @ 2k
1.02×
10×100×1000×10000×100000×1000000×

Scaling speedup vs graph size

algorithms

group× @ N=500× @ N=2k
algo: bfs (whole graph)61×58×
algo: dfs (whole graph)57×58×
algo: dijkstra + pathTo51×57×
algo: aStar3.5×3.4×
algo: bellmanFord22×19×
algo: kruskal26×29×
algo: tarjan SCC35×34×
algo: hopcroft-tarjan biconnected25×24×
algo: hierholzer (directed)5.2×2.9×
algo: betweennessCentrality (unweighted)13×11×
algo: degreeCentralityNormalized37×37×
algo: closenessCentrality (one root)68×71×
algo: degreeCentrality (one root)35×34×
algo: pageRank (20 iters)70×
algo: closenessCentrality (weighted, one root)52×
algo: floydWarshall1.76×
algo: closenessCentralityNormalized2.5×
algo: markovClustering1.10×
algo: hierarchicalClustering (threshold)8.3×
algo: kMeans (fixed centroids)4.6×
algo: kMedoids7.7×
algo: fuzzyCMeans11×
algo: affinityPropagation5.3×
algo: kargerStein1.05×
algo: betweennessCentrality (weighted)8.7×

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

core: getElementById()
1.04×
core: id lookup ($("#id") vs $id())
25×
core: nodes()
52815×
core: edges()
93566×
core: elements()
20919×
core: nodes ($("node") vs filter({group}))
4.7×
core: selected ($(":selected") vs filter({selected}))
14×
core: filter(fn)
4.2×
core: collection()
7.2×
core: pan() get (x32)
1.30×
core: extent()
1.13×
core: add + remove
19×
core: zoom set
2.3×
traverse: neighborhood()
3.7×
traverse: connectedEdges()
2.8×
traverse: outgoers()
5.1×
traverse: incomers()
5.1×
traverse: components()
41×
degree: node.degree()
85×
degree: nodes.totalDegree()
112×
degree: nodes.maxDegree()
92×
data: get
1.02×
position: get
1.61×
json: element
1.88×
set: union()
5.2×
set: intersection()
25×
set: difference()
25×
iter: map()
2.4×
iter: forEach()
1.06×
iter: filter(fn)
2.1×
compare: same()
8169×
compare: contains()
5.0×
mut: data set
2.6×
mut: position set
23×
mut: select + unselect
4.3×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
core: getElementById()v3 93.4 ns97.4 ns 167 ns90.9 ns 1761
core: getElementById()gpu 90.1 ns93.9 ns 157 ns87.8 ns 1823
core: id lookup ($("#id") vs $id())v3 2.09 µs2.46 µs 3.96 µs2.00 µs 64
core: id lookup ($("#id") vs $id())gpu 84.6 ns87.3 ns 159 ns81.5 ns 1958
core: nodes()v3 418 µs426 µs 556 µs409 µs 1643
core: nodes()gpu 7.92 ns8.42 ns 17.6 ns7.46 ns 20201
core: edges()v3 723 µs742 µs 922 µs701 µs 942
core: edges()gpu 7.73 ns8.25 ns 16.6 ns7.51 ns 20620
core: elements()v3 145 µs152 µs 264 µs141 µs 4596
core: elements()gpu 6.94 ns7.28 ns 23.8 ns6.49 ns 23343
core: nodes ($("node") vs filter({group}))v3 539 µs575 µs 1.25 ms531 µs 1212
core: nodes ($("node") vs filter({group}))gpu 114 µs119 µs 260 µs84.9 µs 5761
core: selected ($(":selected") vs filter({selected}))v3 349 µs370 µs 651 µs334 µs 1880
core: selected ($(":selected") vs filter({selected}))gpu 25.8 µs26.5 µs 26.8 µs25.1 µs 12
core: filter(fn)v3 421 µs434 µs 561 µs409 µs 1609
core: filter(fn)gpu 99.9 µs106 µs 348 µs96.5 µs 6557
core: collection()v3 459 ns578 ns 1.83 µs447 ns 290
core: collection()gpu 63.6 ns67.8 ns 180 ns60.9 ns 2468
core: pan() get (x32)v3 44.5 ns46.3 ns 58.0 ns42.4 ns 3641
core: pan() get (x32)gpu 34.3 ns36.3 ns 77.4 ns32.9 ns 4714
core: extent()v3 22.5 ns40.6 ns 163 ns21.4 ns 4157
core: extent()gpu 20.0 ns28.0 ns 111 ns18.6 ns 5960
core: add + removev3 127 µs132 µs 311 µs117 µs 5256
core: add + removegpu 6.57 µs7.57 µs 25.9 µs6.19 µs 85124
core: zoom setv3 1.35 µs1.37 µs 1.57 µs1.24 µs 120
core: zoom setgpu 585 ns602 ns 709 ns576 ns 273
traverse: neighborhood()v3 3.58 µs3.81 µs 4.51 µs3.41 µs 40
traverse: neighborhood()gpu 967 ns1.14 µs 2.23 µs941 ns 142
traverse: connectedEdges()v3 1.07 µs1.21 µs 2.04 µs1.04 µs 135
traverse: connectedEdges()gpu 383 ns412 ns 1.36 µs381 ns 408
traverse: outgoers()v3 2.41 µs2.62 µs 3.46 µs2.30 µs 61
traverse: outgoers()gpu 473 ns551 ns 2.03 µs435 ns 294
traverse: incomers()v3 2.37 µs2.57 µs 3.36 µs2.26 µs 62
traverse: incomers()gpu 461 ns576 ns 2.08 µs444 ns 281
traverse: components()v3 79.9 ms82.2 ms 88.8 ms76.4 ms 12
traverse: components()gpu 1.93 ms2.05 ms 3.55 ms1.87 ms 323
degree: node.degree()v3 3.50 µs3.93 µs 5.08 µs3.36 µs 40
degree: node.degree()gpu 41.3 ns43.0 ns 127 ns38.9 ns 3970
degree: nodes.totalDegree()v3 7.24 ms8.01 ms 11.4 ms6.72 ms 83
degree: nodes.totalDegree()gpu 64.9 µs66.6 µs 105 µs60.8 µs 10487
degree: nodes.maxDegree()v3 7.05 ms7.91 ms 12.2 ms6.77 ms 81
degree: nodes.maxDegree()gpu 76.4 µs80.2 µs 134 µs71.2 µs 8452
data: getv3 30.3 ns32.0 ns 62.0 ns28.8 ns 5336
data: getgpu 29.8 ns31.3 ns 49.5 ns28.8 ns 5469
position: getv3 35.2 ns36.6 ns 75.3 ns33.9 ns 4674
position: getgpu 21.9 ns25.3 ns 49.9 ns21.0 ns 6584
json: elementv3 300 ns394 ns 3.54 µs293 ns 423
json: elementgpu 160 ns165 ns 255 ns153 ns 985
set: union()v3 94.8 µs106 µs 164 µs91.9 µs 6388
set: union()gpu 18.1 µs18.7 µs 19.2 µs17.4 µs 12
set: intersection()v3 89.5 µs102 µs 156 µs86.5 µs 6637
set: intersection()gpu 3.59 µs3.62 µs 3.98 µs3.53 µs 42
set: difference()v3 90.0 µs100 µs 142 µs87.0 µs 6735
set: difference()gpu 3.55 µs3.58 µs 3.85 µs3.47 µs 42
iter: map()v3 27.4 µs28.9 µs 75.0 µs26.4 µs 23841
iter: map()gpu 11.5 µs11.6 µs 11.8 µs11.4 µs 11
iter: forEach()v3 3.51 µs3.78 µs 3.75 µs3.37 µs 36
iter: forEach()gpu 3.32 µs3.35 µs 3.53 µs3.25 µs 45
iter: filter(fn)v3 242 µs248 µs 316 µs237 µs 2822
iter: filter(fn)gpu 115 µs124 µs 199 µs109 µs 5600
compare: same()v3 121 µs124 µs 177 µs115 µs 5664
compare: same()gpu 14.8 ns15.4 ns 24.9 ns14.2 ns 11082
compare: contains()v3 6.22 µs6.24 µs 6.47 µs6.08 µs 24
compare: contains()gpu 1.24 µs1.26 µs 1.35 µs1.20 µs 130
mut: data setv3 617 ns636 ns 1.05 µs590 ns 264
mut: data setgpu 234 ns246 ns 430 ns228 ns 690
mut: position setv3 1.20 µs1.21 µs 1.34 µs1.16 µs 136
mut: position setgpu 52.3 ns55.2 ns 90.2 ns50.9 ns 3071
mut: select + unselectv3 2.53 µs2.71 µs 3.31 µs2.42 µs 58
mut: select + unselectgpu 596 ns603 ns 691 ns574 ns 271

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

sweep: nodes()
169915×
sweep: edges()
283798×
sweep: elements()
29159×
sweep: all nodes ($("node") vs filter({group}))
8.6×
sweep: selected ($(":selected") vs filter({selected}))
13×
sweep: selected nodes ($("node:selected") vs filter({group, selected}))
36×
sweep: nodes(":selected") vs nodes({selected})
59×
sweep: filter(fn)
5.3×
1 ns10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
sweep: nodes()v3 410 µs419 µs 496 µs397 µs 1673
sweep: nodes()gpu 2.41 ns2.48 ns 2.95 ns2.26 ns 66581
sweep: edges()v3 714 µs726 µs 830 µs679 µs 962
sweep: edges()gpu 2.52 ns2.62 ns 4.76 ns2.46 ns 63240
sweep: elements()v3 139 µs147 µs 248 µs135 µs 4727
sweep: elements()gpu 4.76 ns4.89 ns 8.99 ns4.55 ns 34553
sweep: all nodes ($("node") vs filter({group}))v3 546 µs569 µs 801 µs528 µs 1228
sweep: all nodes ($("node") vs filter({group}))gpu 63.2 µs76.4 µs 177 µs59.3 µs 9071
sweep: selected ($(":selected") vs filter({selected}))v3 339 µs354 µs 605 µs329 µs 1977
sweep: selected ($(":selected") vs filter({selected}))gpu 25.7 µs26.1 µs 26.2 µs25.5 µs 12
sweep: selected nodes ($("node:selected") vs filter({group, selected}))v3 325 µs334 µs 491 µs315 µs 2096
sweep: selected nodes ($("node:selected") vs filter({group, selected}))gpu 9.07 µs9.18 µs 9.47 µs9.04 µs 15
sweep: nodes(":selected") vs nodes({selected})v3 532 µs541 µs 776 µs510 µs 1292
sweep: nodes(":selected") vs nodes({selected})gpu 8.95 µs8.99 µs 9.11 µs8.88 µs 15
sweep: filter(fn)v3 407 µs417 µs 538 µs396 µs 1680
sweep: filter(fn)gpu 76.3 µs79.1 µs 129 µs74.5 µs 8830

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

mut-bulk: select + unselect
8.1×
mut-bulk: hide + show
264×
mut-bulk: lock + unlock
53×
mut-bulk: positions(obj)
62×
mut-bulk: positions(fn)
23×
mut-bulk: shift
105×
mut-bulk: data set
13×
mut-bulk: remove + re-add (256 nodes + cascade)
6.6×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
mut-bulk: select + unselectv3 2.12 ms2.19 ms 3.49 ms2.05 ms 303
mut-bulk: select + unselectgpu 261 µs270 µs 397 µs253 µs 2594
mut-bulk: hide + showv3 56.4 ms61.5 ms 72.6 ms55.3 ms 12
mut-bulk: hide + showgpu 214 µs219 µs 361 µs209 µs 3088
mut-bulk: lock + unlockv3 2.04 ms2.10 ms 3.44 ms1.95 ms 329
mut-bulk: lock + unlockgpu 38.3 µs38.7 µs 39.1 µs37.8 µs 12
mut-bulk: positions(obj)v3 2.28 ms2.34 ms 3.81 ms2.21 ms 294
mut-bulk: positions(obj)gpu 36.8 µs38.4 µs 67.1 µs34.7 µs 18007
mut-bulk: positions(fn)v3 3.36 ms3.53 ms 5.60 ms3.26 ms 194
mut-bulk: positions(fn)gpu 146 µs149 µs 201 µs141 µs 4616
mut-bulk: shiftv3 3.40 ms3.52 ms 4.96 ms3.27 ms 188
mut-bulk: shiftgpu 32.3 µs33.1 µs 55.1 µs30.8 µs 20547
mut-bulk: data setv3 871 µs902 µs 1.54 ms846 µs 770
mut-bulk: data setgpu 65.7 µs67.6 µs 118 µs62.9 µs 10161
mut-bulk: remove + re-add (256 nodes + cascade)v3 41.6 ms45.6 ms 53.3 ms40.4 ms 11
mut-bulk: remove + re-add (256 nodes + cascade)gpu 6.35 ms6.45 ms 7.51 ms5.65 ms 102

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

scn: explore (expand 2-hop + select + fit)
8.0×
scn: select-all + fit (listeners on)
27×
scn: drag (select band of 100 + 8-step shift, position listener)
16×
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)
6.8×
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)
1.81×
10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
scn: explore (expand 2-hop + select + fit)v3 297 µs349 µs 981 µs281 µs 1991
scn: explore (expand 2-hop + select + fit)gpu 37.3 µs43.2 µs 210 µs33.7 µs 15793
scn: select-all + fit (listeners on)v3 25.1 ms25.2 ms 27.0 ms23.3 ms 23
scn: select-all + fit (listeners on)gpu 931 µs977 µs 1.39 ms892 µs 688
scn: drag (select band of 100 + 8-step shift, position listener)v3 1.65 ms1.69 ms 2.17 ms1.60 ms 397
scn: drag (select band of 100 + 8-step shift, position listener)gpu 102 µs109 µs 348 µs97.5 µs 6361
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)v3 44.6 ms44.5 ms 46.5 ms42.8 ms 11
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners)gpu 6.53 ms6.78 ms 8.84 ms5.96 ms 97
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)v3 7.50 ms7.56 ms 9.27 ms6.72 ms 84
scn: refresh (bulk data write + mapped labels + filter + fit, data listener)gpu 4.13 ms4.26 ms 7.01 ms3.70 ms 152

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

trav: neighborhood()
3.9×
trav: closedNeighborhood()
2.8×
trav: connectedEdges()
2.6×
trav: outgoers()
5.1×
trav: incomers()
4.9×
trav: successors()
735×
trav: predecessors()
725×
trav: band neighborhood()
5.1×
trav: band connectedEdges()
1.47×
trav: band roots()
24×
trav: band sources()
1.49×
trav: band connectedNodes()
2.8×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
trav: neighborhood()v3 3.94 µs4.05 µs 5.30 µs3.46 µs 38
trav: neighborhood()gpu 1.01 µs1.06 µs 2.00 µs825 ns 156
trav: closedNeighborhood()v3 5.83 µs5.68 µs 6.16 µs5.17 µs 26
trav: closedNeighborhood()gpu 2.09 µs2.24 µs 2.84 µs2.03 µs 72
trav: connectedEdges()v3 991 ns1.10 µs 1.91 µs939 ns 151
trav: connectedEdges()gpu 388 ns404 ns 663 ns378 ns 419
trav: outgoers()v3 2.26 µs2.42 µs 3.03 µs2.18 µs 66
trav: outgoers()gpu 441 ns522 ns 2.01 µs438 ns 318
trav: incomers()v3 2.29 µs2.43 µs 2.95 µs2.23 µs 66
trav: incomers()gpu 466 ns544 ns 2.02 µs441 ns 303
trav: successors()v3 432 ms438 ms 452 ms429 ms 12
trav: successors()gpu 587 µs617 µs 1.75 ms574 µs 1103
trav: predecessors()v3 434 ms435 ms 443 ms428 ms 12
trav: predecessors()gpu 598 µs625 µs 1.82 ms576 µs 1090
trav: band neighborhood()v3 187 µs201 µs 308 µs179 µs 3473
trav: band neighborhood()gpu 37.0 µs37.4 µs 38.7 µs36.0 µs 12
trav: band connectedEdges()v3 24.5 µs24.7 µs 24.9 µs23.3 µs 12
trav: band connectedEdges()gpu 16.7 µs17.1 µs 19.6 µs16.0 µs 12
trav: band roots()v3 109 µs118 µs 175 µs105 µs 5870
trav: band roots()gpu 4.49 µs4.50 µs 4.64 µs4.41 µs 34
trav: band sources()v3 6.51 µs6.52 µs 6.77 µs6.19 µs 22
trav: band sources()gpu 4.38 µs4.43 µs 4.81 µs4.27 µs 34
trav: band connectedNodes()v3 14.1 µs14.7 µs 15.5 µs13.9 µs 12
trav: band connectedNodes()gpu 4.97 µs5.03 µs 5.34 µs4.87 µs 30

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

algo: bfs (whole graph)
58×
algo: dfs (whole graph)
58×
algo: dijkstra + pathTo
57×
algo: aStar
3.4×
algo: bellmanFord
19×
algo: kruskal
29×
algo: tarjan SCC
34×
algo: hopcroft-tarjan biconnected
24×
algo: hierholzer (directed)
2.9×
algo: betweennessCentrality (unweighted)
11×
algo: degreeCentralityNormalized
37×
algo: closenessCentrality (one root)
71×
algo: degreeCentrality (one root)
34×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 51.4 ms53.5 ms 59.5 ms49.7 ms 9
algo: bfs (whole graph)gpu 879 µs908 µs 1.36 ms868 µs 766
algo: dfs (whole graph)v3 48.8 ms49.0 ms 49.9 ms48.3 ms 10
algo: dfs (whole graph)gpu 836 µs850 µs 1.16 ms800 µs 817
algo: dijkstra + pathTov3 52.1 ms52.3 ms 53.0 ms51.6 ms 10
algo: dijkstra + pathTogpu 920 µs934 µs 1.16 ms888 µs 745
algo: aStarv3 1.64 ms1.68 ms 2.50 ms1.57 ms 411
algo: aStargpu 483 µs495 µs 639 µs466 µs 1412
algo: bellmanFordv3 227 ms225 ms 248 ms205 ms 12
algo: bellmanFordgpu 11.7 ms11.8 ms 12.3 ms11.6 ms 56
algo: kruskalv3 13.2 ms14.1 ms 17.2 ms12.8 ms 45
algo: kruskalgpu 461 µs482 µs 953 µs452 µs 1448
algo: tarjan SCCv3 22.9 ms24.1 ms 30.0 ms21.1 ms 25
algo: tarjan SCCgpu 667 µs791 µs 5.37 ms598 µs 875
algo: hopcroft-tarjan biconnectedv3 84.8 ms86.0 ms 87.9 ms81.2 ms 12
algo: hopcroft-tarjan biconnectedgpu 3.53 ms3.67 ms 4.81 ms3.45 ms 185
algo: hierholzer (directed)v3 22.3 ms23.2 ms 25.6 ms21.5 ms 26
algo: hierholzer (directed)gpu 7.76 ms7.84 ms 9.20 ms7.46 ms 80
algo: betweennessCentrality (unweighted)v3 4.07 s4.08 s 4.12 s4.04 s 12
algo: betweennessCentrality (unweighted)gpu 358 ms371 ms 433 ms338 ms 12
algo: degreeCentralityNormalizedv3 14.6 ms15.2 ms 18.1 ms13.5 ms 42
algo: degreeCentralityNormalizedgpu 392 µs400 µs 555 µs380 µs 1708
algo: closenessCentrality (one root)v3 59.8 ms61.6 ms 65.9 ms57.3 ms 12
algo: closenessCentrality (one root)gpu 842 µs855 µs 1.03 ms815 µs 796
algo: degreeCentrality (one root)v3 7.35 µs7.12 µs 7.59 µs6.55 µs 20
algo: degreeCentrality (one root)gpu 218 ns223 ns 299 ns209 ns 759

algorithms N=500 · 10.2 minv4 (gpu) v3

algo: bfs (whole graph)
61×
algo: dfs (whole graph)
57×
algo: dijkstra + pathTo
51×
algo: aStar
3.5×
algo: bellmanFord
22×
algo: kruskal
26×
algo: tarjan SCC
35×
algo: hopcroft-tarjan biconnected
25×
algo: hierholzer (directed)
5.2×
algo: betweennessCentrality (unweighted)
13×
algo: degreeCentralityNormalized
37×
algo: closenessCentrality (one root)
68×
algo: degreeCentrality (one root)
35×
algo: pageRank (20 iters)
70×
algo: closenessCentrality (weighted, one root)
52×
algo: floydWarshall
1.76×
algo: closenessCentralityNormalized
2.5×
algo: markovClustering
1.10×
algo: hierarchicalClustering (threshold)
8.3×
algo: kMeans (fixed centroids)
4.6×
algo: kMedoids
7.7×
algo: fuzzyCMeans
11×
algo: affinityPropagation
5.3×
algo: kargerStein
1.05×
algo: betweennessCentrality (weighted)
8.7×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s10 s
All stats (table view)
groupbenchp50avgp99minsamples
algo: bfs (whole graph)v3 12.7 ms13.2 ms 18.1 ms10.7 ms 49
algo: bfs (whole graph)gpu 208 µs213 µs 268 µs204 µs 3286
algo: dfs (whole graph)v3 11.7 ms12.6 ms 15.5 ms11.4 ms 52
algo: dfs (whole graph)gpu 204 µs209 µs 306 µs200 µs 3343
algo: dijkstra + pathTov3 12.1 ms12.7 ms 16.3 ms11.4 ms 51
algo: dijkstra + pathTogpu 234 µs241 µs 409 µs228 µs 2888
algo: aStarv3 442 µs450 µs 535 µs427 µs 1556
algo: aStargpu 125 µs130 µs 202 µs120 µs 5393
algo: bellmanFordv3 17.7 ms17.8 ms 18.5 ms17.3 ms 36
algo: bellmanFordgpu 810 µs837 µs 1.90 ms784 µs 830
algo: kruskalv3 3.22 ms3.50 ms 7.04 ms3.14 ms 196
algo: kruskalgpu 126 µs131 µs 198 µs121 µs 5338
algo: tarjan SCCv3 5.35 ms5.71 ms 8.86 ms5.21 ms 118
algo: tarjan SCCgpu 152 µs159 µs 253 µs147 µs 4408
algo: hopcroft-tarjan biconnectedv3 20.4 ms20.9 ms 24.3 ms18.9 ms 30
algo: hopcroft-tarjan biconnectedgpu 825 µs856 µs 1.29 ms803 µs 814
algo: hierholzer (directed)v3 4.27 ms4.55 ms 7.52 ms4.09 ms 144
algo: hierholzer (directed)gpu 819 µs845 µs 1.22 ms795 µs 806
algo: betweennessCentrality (unweighted)v3 260 ms262 ms 266 ms257 ms 12
algo: betweennessCentrality (unweighted)gpu 20.2 ms20.2 ms 20.6 ms19.8 ms 30
algo: degreeCentralityNormalizedv3 3.48 ms3.80 ms 7.26 ms3.39 ms 180
algo: degreeCentralityNormalizedgpu 94.5 µs97.1 µs 145 µs92.9 µs 7192
algo: closenessCentrality (one root)v3 13.7 ms14.3 ms 17.0 ms13.0 ms 45
algo: closenessCentrality (one root)gpu 201 µs205 µs 260 µs193 µs 3414
algo: degreeCentrality (one root)v3 7.39 µs7.28 µs 7.61 µs6.58 µs 20
algo: degreeCentrality (one root)gpu 214 ns223 ns 345 ns204 ns 763
algo: pageRank (20 iters)v3 2.75 ms2.90 ms 6.07 ms2.67 ms 237
algo: pageRank (20 iters)gpu 39.3 µs44.1 µs 144 µs38.4 µs 15701
algo: closenessCentrality (weighted, one root)v3 13.4 ms14.4 ms 18.6 ms13.1 ms 44
algo: closenessCentrality (weighted, one root)gpu 256 µs266 µs 508 µs244 µs 2635
algo: floydWarshallv3 245 ms273 ms 387 ms242 ms 12
algo: floydWarshallgpu 140 ms141 ms 141 ms138 ms 12
algo: closenessCentralityNormalizedv3 273 ms273 ms 275 ms268 ms 12
algo: closenessCentralityNormalizedgpu 111 ms117 ms 141 ms110 ms 12
algo: markovClusteringv3 4.10 s4.35 s 4.63 s4.07 s 12
algo: markovClusteringgpu 3.73 s3.74 s 3.76 s3.72 s 12
algo: hierarchicalClustering (threshold)v3 34.4 ms34.5 ms 35.6 ms33.9 ms 16
algo: hierarchicalClustering (threshold)gpu 4.14 ms4.25 ms 5.61 ms4.03 ms 160
algo: kMeans (fixed centroids)v3 9.01 ms9.04 ms 9.70 ms8.60 ms 74
algo: kMeans (fixed centroids)gpu 1.98 ms2.03 ms 3.12 ms1.90 ms 342
algo: kMedoidsv3 301 ms294 ms 455 ms110 ms 12
algo: kMedoidsgpu 39.3 ms35.8 ms 45.8 ms13.0 ms 17
algo: fuzzyCMeansv3 78.8 ms80.2 ms 82.8 ms78.1 ms 12
algo: fuzzyCMeansgpu 6.93 ms6.99 ms 7.74 ms6.71 ms 96
algo: affinityPropagationv3 208 ms210 ms 217 ms198 ms 12
algo: affinityPropagationgpu 39.1 ms39.6 ms 41.7 ms38.7 ms 14
algo: kargerSteinv3 322 ms322 ms 330 ms312 ms 12
algo: kargerSteingpu 306 ms307 ms 312 ms298 ms 12
algo: betweennessCentrality (weighted)v3 705 ms706 ms 714 ms694 ms 12
algo: betweennessCentrality (weighted)gpu 81.1 ms82.9 ms 90.5 ms77.9 ms 12

mappers N=2,000 · 23.9 s

mapper: bulk write, color — cpu eval
1.31 ms
mapper: bulk write, color — gpu path
175 µs
mapper: bulk write, color + size — cpu eval
1.57 ms
mapper: bulk write, color + size — gpu color / cpu size
1.47 ms
mapper: bulk write, mapped labels (round-5 path) — label refresh
3.97 ms
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
mapper: bulk write, colorcpu eval 1.31 ms1.35 ms 1.98 ms1.25 ms 516
mapper: bulk write, colorgpu path 175 µs184 µs 328 µs169 µs 3811
mapper: bulk write, color + sizecpu eval 1.57 ms1.60 ms 1.74 ms1.53 ms 429
mapper: bulk write, color + sizegpu color / cpu size 1.47 ms1.50 ms 1.70 ms1.46 ms 464
mapper: bulk write, mapped labels (round-5 path)label refresh 3.97 ms4.20 ms 6.70 ms3.39 ms 161

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

layout: grid
86×
layout: preset
19×
layout: preset (fn form)
37×
layout: circle
6.8×
layout: concentric
16×
layout: breadthfirst
31×
layout: random
8.1×
layout: radial vs breadthfirst-circle (unbalanced tree) — radial
2.49 ms
layout: radial vs breadthfirst-circle (unbalanced tree) — breadthfirst circle
7.76 ms
layout: flow vs breadthfirst (staged DAG) — flow
165 ms
layout: flow vs breadthfirst (staged DAG) — breadthfirst
10.3 ms
layout: force (CPU executor, 20 iterations) — gpu
115 ms
layout: force constrained vs plain (CPU, 20 iterations) — constrained
110 ms
layout: force constrained vs plain (CPU, 20 iterations) — plain
109 ms
layout: force seed — spectral vs scatter (20 iterations) — spectral (landmark MDS, the default)
110 ms
layout: force seed — spectral vs scatter (20 iterations) — scatter
57.0 ms
layout: plumbing (layoutPositions vs setPositions) — finisher
457 µs
layout: plumbing (layoutPositions vs setPositions) — bulk
32.0 µs
layout: contract fixed cost (empty impl vs bulk placement) — wrapper only
544 ns
layout: contract fixed cost (empty impl vs bulk placement) — wrapper + bulk write
39.8 µs
layout: scope (eles.layout, 10% of nodes)
7.5×
100 ns1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
layout: gridv3 11.0 ms11.7 ms 16.4 ms9.86 ms 54
layout: gridgpu 127 µs133 µs 247 µs80.5 µs 4911
layout: presetv3 5.50 ms5.74 ms 8.49 ms5.35 ms 111
layout: presetgpu 296 µs316 µs 660 µs288 µs 2117
layout: preset (fn form)v3 5.43 ms5.73 ms 9.01 ms5.15 ms 117
layout: preset (fn form)gpu 145 µs161 µs 502 µs139 µs 4297
layout: circlev3 9.43 ms10.0 ms 15.1 ms9.01 ms 65
layout: circlegpu 1.39 ms1.50 ms 3.54 ms1.30 ms 453
layout: concentricv3 32.1 ms32.5 ms 36.6 ms28.4 ms 17
layout: concentricgpu 1.98 ms2.21 ms 4.52 ms1.94 ms 306
layout: breadthfirstv3 392 ms405 ms 448 ms386 ms 12
layout: breadthfirstgpu 12.5 ms13.1 ms 16.0 ms12.0 ms 47
layout: randomv3 5.34 ms5.73 ms 9.57 ms5.13 ms 116
layout: randomgpu 663 µs716 µs 1.53 ms643 µs 965
layout: radial vs breadthfirst-circle (unbalanced tree)radial 2.49 ms2.85 ms 4.98 ms2.35 ms 236
layout: radial vs breadthfirst-circle (unbalanced tree)breadthfirst circle 7.76 ms8.16 ms 16.7 ms7.53 ms 79
layout: flow vs breadthfirst (staged DAG)flow 165 ms179 ms 207 ms162 ms 12
layout: flow vs breadthfirst (staged DAG)breadthfirst 10.3 ms10.7 ms 18.5 ms9.73 ms 60
layout: force (CPU executor, 20 iterations)gpu 115 ms123 ms 135 ms105 ms 12
layout: force constrained vs plain (CPU, 20 iterations)constrained 110 ms112 ms 119 ms103 ms 12
layout: force constrained vs plain (CPU, 20 iterations)plain 109 ms111 ms 119 ms102 ms 12
layout: force seed — spectral vs scatter (20 iterations)spectral (landmark MDS, the default) 110 ms113 ms 123 ms103 ms 12
layout: force seed — spectral vs scatter (20 iterations)scatter 57.0 ms56.9 ms 57.3 ms56.1 ms 9
layout: plumbing (layoutPositions vs setPositions)finisher 457 µs493 µs 994 µs443 µs 1407
layout: plumbing (layoutPositions vs setPositions)bulk 32.0 µs41.1 µs 251 µs29.9 µs 16081
layout: contract fixed cost (empty impl vs bulk placement)wrapper only 544 ns973 ns 3.88 µs527 ns 166
layout: contract fixed cost (empty impl vs bulk placement)wrapper + bulk write 39.8 µs40.7 µs 41.8 µs38.3 µs 12
layout: scope (eles.layout, 10% of nodes)v3 971 µs1.05 ms 2.72 ms946 µs 586
layout: scope (eles.layout, 10% of nodes)gpu 130 µs143 µs 266 µs125 µs 4767

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

style: sheet swap (compile + applyAll)
5.8×
style: compile vs compile + apply — compile only (in batch)
24.6 µs
style: compile vs compile + apply — compile + apply
2.25 ms
style: first apply on add (256-node band)
1.89×
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — flat
2.27 ms
style: applyAll, flat vs compound (100 parents — the 14.6 partition) — compound
2.74 ms
style: applyAll — constant vs state-case (the 57.1d partition) — constant sheet
2.26 ms
style: applyAll — constant vs state-case (the 57.1d partition) — state-case sheet
2.27 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
9.93 ms
style: select+unselect 256-band — constant vs state-case sheet — constant sheet (skips restyle)
6.71 µs
style: select+unselect 256-band — constant vs state-case sheet — paint-only state sheet (round-61 diff path)
32.6 µs
style: select+unselect 256-band — constant vs state-case sheet — state-case sheet (all channels; full write)
382 µs
style: read one prop (color)
1.76×
style: read one prop (width)
2.1×
style: numericStyle
2.7×
style: renderedStyle (one prop)
13×
style: whole-object style()
5.9×
style: bypass set (ele.style name,value)
4.1×
style: bypass set + removeStyle round-trip
5.7×
style: select+unselect 256-band under the default sheet — bypass punch-out — no bypasses (diff path; the O(0) gate row)
33.1 µ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.46 ms
style: sheet swap (applyAll) — 0 vs 128 bypasses — 128 bypassed
8.59 ms
10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
style: sheet swap (compile + applyAll)v3 13.3 ms13.4 ms 15.5 ms12.5 ms 47
style: sheet swap (compile + applyAll)gpu 2.28 ms2.31 ms 2.69 ms2.22 ms 289
style: compile vs compile + applycompile only (in batch) 24.6 µs28.2 µs 35.3 µs23.8 µs 12
style: compile vs compile + applycompile + apply 2.25 ms2.28 ms 2.62 ms2.18 ms 292
style: first apply on add (256-node band)v3 1.40 ms1.66 ms 6.98 ms1.16 ms 412
style: first apply on add (256-node band)gpu 739 µs873 µs 2.67 ms690 µs 791
style: applyAll, flat vs compound (100 parents — the 14.6 partition)flat 2.27 ms2.34 ms 3.02 ms2.20 ms 296
style: applyAll, flat vs compound (100 parents — the 14.6 partition)compound 2.74 ms2.83 ms 4.77 ms2.64 ms 243
style: applyAll — constant vs state-case (the 57.1d partition)constant sheet 2.26 ms2.29 ms 2.70 ms2.21 ms 303
style: applyAll — constant vs state-case (the 57.1d partition)state-case sheet 2.27 ms2.30 ms 2.89 ms2.17 ms 300
style: applyAll — state-case vs data-case (what the partition avoids)state-case sheet 2.29 ms2.32 ms 2.71 ms2.19 ms 298
style: applyAll — state-case vs data-case (what the partition avoids)data-case sheet 9.93 ms10.0 ms 10.8 ms9.68 ms 63
style: select+unselect 256-band — constant vs state-case sheetconstant sheet (skips restyle) 6.71 µs6.73 µs 6.86 µs6.64 µs 21
style: select+unselect 256-band — constant vs state-case sheetpaint-only state sheet (round-61 diff path) 32.6 µs33.9 µs 55.9 µs31.2 µs 19871
style: select+unselect 256-band — constant vs state-case sheetstate-case sheet (all channels; full write) 382 µs397 µs 679 µs378 µs 1744
style: read one prop (color)v3 94.0 ns107 ns 618 ns85.0 ns 1986392
style: read one prop (color)gpu 53.4 ns58.3 ns 97.6 ns51.3 ns 2923
style: read one prop (width)v3 113 ns121 ns 433 ns96.0 ns 1934561
style: read one prop (width)gpu 53.3 ns58.3 ns 309 ns51.0 ns 2920
style: numericStylev3 139 ns133 ns 357 ns86.0 ns 1838743
style: numericStylegpu 51.5 ns53.9 ns 116 ns48.0 ns 3170
style: renderedStyle (one prop)v3 918 ns981 ns 2.00 µs866 ns 540568
style: renderedStyle (one prop)gpu 68.8 ns72.9 ns 180 ns67.1 ns 2346
style: whole-object style()v3 84.8 µs90.5 µs 180 µs82.8 µs 7684
style: whole-object style()gpu 14.4 µs16.2 µs 52.3 µs13.6 µs 41636
style: bypass set (ele.style name,value)v3 10.6 µs10.5 µs 10.9 µs9.84 µs 11
style: bypass set (ele.style name,value)gpu 2.57 µs2.86 µs 4.12 µs2.44 µs 54
style: bypass set + removeStyle round-tripv3 20.9 µs22.5 µs 22.5 µs20.1 µs 12
style: bypass set + removeStyle round-tripgpu 3.64 µs3.76 µs 4.59 µs3.32 µs 40
style: select+unselect 256-band under the default sheet — bypass punch-outno bypasses (diff path; the O(0) gate row) 33.1 µs33.7 µs 46.2 µs31.7 µs 19660
style: select+unselect 256-band under the default sheet — bypass punch-out128 of 256 bypassed (punched out to merged writes) 226 µs236 µs 389 µs219 µs 2956
style: sheet swap (applyAll) — 0 vs 128 bypassesno bypasses 2.46 ms2.50 ms 2.96 ms2.35 ms 276
style: sheet swap (applyAll) — 0 vs 128 bypasses128 bypassed 8.59 ms8.89 ms 11.5 ms8.36 ms 73

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

style( 'background-color' ) (was #4 in the switch)
1.13×
style( 'border-width' ) (was #6 in the switch)
1.11×
style( 'text-wrap' ) (was #73 in the switch)
1.72×
style( 'text-max-width' ) (was #74 in the switch)
1.73×
style( 'taxi-radius' ) (was #142 in the switch)
1.25×
style( 'target-distance-from-node' ) (was #150 in the switch)
1.35×
whole-object style() (gpu-only: v3 returns a different shape) — gpu node
13.4 µs
whole-object style() (gpu-only: v3 returns a different shape) — gpu edge
14.5 µs
colour-valued vs numeric reads (the string build) — gpu background-color (colour)
73.0 ns
colour-valued vs numeric reads (the string build) — gpu border-color (colour)
71.3 ns
colour-valued vs numeric reads (the string build) — gpu border-width (number)
66.7 ns
colour-valued vs numeric reads (the string build) — gpu width (number)
58.6 ns
the getters that ride readProp — gpu numericStyle( width )
61.0 ns
the getters that ride readProp — gpu effectiveOpacity()
21.5 ns
the getters that ride readProp — gpu renderedStyle( width )
77.2 ns
10 ns100 ns1 µs10 µs100 µs
All stats (table view)
groupbenchp50avgp99minsamples
style( 'background-color' ) (was #4 in the switch)v3 59.6 ns60.8 ns 73.9 ns57.2 ns 2821
style( 'background-color' ) (was #4 in the switch)gpu 52.7 ns54.5 ns 84.4 ns50.4 ns 3127
style( 'border-width' ) (was #6 in the switch)v3 60.4 ns61.3 ns 75.0 ns58.1 ns 2798
style( 'border-width' ) (was #6 in the switch)gpu 54.3 ns55.5 ns 68.9 ns52.0 ns 3072
style( 'text-wrap' ) (was #73 in the switch)v3 61.3 ns62.6 ns 80.6 ns59.1 ns 2731
style( 'text-wrap' ) (was #73 in the switch)gpu 35.6 ns36.3 ns 46.6 ns34.0 ns 4732
style( 'text-max-width' ) (was #74 in the switch)v3 59.0 ns60.2 ns 74.1 ns57.0 ns 2855
style( 'text-max-width' ) (was #74 in the switch)gpu 34.0 ns34.6 ns 45.0 ns32.5 ns 4954
style( 'taxi-radius' ) (was #142 in the switch)v3 60.7 ns61.9 ns 78.0 ns58.9 ns 2777
style( 'taxi-radius' ) (was #142 in the switch)gpu 48.5 ns51.6 ns 77.7 ns46.5 ns 3305
style( 'target-distance-from-node' ) (was #150 in the switch)v3 65.0 ns68.3 ns 112 ns62.5 ns 2514
style( 'target-distance-from-node' ) (was #150 in the switch)gpu 48.3 ns49.4 ns 67.2 ns46.8 ns 3468
whole-object style() (gpu-only: v3 returns a different shape)gpu node 13.4 µs14.3 µs 30.2 µs12.8 µs 47075
whole-object style() (gpu-only: v3 returns a different shape)gpu edge 14.5 µs15.5 µs 36.7 µs13.9 µs 43432
colour-valued vs numeric reads (the string build)gpu background-color (colour) 73.0 ns75.0 ns 109 ns70.5 ns 2279
colour-valued vs numeric reads (the string build)gpu border-color (colour) 71.3 ns72.8 ns 105 ns69.2 ns 2351
colour-valued vs numeric reads (the string build)gpu border-width (number) 66.7 ns68.7 ns 137 ns64.2 ns 2487
colour-valued vs numeric reads (the string build)gpu width (number) 58.6 ns59.8 ns 76.2 ns56.2 ns 2858
the getters that ride readPropgpu numericStyle( width ) 61.0 ns62.3 ns 85.1 ns59.1 ns 2746
the getters that ride readPropgpu effectiveOpacity() 21.5 ns21.8 ns 31.2 ns20.4 ns 7857
the getters that ride readPropgpu renderedStyle( width ) 77.2 ns77.9 ns 87.5 ns74.9 ns 2196

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

load: init from the definition form (construct + dispose)
26×
load: v4 ingest forms (construct + dispose) — definition form
4.36 ms
load: v4 ingest forms (construct + dispose) — columnar form
3.30 ms
load: v4 ingest forms (construct + dispose) — wire buffer
2.86 ms
load: v4 ingest forms (construct + dispose) — def clone alone (control)
617 µs
load: conversion — toColumnarElements
696 µs
load: conversion — serializeElements (from columnar)
181 µs
load: conversion — serializeElements (from defs)
870 µs
load: conversion — deserializeElements
4.59 µs
load: export from a live graph — cy.serialize() (wire)
499 µs
load: export from a live graph — cy.json() (v4)
727 µs
load: cy.json()
2.6×
load: add a 256-node band (add + remove)
1.59×
load: add a 256-node band, v4 forms — definition form
2.32 ms
load: add a 256-node band, v4 forms — columnar form
1.92 ms
load: add a 256-node band, v4 forms — wire buffer
1.92 ms
1 µs10 µs100 µs1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
load: init from the definition form (construct + dispose)v3 133 ms144 ms 173 ms127 ms 12
load: init from the definition form (construct + dispose)gpu 5.02 ms6.54 ms 20.3 ms4.26 ms 98
load: v4 ingest forms (construct + dispose)definition form 4.36 ms6.55 ms 16.4 ms4.12 ms 103
load: v4 ingest forms (construct + dispose)columnar form 3.30 ms4.72 ms 13.1 ms3.19 ms 142
load: v4 ingest forms (construct + dispose)wire buffer 2.86 ms4.14 ms 12.9 ms2.80 ms 162
load: v4 ingest forms (construct + dispose)def clone alone (control) 617 µs800 µs 2.40 ms204 µs 825
load: conversiontoColumnarElements 696 µs745 µs 1.25 ms676 µs 929
load: conversionserializeElements (from columnar) 181 µs367 µs 967 µs173 µs 1896
load: conversionserializeElements (from defs) 870 µs894 µs 1.32 ms845 µs 777
load: conversiondeserializeElements 4.59 µs4.42 µs 5.79 µs3.30 µs 30
load: export from a live graphcy.serialize() (wire) 499 µs571 µs 1.97 ms486 µs 1203
load: export from a live graphcy.json() (v4) 727 µs1.08 ms 6.77 ms686 µs 622
load: cy.json()v3 2.02 ms2.34 ms 6.25 ms1.96 ms 291
load: cy.json()gpu 762 µs903 µs 2.60 ms714 µs 770
load: add a 256-node band (add + remove)v3 3.69 ms4.40 ms 10.9 ms3.22 ms 150
load: add a 256-node band (add + remove)gpu 2.32 ms2.62 ms 7.89 ms1.62 ms 258
load: add a 256-node band, v4 formsdefinition form 2.32 ms2.34 ms 5.29 ms1.53 ms 291
load: add a 256-node band, v4 formscolumnar form 1.92 ms2.01 ms 4.26 ms1.29 ms 337
load: add a 256-node band, v4 formswire buffer 1.92 ms1.97 ms 3.86 ms1.29 ms 348

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

pick: hit (the walk; one inside-test) — zoom 1
20.7 µs
pick: hit (the walk; one inside-test) — zoom 2
20.8 µ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
44.7 µs
pick: shape inside-test, 2000 coincident misses — ellipse
87.5 µs
pick: shape inside-test, 2000 coincident misses — star
234 µs
pick: shape inside-test, 2000 coincident misses — round-hexagon
792 µs
pick: shape inside-test, 2000 coincident misses — barrel
688 µs
pick: shape inside-test, 2000 coincident misses — cut-rectangle
99.6 µs
pick: shape inside-test, 2000 coincident misses — polygon
209 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 1
803 µs
pick: round-hexagon inside-test by zoom (not affine-invariant) — zoom 2
791 µs
pick: background miss (full highWater walk) — gpu
44.9 µs
pick: label box in the scan (text-events) — text-events: no
45.0 µs
pick: label box in the scan (text-events) — text-events: yes
123 µs
box: elementsInBox by covered fraction — 10%
149 µs
box: elementsInBox by covered fraction — 50%
197 µs
box: elementsInBox by covered fraction — 100%
331 µs
box: label containment (boxSelectionIncludesLabels) — off
229 µs
box: label containment (boxSelectionIncludesLabels) — on
262 µs
box: overlap vs contain (straight edges) — contain
234 µs
box: overlap vs contain (straight edges) — overlap
463 µ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.4×
bounds: boundingBox, labels in vs out (v4) — includeLabels: true (default)
1.20 ms
bounds: boundingBox, labels in vs out (v4) — includeLabels: false
656 µs
bounds: cy.fit() (whole-graph scan)
33×
bounds: getFitViewport() (compute without committing)
33×
bounds: boundingBoxAt (v4 only) — gpu
1.47 ms
bounds: one node boundingBox()
1.63×
bounds: labelBoundingBox (v4 only) — gpu
415 ns
bounds: compound + taxi exact scan (rounds 54/92, v4 only) — warm (curve bbs memoized)
19.2 µs
bounds: compound + taxi exact scan (rounds 54/92, v4 only) — cold (geometry write per call)
204 µs
bounds: straight-only scan (ndex-shaped, round 92, v4 only) — warm
34.1 µs
bounds: straight-only scan (ndex-shaped, round 92, v4 only) — cold (geometry write per call)
34.6 µs
100 ns1 µs10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
pick: hit (the walk; one inside-test)zoom 1 20.7 µs21.5 µs 42.5 µs20.0 µs 31984
pick: hit (the walk; one inside-test)zoom 2 20.8 µs21.2 µs 21.6 µs20.4 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)exact 46.2 µs46.5 µs 47.1 µs45.7 µs 12
pick: miss walk — exact vs 24 px touch halo (57.9)padPx 24 44.7 µs45.9 µs 83.4 µs42.2 µs 15158
pick: shape inside-test, 2000 coincident missesellipse 87.5 µs90.4 µs 136 µs83.6 µs 7726
pick: shape inside-test, 2000 coincident missesstar 234 µs242 µs 293 µs224 µs 2877
pick: shape inside-test, 2000 coincident missesround-hexagon 792 µs800 µs 921 µs770 µs 875
pick: shape inside-test, 2000 coincident missesbarrel 688 µs708 µs 885 µs663 µs 985
pick: shape inside-test, 2000 coincident missescut-rectangle 99.6 µs101 µs 142 µs96.0 µs 6908
pick: shape inside-test, 2000 coincident missespolygon 209 µs214 µs 272 µs202 µs 3278
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 1 803 µs812 µs 990 µs774 µs 862
pick: round-hexagon inside-test by zoom (not affine-invariant)zoom 2 791 µs799 µs 932 µs768 µs 876
pick: background miss (full highWater walk)gpu 44.9 µs45.3 µs 46.1 µs44.4 µs 12
pick: label box in the scan (text-events)text-events: no 45.0 µs45.3 µs 46.5 µs44.3 µs 12
pick: label box in the scan (text-events)text-events: yes 123 µs128 µs 193 µs118 µs 5447
box: elementsInBox by covered fraction10% 149 µs154 µs 247 µs145 µs 4538
box: elementsInBox by covered fraction50% 197 µs203 µs 374 µs188 µs 3421
box: elementsInBox by covered fraction100% 331 µs340 µs 783 µs312 µs 2052
box: label containment (boxSelectionIncludesLabels)off 229 µs237 µs 374 µs222 µs 2939
box: label containment (boxSelectionIncludesLabels)on 262 µs275 µs 630 µs251 µs 2540
box: overlap vs contain (straight edges)contain 234 µs241 µs 370 µs231 µs 2898
box: overlap vs contain (straight edges)overlap 463 µs470 µs 801 µs412 µs 1484
box: overlap vs contain (curved edges — the segment walk)contain 1.25 ms1.27 ms 1.65 ms1.21 ms 550
box: overlap vs contain (curved edges — the segment walk)overlap 1.21 ms1.24 ms 1.93 ms1.16 ms 562
bounds: whole-graph boundingBox()v3 7.72 ms7.79 ms 8.90 ms7.28 ms 84
bounds: whole-graph boundingBox()gpu 1.21 ms1.23 ms 1.52 ms1.17 ms 549
bounds: boundingBox, labels in vs out (v4)includeLabels: true (default) 1.20 ms1.24 ms 1.86 ms1.17 ms 562
bounds: boundingBox, labels in vs out (v4)includeLabels: false 656 µs670 µs 985 µs632 µs 1043
bounds: cy.fit() (whole-graph scan)v3 7.57 ms7.89 ms 11.8 ms7.25 ms 85
bounds: cy.fit() (whole-graph scan)gpu 232 µs244 µs 450 µs225 µs 2868
bounds: getFitViewport() (compute without committing)v3 7.62 ms7.82 ms 9.77 ms7.31 ms 85
bounds: getFitViewport() (compute without committing)gpu 232 µs242 µs 359 µs225 µs 2888
bounds: boundingBoxAt (v4 only)gpu 1.47 ms1.55 ms 3.01 ms1.41 ms 438
bounds: one node boundingBox()v3 1.64 µs1.65 µs 2.02 µs1.58 µs 97
bounds: one node boundingBox()gpu 1.00 µs1.02 µs 1.33 µs969 ns 160
bounds: labelBoundingBox (v4 only)gpu 415 ns448 ns 780 ns412 ns 374
bounds: compound + taxi exact scan (rounds 54/92, v4 only)warm (curve bbs memoized) 19.2 µs20.0 µs 46.0 µs18.4 µs 34403
bounds: compound + taxi exact scan (rounds 54/92, v4 only)cold (geometry write per call) 204 µs214 µs 334 µs200 µs 3266
bounds: straight-only scan (ndex-shaped, round 92, v4 only)warm 34.1 µs34.4 µs 35.1 µs33.5 µs 12
bounds: straight-only scan (ndex-shaped, round 92, v4 only)cold (geometry write per call) 34.6 µs35.2 µs 35.9 µ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)
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.8×
data: read one numeric key
1.27×
data: read one string key (dictionary decode)
1.34×
data: read the whole object
2.3×
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })
14×
query: data comparison ([weight > 3] vs { gt })
11×
query: two keys AND-ed
12×
query: membership ([bucket in ...] vs { in })
16×
query: predicate function (both sides)
7.9×
query: structural, parents (:parent vs { parent: true })
35×
query: structural, childless (:childless vs { parent: false })
13×
query: structural, orphans (:orphan vs { child: false })
32×
10 ns100 ns1 µs10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
data: bulk write, numeric columnv3 1.79 ms1.87 ms 3.14 ms1.69 ms 358
data: bulk write, numeric columngpu 85.9 µs90.2 µs 154 µs82.7 µs 7749
data: bulk write, dictionary string column (4 values)v3 1.71 ms1.74 ms 2.10 ms1.63 ms 388
data: bulk write, dictionary string column (4 values)gpu 103 µs109 µs 313 µs95.6 µs 6435
data: bulk write, one new dictionary entry per passv3 1.70 ms1.73 ms 2.09 ms1.66 ms 398
data: bulk write, one new dictionary entry per passgpu 99.9 µs104 µs 158 µs96.4 µs 6704
data: bulk write, object column (plain-array fallback)v3 1.71 ms1.80 ms 3.07 ms1.64 ms 384
data: bulk write, object column (plain-array fallback)gpu 83.8 µs86.7 µs 136 µs79.8 µs 8066
data: removeData (whole collection)v3 2.53 ms2.62 ms 4.23 ms2.45 ms 262
data: removeData (whole collection)gpu 326 µs343 µs 704 µs319 µs 2011
data: read one numeric keyv3 38.3 ns39.9 ns 117 ns36.6 ns 4299
data: read one numeric keygpu 30.3 ns31.8 ns 81.2 ns29.1 ns 5247
data: read one string key (dictionary decode)v3 41.4 ns43.9 ns 91.4 ns39.3 ns 3910
data: read one string key (dictionary decode)gpu 31.0 ns32.0 ns 68.9 ns26.7 ns 5355
data: read the whole objectv3 47.7 ns49.1 ns 75.5 ns45.4 ns 3501
data: read the whole objectgpu 21.1 ns22.2 ns 40.5 ns20.1 ns 7668
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })v3 682 µs695 µs 1.14 ms667 µs 1004
query: data equality ([bucket = 3] vs { data: { bucket: 3 } })gpu 48.2 µs52.3 µs 124 µs43.3 µs 13200
query: data comparison ([weight > 3] vs { gt })v3 764 µs783 µs 1.25 ms732 µs 890
query: data comparison ([weight > 3] vs { gt })gpu 69.2 µs71.6 µs 161 µs56.9 µs 9673
query: two keys AND-edv3 796 µs812 µs 1.09 ms783 µs 859
query: two keys AND-edgpu 66.4 µs70.2 µs 139 µs65.3 µs 9892
query: membership ([bucket in ...] vs { in })v3 1.01 ms1.02 ms 1.35 ms967 µs 683
query: membership ([bucket in ...] vs { in })gpu 65.0 µs69.8 µs 134 µs62.3 µs 9744
query: predicate function (both sides)v3 657 µs672 µs 929 µs640 µs 1036
query: predicate function (both sides)gpu 83.5 µs86.5 µs 139 µs79.5 µs 8066
query: structural, parents (:parent vs { parent: true })v3 530 µs538 µs 662 µs509 µs 1299
query: structural, parents (:parent vs { parent: true })gpu 15.2 µs16.2 µs 19.0 µs15.1 µs 12
query: structural, childless (:childless vs { parent: false })v3 795 µs815 µs 1.11 ms773 µs 857
query: structural, childless (:childless vs { parent: false })gpu 59.6 µs73.5 µs 184 µs55.4 µs 9266
query: structural, orphans (:orphan vs { child: false })v3 499 µs507 µs 599 µs484 µs 1335
query: structural, orphans (:orphan vs { child: false })gpu 15.4 µs16.1 µs 16.2 µs15.3 µs 12

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

emit: position write, no listeners
26×
emit: 1 core listener
8.9×
emit: 1 element (ref-qualified) listener
8.0×
emit: delegated (v3 selector vs v4 predicate)
8.2×
emit: 10 core listeners
6.6×
emit: on() + off() round-trip
2.1×
emit: flat vs phased (compound bubbling, 14.5) — orphan (flat emit)
295 ns
emit: flat vs phased (compound bubbling, 14.5) — child of 2 ancestors (phased)
845 ns
emit: flat vs phased, no listeners — orphan (flat)
80.6 ns
emit: flat vs phased, no listeners — child (phased)
526 ns
anim: start + stop, one element
1.31×
anim: start against a running animation (round-21 eviction) — disjoint channels (composes)
1.29 µs
anim: start against a running animation (round-21 eviction) — overlapping channels (evicts)
818 ns
anim: start + stop, 512-node collection
2.9×
anim: delay() (no channels touched)
1.57×
anim: controls (v4 only) — pause + resume
463 ns
anim: controls (v4 only) — reverse
893 ns
anim: viewport animate + stop
2.9×
10 ns100 ns1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
emit: position write, no listenersv3 1.29 µs1.31 µs 1.78 µs1.23 µs 115
emit: position write, no listenersgpu 49.0 ns51.8 ns 81.1 ns46.5 ns 3302
emit: 1 core listenerv3 1.45 µs1.45 µs 1.59 µs1.39 µs 107
emit: 1 core listenergpu 164 ns168 ns 254 ns157 ns 936
emit: 1 element (ref-qualified) listenerv3 1.41 µs1.48 µs 2.21 µs1.34 µs 106
emit: 1 element (ref-qualified) listenergpu 178 ns184 ns 222 ns172 ns 867
emit: delegated (v3 selector vs v4 predicate)v3 1.52 µs1.53 µs 1.63 µs1.48 µs 101
emit: delegated (v3 selector vs v4 predicate)gpu 187 ns190 ns 257 ns179 ns 839
emit: 10 core listenersv3 1.97 µs2.03 µs 2.34 µs1.87 µs 77
emit: 10 core listenersgpu 296 ns302 ns 353 ns295 ns 508
emit: on() + off() round-tripv3 459 ns567 ns 1.40 µs428 ns 293
emit: on() + off() round-tripgpu 214 ns257 ns 909 ns184 ns 641
emit: flat vs phased (compound bubbling, 14.5)orphan (flat emit) 295 ns344 ns 2.74 µs276 ns 1012114
emit: flat vs phased (compound bubbling, 14.5)child of 2 ancestors (phased) 845 ns896 ns 1.34 µs810 ns 177
emit: flat vs phased, no listenersorphan (flat) 80.6 ns90.4 ns 682 ns78.3 ns 1870
emit: flat vs phased, no listenerschild (phased) 526 ns578 ns 1.91 µs505 ns 288
anim: start + stop, one elementv3 826 ns1.22 µs 3.39 µs776 ns 421268
anim: start + stop, one elementgpu 630 ns1.05 µs 6.85 µs582 ns 464771
anim: start against a running animation (round-21 eviction)disjoint channels (composes) 1.29 µs1.91 µs 3.82 µs1.07 µs 80
anim: start against a running animation (round-21 eviction)overlapping channels (evicts) 818 ns1.42 µs 3.63 µs792 ns 107
anim: start + stop, 512-node collectionv3 294 µs455 µs 3.01 ms284 µs 1465
anim: start + stop, 512-node collectiongpu 99.9 µs113 µs 185 µs97.4 µs 5487
anim: delay() (no channels touched)v3 646 ns962 ns 3.26 µs628 ns 168
anim: delay() (no channels touched)gpu 410 ns704 ns 2.67 µs399 ns 231
anim: controls (v4 only)pause + resume 463 ns745 ns 2.63 µs451 ns 205
anim: controls (v4 only)reverse 893 ns1.52 µs 3.45 µs881 ns 100
anim: viewport animate + stopv3 558 ns837 ns 3.10 µs543 ns 190
anim: viewport animate + stopgpu 194 ns224 ns 825 ns192 ns 740

store N=2,000 · 1.0 min

id index: set x 2000 (build) — gpu
263 µs
id index: single-key operations — get (probe)
66.1 ns
id index: single-key operations — has
50.9 ns
id index: single-key operations — idAt (memoized hit)
8.96 ns
id index: single-key operations — hashAt
6.98 ns
id index: remove + re-set (churn, drives the round-11 reclaim) — gpu
231 ns
adjacency: rebuild (4000 edges, two counting passes) — gpu
39.2 µs
adjacency: reads — outDegree (O(1))
6.16 ns
adjacency: reads — outEdges
44.9 ns
adjacency: reads — connectedEdges
117 ns
adjacency: addEdge + removeEdge (the overlay path) — gpu
143 ns
blob: write x 2000 (build) — gpu
104 µs
blob: single-record operations — rewrite in place (same length)
29.5 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.7 ns
dirty: mark (per-write span coalescing) — scattered marks
17.7 ns
dirty: take (a frame's drain) — gpu
587 ns
images: registry bookkeeping — acquire (existing url)
202 ns
images: registry bookkeeping — acquire (new url) + release
531 ns
charts: sheet apply, chart vs no chart — no chart
2.21 ms
charts: sheet apply, chart vs no chart — pie from data (blob record per node)
2.65 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 263 µs277 µs 443 µs252 µs 2536
id index: single-key operationsget (probe) 66.1 ns65.7 ns 114 ns52.9 ns 2597
id index: single-key operationshas 50.9 ns51.9 ns 69.6 ns49.4 ns 3291
id index: single-key operationsidAt (memoized hit) 8.96 ns9.19 ns 17.4 ns8.59 ns 18527
id index: single-key operationshashAt 6.98 ns7.17 ns 13.9 ns6.77 ns 23639
id index: remove + re-set (churn, drives the round-11 reclaim)gpu 231 ns237 ns 297 ns227 ns 712
adjacency: rebuild (4000 edges, two counting passes)gpu 39.2 µs45.7 µs 209 µs36.8 µs 15170
adjacency: readsoutDegree (O(1)) 6.16 ns6.27 ns 9.48 ns5.95 ns 27061
adjacency: readsoutEdges 44.9 ns45.8 ns 58.1 ns43.9 ns 3732
adjacency: readsconnectedEdges 117 ns180 ns 2.12 µs114 ns 931
adjacency: addEdge + removeEdge (the overlay path)gpu 143 ns146 ns 209 ns136 ns 1159
blob: write x 2000 (build)gpu 104 µs126 µs 628 µs98.6 µs 5539
blob: single-record operationsrewrite in place (same length) 29.5 ns30.1 ns 40.7 ns28.7 ns 5679
blob: single-record operationsoffsetOf 4.24 ns4.37 ns 8.73 ns4.09 ns 38513
blob: single-record operationsfree + rewrite 151 ns171 ns 510 ns146 ns 998
dirty: mark (per-write span coalescing)contiguous marks 12.7 ns13.2 ns 25.6 ns12.1 ns 12836
dirty: mark (per-write span coalescing)scattered marks 17.7 ns18.2 ns 28.1 ns17.1 ns 9370
dirty: take (a frame's drain)gpu 587 ns696 ns 1.30 µs580 ns 237
images: registry bookkeepingacquire (existing url) 202 ns210 ns 399 ns200 ns 812
images: registry bookkeepingacquire (new url) + release 531 ns605 ns 2.82 µs521 ns 272
charts: sheet apply, chart vs no chartno chart 2.21 ms2.30 ms 4.35 ms2.17 ms 292
charts: sheet apply, chart vs no chartpie from data (blob record per node) 2.65 ms2.69 ms 3.21 ms2.53 ms 255
charts: data write refreshing chart-valuesgpu 1.48 ms1.54 ms 2.18 ms1.47 ms 451

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

viewport: zoom() get
4.7×
viewport: zoom( n ) set
1.86×
viewport: pan() get
1.41×
viewport: pan( p ) set
1.80×
viewport: panBy()
1.71×
viewport: extent()
1.55×
viewport: renderedExtent()
1.65×
viewport: width() + height() + size() (3 calls)
3.8×
viewport: minZoom/maxZoom get (2 calls)
15×
viewport: center( eles )
19×
viewport: reset()
107×
viewport: viewport({ zoom, pan })
57×
viewport: getCenterPan( eles ) — gpu
6.10 µs
core: instanceString + headless + styleEnabled (3 calls)
1.25×
core: hasElementWithId + hasCompoundNodes (2 calls)
1.18×
core: options()
85×
core: elements() memo hit (was mutableElements, round 90)
1.02×
core: gating getters (5 calls)
1.16×
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)
8660×
core: graph scratch() set + get (v3 restyles the graph)
16146×
core: batch( fn ) (empty)
6.3×
core: startBatch + endBatch + batching
5.9×
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.77×
collection: length + empty + nonempty (3 calls)
4.5×
collection: eq/first/last (3 calls)
1.83×
collection: slice()
2.3×
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.59×
collection: same + anySame + contains (3 calls)
71×
collection: allAre (all match: the full walk)
1.48×
collection: is (none match: the full walk)
2.3×
collection: union
5.7×
collection: intersection
29×
collection: difference
29×
collection: symmetricDifference
3.8×
collection: absoluteComplement
15×
collection: byGroup
3.1×
collection: diff
3.1×
collection: indexOf
1.35×
traversal: openNeighborhood + closedNeighborhood (2 calls)
2.9×
traversal: connectedNodes
3.3×
traversal: sources + targets (2 calls)
3.4×
traversal: source() + target() (2 calls)
1.28×
traversal: edgesWith
1.25×
traversal: edgesTo
1.28×
traversal: parallelEdges + codirectedEdges (2 calls)
3.3×
traversal: roots + leaves (2 calls)
13×
traversal: allAreNeighbors
5.2×
traversal: isLoop + isSimple (2 calls)
2.6×
degree: indegree + outdegree (2 calls)
75×
degree: minDegree + maxDegree (2 calls)
44×
degree: minIndegree + maxOutdegree (2 calls)
25×
dimensions: renderedPosition get
2.3×
dimensions: relativePosition get
12×
dimensions: width + height + outerWidth + outerHeight (4 calls)
2.5×
dimensions: rendered dims (4 calls)
2.8×
dimensions: renderedBoundingBox
1.92×
dimensions: midpoint + renderedMidpoint (2 calls) — gpu
1.10 µs
dimensions: source/targetEndpoint (2 calls) — gpu
363 ns
dimensions: rendered source/targetEndpoint (2 calls) — gpu
384 ns
dimensions: shift + silentShift (round-trip)
60×
dimensions: silentPosition
16×
dimensions: positions( fn ) over 100
51×
dimensions: padding + paddedWidth + paddedHeight (3 calls)
12×
curves: isBundledBezier — gpu
20.7 ns
curves: controlPoints + renderedControlPoints (2 calls) — gpu
525 ns
curves: segmentPoints (undefined for bezier) — gpu
33.3 ns
compound: parent + parents + ancestors (3 calls)
3.6×
compound: children + descendants + siblings (3 calls)
4.8×
compound: orphans + nonorphans (2 calls)
7.1×
compound: commonAncestors
121×
compound: isParent/isChild/isChildless/isOrphan (4 calls)
1.48×
flags: select + unselect + selected (band)
16×
flags: selectify + unselectify + selectable
94×
flags: lock + unlock + locked
93×
flags: grabify + ungrabify + grabbable
94×
flags: show + hide + visible
228×
flags: active/activate/unactivate (3 calls)
16×
flags: panify + unpanify + pannable
94×
flags: takesUpSpace + interactive + transparent (3 calls)
3.0×
flags: effectiveOpacity
2.3×
element data: scratch get + set
7.5×
element data: json() one element
2.0×
element data: jsons() over 100
2.00×
element data: label() — gpu
15.2 ns
core: batch + per-id data() (was batchData, round 90)
9.5×
core: animated()
4.8×
core: zoomRange get — gpu
2.16 ns
core: resize() / invalidateSize()
2.5×
core: on('render') + off('render') (was onRender/offRender, round 90)
2.4×
core: removeScratch()
9890×
core: selectionType get
1.99×
core: isReady()
2.2×
core: window()
2.8×
core: container()
2.7×
core: destroyed()
2.2×
core: removeAllListeners()
8.7×
collection: cy()
3.5×
collection: indexOfId()
1.75×
collection: removed() + inside() (2 calls)
1.17×
collection: silentPositions( fn ) over 100
30×
collection: animated()
2.9×
collection: delayAnimation()
2.8×
collection: removeScratch()
8.8×
collection: component()
43×
collection: layoutDimensions()
3.3×
degree: maxIndegree + minOutdegree (2 calls)
25×
flags: grabbed + hidden + inactive (3 calls)
2.2×
curves: renderedSegmentPoints — gpu
36.1 ns
layout contract: edgeSlots + endpoints + degreeOf — gpu
34.5 µs
formats: isColumnarElements + isSerializedElements + isPackedIds — gpu
4.52 ns
0.100 ns1 ns10 ns100 ns1 µs10 µs100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
viewport: zoom() getv3 5.68 ns5.88 ns 12.7 ns5.32 ns 28692
viewport: zoom() getgpu 1.21 ns1.23 ns 1.91 ns1.18 ns 128843
viewport: zoom( n ) setv3 606 ns612 ns 701 ns579 ns 271
viewport: zoom( n ) setgpu 326 ns333 ns 389 ns316 ns 504
viewport: pan() getv3 6.94 ns7.33 ns 14.8 ns6.69 ns 23011
viewport: pan() getgpu 4.92 ns5.08 ns 10.0 ns4.76 ns 33203
viewport: pan( p ) setv3 594 ns627 ns 1.05 µs580 ns 267
viewport: pan( p ) setgpu 331 ns345 ns 615 ns309 ns 490
viewport: panBy()v3 590 ns604 ns 801 ns581 ns 279
viewport: panBy()gpu 345 ns353 ns 591 ns316 ns 477
viewport: extent()v3 30.0 ns44.9 ns 193 ns28.2 ns 3757
viewport: extent()gpu 19.3 ns26.1 ns 115 ns18.2 ns 6478
viewport: renderedExtent()v3 27.1 ns28.4 ns 50.8 ns25.8 ns 5956
viewport: renderedExtent()gpu 16.4 ns23.4 ns 100 ns15.1 ns 7199
viewport: width() + height() + size() (3 calls)v3 21.4 ns23.0 ns 46.4 ns20.5 ns 7393
viewport: width() + height() + size() (3 calls)gpu 5.55 ns5.80 ns 11.5 ns5.31 ns 29048
viewport: minZoom/maxZoom get (2 calls)v3 14.8 ns15.3 ns 25.2 ns13.9 ns 11126
viewport: minZoom/maxZoom get (2 calls)gpu 0.999 ns1.04 ns 1.02 ns0.977 ns 152116
viewport: center( eles )v3 119 µs123 µs 186 µs112 µs 5648
viewport: center( eles )gpu 6.20 µs6.23 µs 6.47 µs6.09 µs 23
viewport: reset()v3 939 ns1.03 µs 1.67 µs910 ns 162
viewport: reset()gpu 8.81 ns9.23 ns 18.6 ns8.39 ns 18285
viewport: viewport({ zoom, pan })v3 933 ns1.03 µs 1.69 µs911 ns 162
viewport: viewport({ zoom, pan })gpu 16.2 ns17.1 ns 41.0 ns15.4 ns 9953
viewport: getCenterPan( eles )gpu 6.10 µs6.13 µs 6.26 µs6.07 µs 24
core: instanceString + headless + styleEnabled (3 calls)v3 32.1 ns32.8 ns 45.7 ns31.4 ns 5195
core: instanceString + headless + styleEnabled (3 calls)gpu 25.7 ns26.6 ns 39.6 ns24.8 ns 6410
core: hasElementWithId + hasCompoundNodes (2 calls)v3 37.6 ns38.9 ns 54.7 ns36.6 ns 4410
core: hasElementWithId + hasCompoundNodes (2 calls)gpu 31.8 ns33.1 ns 49.7 ns30.4 ns 5158
core: options()v3 91.1 ns93.6 ns 128 ns89.1 ns 1826
core: options()gpu 1.07 ns1.24 ns 6.21 ns1.03 ns 128909
core: elements() memo hit (was mutableElements, round 90)v3 2.41 ns2.50 ns 2.99 ns2.35 ns 66268
core: elements() memo hit (was mutableElements, round 90)gpu 2.35 ns2.40 ns 2.85 ns2.25 ns 69209
core: gating getters (5 calls)v3 15.6 ns16.2 ns 24.6 ns14.9 ns 10552
core: gating getters (5 calls)gpu 13.5 ns14.0 ns 27.6 ns12.4 ns 12165
core: gating setters round-trip (autolock/autoungrabify/autounselectify)v3 11.2 ns11.5 ns 19.3 ns10.5 ns 14766
core: gating setters round-trip (autolock/autoungrabify/autounselectify)gpu 6.01 ns6.21 ns 12.5 ns5.73 ns 27333
core: interaction tuning getters (5 calls)gpu 7.30 ns7.53 ns 13.2 ns7.14 ns 22548
core: graph data() set + get (v3 restyles the graph)v3 2.84 ms2.91 ms 3.70 ms2.72 ms 237
core: graph data() set + get (v3 restyles the graph)gpu 328 ns336 ns 390 ns320 ns 505
core: graph scratch() set + get (v3 restyles the graph)v3 2.74 ms2.78 ms 3.49 ms2.69 ms 243
core: graph scratch() set + get (v3 restyles the graph)gpu 169 ns171 ns 229 ns166 ns 997
core: batch( fn ) (empty)v3 524 ns625 ns 1.51 µs501 ns 270
core: batch( fn ) (empty)gpu 83.7 ns86.6 ns 113 ns81.1 ns 1956
core: startBatch + endBatch + batchingv3 526 ns625 ns 1.67 µs513 ns 265
core: startBatch + endBatch + batchinggpu 89.8 ns164 ns 2.88 µs86.9 ns 1010
core: collection()v3 451 ns525 ns 1.49 µs442 ns 320
core: collection()gpu 62.4 ns66.9 ns 175 ns60.8 ns 2520
core: compact() (no dead slots — the early-out)gpu 16.9 µs21.0 µs 97.7 µs16.4 µs 32603
collection: element accessors (id/group/isNode/isEdge, 4 calls)v3 60.5 ns64.6 ns 193 ns56.0 ns 2636
collection: element accessors (id/group/isNode/isEdge, 4 calls)gpu 34.3 ns36.6 ns 70.9 ns32.9 ns 4653
collection: length + empty + nonempty (3 calls)v3 6.66 ns6.87 ns 12.2 ns6.34 ns 24644
collection: length + empty + nonempty (3 calls)gpu 1.47 ns1.52 ns 1.94 ns1.43 ns 107403
collection: eq/first/last (3 calls)v3 15.2 ns15.7 ns 25.2 ns14.9 ns 10870
collection: eq/first/last (3 calls)gpu 8.30 ns8.53 ns 14.8 ns7.99 ns 19967
collection: slice()v3 3.83 µs3.90 µs 4.24 µs3.64 µs 40
collection: slice()gpu 1.70 µs1.70 µs 1.79 µs1.63 µs 96
collection: toArray()v3 8.66 µs8.76 µs 8.75 µs8.54 µs 16
collection: toArray()gpu 734 ns749 ns 872 ns720 ns 218
collection: sort( fn )v3 14.1 µs14.6 µs 14.8 µs13.9 µs 12
collection: sort( fn )gpu 9.02 µs9.04 µs 9.16 µs8.92 µs 15
collection: reduce( fn )v3 157 ns158 ns 177 ns115 ns 1073
collection: reduce( fn )gpu 114 ns120 ns 223 ns110 ns 1436
collection: min + max ( fn ) (2 calls)v3 11.1 µs11.2 µs 11.4 µs11.0 µs 12
collection: min + max ( fn ) (2 calls)gpu 5.49 µs5.51 µs 5.63 µs5.42 µs 26
collection: some + every (2 calls)v3 878 ns892 ns 1.11 µs852 ns 186
collection: some + every (2 calls)gpu 554 ns561 ns 598 ns553 ns 302
collection: same + anySame + contains (3 calls)v3 7.20 µs7.22 µs 7.37 µs7.09 µs 20
collection: same + anySame + contains (3 calls)gpu 101 ns103 ns 124 ns97.4 ns 1670
collection: allAre (all match: the full walk)v3 3.65 µs3.73 µs 4.21 µs3.41 µs 41
collection: allAre (all match: the full walk)gpu 2.46 µs2.51 µs 3.35 µs2.40 µs 62
collection: is (none match: the full walk)v3 5.53 µs5.54 µs 5.76 µs5.33 µs 27
collection: is (none match: the full walk)gpu 2.36 µs2.41 µs 2.84 µs2.31 µs 66
collection: unionv3 93.8 µs103 µs 139 µs91.9 µs 6729
collection: uniongpu 16.4 µs16.6 µs 16.7 µs15.9 µs 12
collection: intersectionv3 92.8 µs102 µs 140 µs91.1 µs 6790
collection: intersectiongpu 3.21 µs3.26 µs 3.62 µs3.19 µs 48
collection: differencev3 91.6 µs101 µs 129 µs90.2 µs 6871
collection: differencegpu 3.18 µs3.25 µs 3.55 µs3.12 µs 48
collection: symmetricDifferencev3 24.7 µs26.2 µs 28.2 µs24.1 µs 12
collection: symmetricDifferencegpu 6.50 µs6.53 µs 6.64 µs6.41 µs 22
collection: absoluteComplementv3 6.01 ms6.56 ms 9.88 ms5.79 ms 103
collection: absoluteComplementgpu 408 µs419 µs 696 µs404 µs 1670
collection: byGroupv3 1.00 ms1.01 ms 1.16 ms976 µs 691
collection: byGroupgpu 326 µs332 µs 535 µs239 µs 2107
collection: diffv3 35.5 µs35.7 µs 37.5 µs33.4 µs 12
collection: diffgpu 11.5 µs11.6 µs 12.3 µs11.2 µs 11
collection: indexOfv3 31.6 ns32.7 ns 52.6 ns30.5 ns 5246
collection: indexOfgpu 23.4 ns24.1 ns 36.3 ns22.5 ns 7100
traversal: openNeighborhood + closedNeighborhood (2 calls)v3 9.30 µs9.45 µs 9.97 µs8.97 µs 14
traversal: openNeighborhood + closedNeighborhood (2 calls)gpu 3.21 µs3.41 µs 4.06 µs3.05 µs 45
traversal: connectedNodesv3 1.01 µs1.09 µs 1.80 µs977 ns 152
traversal: connectedNodesgpu 300 ns311 ns 525 ns293 ns 546
traversal: sources + targets (2 calls)v3 1.72 µs1.92 µs 2.84 µs1.67 µs 85
traversal: sources + targets (2 calls)gpu 508 ns715 ns 2.44 µs492 ns 235
traversal: source() + target() (2 calls)v3 71.9 ns72.9 ns 89.4 ns59.9 ns 2344
traversal: source() + target() (2 calls)gpu 56.0 ns57.3 ns 71.8 ns53.3 ns 2985
traversal: edgesWithv3 67.6 µs69.0 µs 107 µs66.1 µs 10103
traversal: edgesWithgpu 54.0 µs54.8 µs 57.0 µs53.5 µs 12
traversal: edgesTov3 68.8 µs69.7 µs 106 µs65.7 µs 10002
traversal: edgesTogpu 53.8 µs54.1 µs 55.9 µs52.7 µs 12
traversal: parallelEdges + codirectedEdges (2 calls)v3 3.52 µs3.78 µs 4.48 µs3.40 µs 41
traversal: parallelEdges + codirectedEdges (2 calls)gpu 1.05 µs1.27 µs 2.08 µs1.04 µs 128
traversal: roots + leaves (2 calls)v3 5.17 ms5.62 ms 9.34 ms4.94 ms 120
traversal: roots + leaves (2 calls)gpu 386 µs393 µs 520 µs379 µs 1782
traversal: allAreNeighborsv3 194 µs207 µs 279 µs189 µs 3360
traversal: allAreNeighborsgpu 37.2 µs37.6 µs 38.8 µs36.8 µs 12
traversal: isLoop + isSimple (2 calls)v3 128 ns130 ns 172 ns125 ns 1316
traversal: isLoop + isSimple (2 calls)gpu 49.4 ns51.1 ns 77.1 ns48.2 ns 3352
degree: indegree + outdegree (2 calls)v3 3.43 µs3.75 µs 4.71 µs3.31 µs 42
degree: indegree + outdegree (2 calls)gpu 46.0 ns47.7 ns 81.8 ns45.5 ns 3580
degree: minDegree + maxDegree (2 calls)v3 15.9 ms17.0 ms 20.6 ms15.4 ms 37
degree: minDegree + maxDegree (2 calls)gpu 364 µs372 µs 530 µs357 µs 1882
degree: minIndegree + maxOutdegree (2 calls)v3 8.95 ms9.57 ms 13.2 ms8.75 ms 68
degree: minIndegree + maxOutdegree (2 calls)gpu 355 µs361 µs 465 µs344 µs 1938
dimensions: renderedPosition getv3 69.4 ns72.8 ns 130 ns67.5 ns 2332
dimensions: renderedPosition getgpu 30.3 ns35.3 ns 107 ns29.2 ns 4763
dimensions: relativePosition getv3 842 ns889 ns 1.21 µs797 ns 188
dimensions: relativePosition getgpu 73.2 ns77.4 ns 141 ns70.1 ns 2189
dimensions: width + height + outerWidth + outerHeight (4 calls)v3 602 ns609 ns 696 ns585 ns 279
dimensions: width + height + outerWidth + outerHeight (4 calls)gpu 241 ns244 ns 359 ns233 ns 696
dimensions: rendered dims (4 calls)v3 687 ns697 ns 832 ns667 ns 242
dimensions: rendered dims (4 calls)gpu 249 ns255 ns 365 ns248 ns 671
dimensions: renderedBoundingBoxv3 1.76 µs1.79 µs 2.18 µs1.69 µs 90
dimensions: renderedBoundingBoxgpu 918 ns934 ns 1.24 µs882 ns 178
dimensions: midpoint + renderedMidpoint (2 calls)gpu 1.10 µs1.10 µs 1.19 µs1.06 µs 147
dimensions: source/targetEndpoint (2 calls)gpu 363 ns369 ns 435 ns355 ns 460
dimensions: rendered source/targetEndpoint (2 calls)gpu 384 ns389 ns 452 ns369 ns 437
dimensions: shift + silentShift (round-trip)v3 293 µs303 µs 622 µs286 µs 2310
dimensions: shift + silentShift (round-trip)gpu 4.91 µs4.91 µs 5.03 µs4.83 µs 31
dimensions: silentPositionv3 873 ns877 ns 953 ns843 ns 191
dimensions: silentPositiongpu 53.2 ns55.3 ns 80.4 ns51.5 ns 3068
dimensions: positions( fn ) over 100v3 180 µs196 µs 342 µs171 µs 3554
dimensions: positions( fn ) over 100gpu 3.54 µs3.60 µs 4.29 µs3.44 µs 43
dimensions: padding + paddedWidth + paddedHeight (3 calls)v3 2.01 µs2.02 µs 2.24 µs1.97 µs 81
dimensions: padding + paddedWidth + paddedHeight (3 calls)gpu 162 ns165 ns 193 ns157 ns 1041
curves: isBundledBeziergpu 20.7 ns21.4 ns 33.5 ns19.6 ns 7927
curves: controlPoints + renderedControlPoints (2 calls)gpu 525 ns540 ns 739 ns513 ns 304
curves: segmentPoints (undefined for bezier)gpu 33.3 ns34.3 ns 49.9 ns32.1 ns 4978
compound: parent + parents + ancestors (3 calls)v3 2.92 µs3.20 µs 4.00 µs2.85 µs 49
compound: parent + parents + ancestors (3 calls)gpu 802 ns1.12 µs 2.37 µs770 ns 147
compound: children + descendants + siblings (3 calls)v3 8.52 µs8.56 µs 9.32 µs7.60 µs 16
compound: children + descendants + siblings (3 calls)gpu 1.78 µs2.25 µs 3.57 µs1.70 µs 70
compound: orphans + nonorphans (2 calls)v3 3.64 µs3.89 µs 4.70 µs3.52 µs 40
compound: orphans + nonorphans (2 calls)gpu 517 ns744 ns 3.00 µs506 ns 220
compound: commonAncestorsv3 9.40 µs9.62 µs 9.98 µs9.25 µs 14
compound: commonAncestorsgpu 77.7 ns80.8 ns 151 ns73.6 ns 2108
compound: isParent/isChild/isChildless/isOrphan (4 calls)v3 67.4 ns68.1 ns 79.0 ns60.6 ns 2522
compound: isParent/isChild/isChildless/isOrphan (4 calls)gpu 45.4 ns46.3 ns 57.0 ns44.2 ns 3694
flags: select + unselect + selected (band)v3 193 µs201 µs 397 µs186 µs 3480
flags: select + unselect + selected (band)gpu 11.8 µs11.8 µs 11.9 µs11.5 µs 11
flags: selectify + unselectify + selectablev3 190 µs196 µs 283 µs184 µs 3573
flags: selectify + unselectify + selectablegpu 2.02 µs2.04 µs 2.23 µs1.99 µs 80
flags: lock + unlock + lockedv3 189 µs196 µs 314 µs182 µs 3566
flags: lock + unlock + lockedgpu 2.04 µs2.05 µs 2.24 µs1.97 µs 80
flags: grabify + ungrabify + grabbablev3 190 µs198 µs 386 µs183 µs 3533
flags: grabify + ungrabify + grabbablegpu 2.02 µs2.03 µs 2.15 µs2.00 µs 81
flags: show + hide + visiblev3 2.57 ms2.67 ms 3.91 ms2.49 ms 257
flags: show + hide + visiblegpu 11.3 µs11.3 µs 11.5 µs11.1 µs 11
flags: active/activate/unactivate (3 calls)v3 191 µs197 µs 282 µs184 µs 3555
flags: active/activate/unactivate (3 calls)gpu 12.0 µs12.0 µs 12.1 µs12.0 µs 10
flags: panify + unpanify + pannablev3 190 µs196 µs 311 µs185 µs 3563
flags: panify + unpanify + pannablegpu 2.01 µs2.03 µs 2.14 µs1.96 µs 81
flags: takesUpSpace + interactive + transparent (3 calls)v3 194 ns199 ns 266 ns187 ns 856
flags: takesUpSpace + interactive + transparent (3 calls)gpu 64.7 ns67.4 ns 132 ns61.7 ns 2536
flags: effectiveOpacityv3 49.0 ns50.4 ns 64.8 ns47.0 ns 3409
flags: effectiveOpacitygpu 21.2 ns21.6 ns 35.5 ns20.2 ns 7961
element data: scratch get + setv3 1.29 µs1.29 µs 1.40 µs1.24 µs 129
element data: scratch get + setgpu 172 ns177 ns 258 ns171 ns 964
element data: json() one elementv3 299 ns385 ns 3.45 µs291 ns 425
element data: json() one elementgpu 149 ns190 ns 539 ns145 ns 849
element data: jsons() over 100v3 39.6 µs40.5 µs 43.1 µs38.7 µs 12
element data: jsons() over 100gpu 19.8 µs21.0 µs 24.0 µs15.8 µs 12
element data: label()gpu 15.2 ns15.8 ns 28.9 ns14.2 ns 10862
core: batch + per-id data() (was batchData, round 90)v3 2.49 µs2.57 µs 2.94 µs2.42 µs 61
core: batch + per-id data() (was batchData, round 90)gpu 263 ns351 ns 2.11 µs259 ns 471
core: animated()v3 7.58 ns7.81 ns 14.0 ns7.22 ns 21661
core: animated()gpu 1.56 ns1.60 ns 1.99 ns1.50 ns 103571
core: zoomRange getgpu 2.16 ns2.30 ns 6.28 ns2.05 ns 72156
core: resize() / invalidateSize()v3 314 ns317 ns 385 ns301 ns 533
core: resize() / invalidateSize()gpu 127 ns130 ns 161 ns123 ns 1309
core: on('render') + off('render') (was onRender/offRender, round 90)v3 462 ns522 ns 1.09 µs454 ns 322
core: on('render') + off('render') (was onRender/offRender, round 90)gpu 195 ns202 ns 337 ns188 ns 818
core: removeScratch()v3 2.75 ms2.79 ms 3.30 ms2.69 ms 246
core: removeScratch()gpu 278 ns282 ns 330 ns268 ns 603
core: selectionType getv3 4.51 ns4.73 ns 8.58 ns4.26 ns 35909
core: selectionType getgpu 2.26 ns2.40 ns 6.21 ns2.10 ns 69527
core: isReady()v3 3.26 ns3.34 ns 6.51 ns3.18 ns 50430
core: isReady()gpu 1.48 ns1.53 ns 2.01 ns1.45 ns 107570
core: window()v3 4.10 ns4.24 ns 7.79 ns4.01 ns 39847
core: window()gpu 1.48 ns1.53 ns 1.91 ns1.45 ns 107941
core: container()v3 3.93 ns4.04 ns 8.25 ns3.75 ns 41929
core: container()gpu 1.48 ns1.53 ns 1.90 ns1.45 ns 107666
core: destroyed()v3 3.32 ns3.44 ns 6.44 ns3.18 ns 48890
core: destroyed()gpu 1.48 ns1.53 ns 2.31 ns1.45 ns 106940
core: removeAllListeners()v3 13.8 ns14.3 ns 25.0 ns13.3 ns 11901
core: removeAllListeners()gpu 1.59 ns1.65 ns 2.67 ns1.55 ns 99426
collection: cy()v3 7.58 ns8.13 ns 15.2 ns7.17 ns 20890
collection: cy()gpu 2.16 ns2.37 ns 6.09 ns2.06 ns 70095
collection: indexOfId()v3 66.1 ns67.8 ns 88.4 ns64.7 ns 2524
collection: indexOfId()gpu 37.8 ns38.4 ns 52.0 ns36.9 ns 4462
collection: removed() + inside() (2 calls)v3 17.6 ns17.9 ns 24.7 ns17.3 ns 9523
collection: removed() + inside() (2 calls)gpu 15.1 ns15.4 ns 24.5 ns14.6 ns 11139
collection: silentPositions( fn ) over 100v3 112 µs116 µs 198 µs108 µs 6034
collection: silentPositions( fn ) over 100gpu 3.67 µs3.65 µs 3.79 µs3.47 µs 43
collection: animated()v3 12.2 ns12.4 ns 21.4 ns11.7 ns 13848
collection: animated()gpu 4.19 ns4.33 ns 8.24 ns4.00 ns 38951
collection: delayAnimation()v3 458 ns583 ns 1.96 µs449 ns 287
collection: delayAnimation()gpu 165 ns170 ns 242 ns159 ns 990
collection: removeScratch()v3 1.79 µs1.80 µs 2.01 µs1.72 µs 91
collection: removeScratch()gpu 202 ns206 ns 241 ns197 ns 831
collection: component()v3 78.8 ms80.9 ms 87.2 ms74.8 ms 12
collection: component()gpu 1.84 ms2.04 ms 5.31 ms1.79 ms 338
collection: layoutDimensions()v3 616 ns632 ns 817 ns601 ns 267
collection: layoutDimensions()gpu 187 ns194 ns 313 ns185 ns 877
degree: maxIndegree + minOutdegree (2 calls)v3 8.89 ms9.59 ms 13.3 ms8.70 ms 69
degree: maxIndegree + minOutdegree (2 calls)gpu 355 µs362 µs 464 µs342 µs 1937
flags: grabbed + hidden + inactive (3 calls)v3 84.5 ns85.8 ns 104 ns78.8 ns 1994
flags: grabbed + hidden + inactive (3 calls)gpu 38.4 ns39.6 ns 61.3 ns36.2 ns 4327
curves: renderedSegmentPointsgpu 36.1 ns37.4 ns 64.0 ns34.3 ns 4578
layout contract: edgeSlots + endpoints + degreeOfgpu 34.5 µs36.3 µs 64.4 µs29.5 µs 18950
formats: isColumnarElements + isSerializedElements + isPackedIdsgpu 4.52 ns4.73 ns 10.5 ns4.51 ns 35620

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
218 µs
cpu pick: node hit — compacted
48.9 µs
isCurrent: current ref (forwards present vs absent) — no forwards (peak)
5.95 ns
isCurrent: current ref (forwards present vs absent) — forwards present (compacted)
5.90 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
49.1 ns
control: nodes({ selected }) scan (order-list, expected parity) — peak
25.2 µs
control: nodes({ selected }) scan (order-list, expected parity) — compacted
21.6 µs
control: whole-graph boundingBox (expected parity) — peak
112 µs
control: whole-graph boundingBox (expected parity) — compacted
112 µ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 314 µs201 µs 3246
cpu pick: background miss (full highWater walk)compacted 48.7 µs49.3 µs 50.4 µs48.4 µs 12
cpu pick: node hitpeak 218 µs225 µs 406 µs212 µs 3115
cpu pick: node hitcompacted 48.9 µs49.3 µs 49.8 µs48.5 µs 12
isCurrent: current ref (forwards present vs absent)no forwards (peak) 5.95 ns6.13 ns 10.4 ns5.69 ns 27553
isCurrent: current ref (forwards present vs absent)forwards present (compacted) 5.90 ns6.06 ns 10.6 ns5.63 ns 27978
isCurrent: stale-ref repair (chase + rewrite, alloc included)current (baseline alloc) 8.89 ns9.51 ns 21.7 ns8.36 ns 17761
isCurrent: stale-ref repair (chase + rewrite, alloc included)stale → repair 49.1 ns50.5 ns 68.7 ns47.8 ns 3388
control: nodes({ selected }) scan (order-list, expected parity)peak 25.2 µs26.7 µs 33.1 µs21.2 µs 12
control: nodes({ selected }) scan (order-list, expected parity)compacted 21.6 µs22.6 µs 24.6 µs21.3 µs 12
control: whole-graph boundingBox (expected parity)peak 112 µs117 µs 186 µs109 µs 5958
control: whole-graph boundingBox (expected parity)compacted 112 µs115 µs 177 µs109 µs 6089

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

parent drag (shift subtree + bb settle)
183×
child drag (move + parent re-derive)
50×
reparent round-trip
77×
1 µs10 µs100 µs1 ms
All stats (table view)
groupbenchp50avgp99minsamples
parent drag (shift subtree + bb settle)v3 252 µs276 µs 618 µs239 µs 2524
parent drag (shift subtree + bb settle)gpu 1.38 µs1.44 µs 2.17 µs1.31 µs 110
child drag (move + parent re-derive)v3 80.1 µs85.3 µs 124 µs75.5 µs 7963
child drag (move + parent re-derive)gpu 1.62 µs1.65 µs 1.99 µs1.57 µs 98
reparent round-tripv3 83.0 µs88.2 µs 128 µs79.8 µs 7705
reparent round-tripgpu 1.08 µs1.08 µs 1.18 µs1.04 µs 148

curves N=2,000 · 1.6 s

curve premium: build (style apply + derivation) — curved
12.0 ms
curve premium: build (style apply + derivation) — straight
6.64 ms
curve premium: node.position x 1000 (drag) — curved
377 µs
curve premium: node.position x 1000 (drag) — straight
326 µs
curve premium: nodes().positions() (bulk move) — curved
309 µs
curve premium: nodes().positions() (bulk move) — straight
296 µs
curve premium: first read after a bulk move (cold) — curved
5.59 ms
curve premium: first read after a bulk move (cold) — straight
2.71 ms
curve premium: same read again (warm) — curved
1.43 ms
curve premium: same read again (warm) — straight
1.42 ms
curve premium: edge.midpoint x 4000 — curved
2.37 ms
curve premium: edge.midpoint x 4000 — straight
4.21 ms
curve premium: edge.controlPoints x 4000 — curved
2.39 ms
curve premium: edge.controlPoints x 4000 — straight
1.43 ms
curve premium: cy.elements().boundingBox() x 20 — curved
17.7 ms
curve premium: cy.elements().boundingBox() x 20 — straight
21.0 ms
curve premium: cy.fit() x 20 (store scan) — curved
3.69 ms
curve premium: cy.fit() x 20 (store scan) — straight
3.38 ms
curve premium: elementsInBox x 20 (half the graph) — curved
24.3 ms
curve premium: elementsInBox x 20 (half the graph) — straight
6.03 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — curved
3.72 ms
curve premium: edge.hide/show x 1000 (bundle re-fan) — straight
2.29 ms
100 µs1 ms10 ms100 ms
All stats (table view)
groupbenchp50avgp99minsamples
curve premium: build (style apply + derivation)curved 12.0 ms12.0 ms 12.0 ms12.0 ms 1
curve premium: build (style apply + derivation)straight 6.64 ms6.64 ms 6.64 ms6.64 ms 1
curve premium: node.position x 1000 (drag)curved 377 µs377 µs 377 µs377 µs 1
curve premium: node.position x 1000 (drag)straight 326 µs326 µs 326 µs326 µs 1
curve premium: nodes().positions() (bulk move)curved 309 µs309 µs 309 µs309 µs 1
curve premium: nodes().positions() (bulk move)straight 296 µs296 µs 296 µs296 µs 1
curve premium: first read after a bulk move (cold)curved 5.59 ms5.59 ms 5.59 ms5.59 ms 1
curve premium: first read after a bulk move (cold)straight 2.71 ms2.71 ms 2.71 ms2.71 ms 1
curve premium: same read again (warm)curved 1.43 ms1.43 ms 1.43 ms1.43 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.37 ms2.37 ms 2.37 ms2.37 ms 1
curve premium: edge.midpoint x 4000straight 4.21 ms4.21 ms 4.21 ms4.21 ms 1
curve premium: edge.controlPoints x 4000curved 2.39 ms2.39 ms 2.39 ms2.39 ms 1
curve premium: edge.controlPoints x 4000straight 1.43 ms1.43 ms 1.43 ms1.43 ms 1
curve premium: cy.elements().boundingBox() x 20curved 17.7 ms17.7 ms 17.7 ms17.7 ms 1
curve premium: cy.elements().boundingBox() x 20straight 21.0 ms21.0 ms 21.0 ms21.0 ms 1
curve premium: cy.fit() x 20 (store scan)curved 3.69 ms3.69 ms 3.69 ms3.69 ms 1
curve premium: cy.fit() x 20 (store scan)straight 3.38 ms3.38 ms 3.38 ms3.38 ms 1
curve premium: elementsInBox x 20 (half the graph)curved 24.3 ms24.3 ms 24.3 ms24.3 ms 1
curve premium: elementsInBox x 20 (half the graph)straight 6.03 ms6.03 ms 6.03 ms6.03 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)curved 3.72 ms3.72 ms 3.72 ms3.72 ms 1
curve premium: edge.hide/show x 1000 (bundle re-fan)straight 2.29 ms2.29 ms 2.29 ms2.29 ms 1

arrows N=2,000 · 8.7 s

arrow premium: build (style apply + arrow fold) — arrowed
6.68 ms
arrow premium: build (style apply + arrow fold) — none
6.34 ms
arrow premium: cy.style() re-apply x 4 — arrowed
7.95 ms
arrow premium: cy.style() re-apply x 4 — none
7.99 ms
arrow premium: node.position x 200000 (drag) — arrowed
21.7 ms
arrow premium: node.position x 200000 (drag) — none
21.8 ms
arrow premium: edge.sourceEndpoint x 200000 — arrowed
62.1 ms
arrow premium: edge.sourceEndpoint x 200000 — none
59.1 ms
arrow premium: edge.targetEndpoint x 200000 — arrowed
59.9 ms
arrow premium: edge.targetEndpoint x 200000 — none
59.7 ms
arrow premium: edge.midpoint x 200000 — arrowed
141 ms
arrow premium: edge.midpoint x 200000 — none
137 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — arrowed
33.3 ms
arrow premium: edge.style('target-arrow-shape') x 200000 — none
27.3 ms
arrow premium: cy.elements().boundingBox() x 20 — arrowed
18.4 ms
arrow premium: cy.elements().boundingBox() x 20 — none
17.7 ms
arrow premium: elementsInBox x 20 (half the graph) — arrowed
5.45 ms
arrow premium: elementsInBox x 20 (half the graph) — none
5.38 ms
arrow premium: control: sourceEndpoint, bezier vs straight — arrowed
74.1 ms
arrow premium: control: sourceEndpoint, bezier vs straight — none
58.7 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.68 ms6.68 ms 6.68 ms6.68 ms 1
arrow premium: build (style apply + arrow fold)none 6.34 ms6.34 ms 6.34 ms6.34 ms 1
arrow premium: cy.style() re-apply x 4arrowed 7.95 ms7.95 ms 7.95 ms7.95 ms 1
arrow premium: cy.style() re-apply x 4none 7.99 ms7.99 ms 7.99 ms7.99 ms 1
arrow premium: node.position x 200000 (drag)arrowed 21.7 ms21.7 ms 21.7 ms21.7 ms 1
arrow premium: node.position x 200000 (drag)none 21.8 ms21.8 ms 21.8 ms21.8 ms 1
arrow premium: edge.sourceEndpoint x 200000arrowed 62.1 ms62.1 ms 62.1 ms62.1 ms 1
arrow premium: edge.sourceEndpoint x 200000none 59.1 ms59.1 ms 59.1 ms59.1 ms 1
arrow premium: edge.targetEndpoint x 200000arrowed 59.9 ms59.9 ms 59.9 ms59.9 ms 1
arrow premium: edge.targetEndpoint x 200000none 59.7 ms59.7 ms 59.7 ms59.7 ms 1
arrow premium: edge.midpoint x 200000arrowed 141 ms141 ms 141 ms141 ms 1
arrow premium: edge.midpoint x 200000none 137 ms137 ms 137 ms137 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000arrowed 33.3 ms33.3 ms 33.3 ms33.3 ms 1
arrow premium: edge.style('target-arrow-shape') x 200000none 27.3 ms27.3 ms 27.3 ms27.3 ms 1
arrow premium: cy.elements().boundingBox() x 20arrowed 18.4 ms18.4 ms 18.4 ms18.4 ms 1
arrow premium: cy.elements().boundingBox() x 20none 17.7 ms17.7 ms 17.7 ms17.7 ms 1
arrow premium: elementsInBox x 20 (half the graph)arrowed 5.45 ms5.45 ms 5.45 ms5.45 ms 1
arrow premium: elementsInBox x 20 (half the graph)none 5.38 ms5.38 ms 5.38 ms5.38 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightarrowed 74.1 ms74.1 ms 74.1 ms74.1 ms 1
arrow premium: control: sourceEndpoint, bezier vs straightnone 58.7 ms58.7 ms 58.7 ms58.7 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
85.8 ms
labels: estimateBlock x 20000 — gpu
89.0 ms
labels: addNode x 20000 — gpu
28.4 ms
labels: setLabel (build) x 20000 — gpu
97.1 ms
labels: setLabel (rewrite) x 20000 — gpu
101 ms
labels: boundingBox with 20000 label terms — gpu
3.05 ms
labels: computeSdf tier 1 (30x42) x 96 glyphs — gpu
14.3 ms
labels: computeSdf tier 2 (59x85) x 96 glyphs — gpu
38.6 ms
1 ms10 ms100 ms1 s
All stats (table view)
groupbenchp50avgp99minsamples
labels: breakLines x 20000gpu 85.8 ms85.8 ms 85.8 ms85.8 ms 1
labels: estimateBlock x 20000gpu 89.0 ms89.0 ms 89.0 ms89.0 ms 1
labels: addNode x 20000gpu 28.4 ms28.4 ms 28.4 ms28.4 ms 1
labels: setLabel (build) x 20000gpu 97.1 ms97.1 ms 97.1 ms97.1 ms 1
labels: setLabel (rewrite) x 20000gpu 101 ms101 ms 101 ms101 ms 1
labels: boundingBox with 20000 label termsgpu 3.05 ms3.05 ms 3.05 ms3.05 ms 1
labels: computeSdf tier 1 (30x42) x 96 glyphsgpu 14.3 ms14.3 ms 14.3 ms14.3 ms 1
labels: computeSdf tier 2 (59x85) x 96 glyphsgpu 38.6 ms38.6 ms 38.6 ms38.6 ms 1

transitions N=2,000 · 28.8 s

transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions off
1.16 ms
transition: auto-extent shift, whole-channel re-derive (2000 slots) — transitions on
3.52 ms
transition: bulk tween tick (2000 slots, one manager tick) — tick
128 µs
transition: explicit-domain write (O(changed) — one element) — transitions off
14.4 µs
transition: explicit-domain write (O(changed) — one element) — transitions on
18.2 µs
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions off
2.05 ms
transition: sheet swap, whole-graph apply (2000 slots diff + tween) — transitions on
4.75 ms
10 µs100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions off 1.16 ms1.25 ms 2.77 ms1.10 ms 558
transition: auto-extent shift, whole-channel re-derive (2000 slots)transitions on 3.52 ms3.72 ms 5.46 ms3.30 ms 182
transition: bulk tween tick (2000 slots, one manager tick)tick 128 µs132 µs 222 µs123 µs 5300
transition: explicit-domain write (O(changed) — one element)transitions off 14.4 µs14.9 µs 16.2 µs13.9 µs 12
transition: explicit-domain write (O(changed) — one element)transitions on 18.2 µs18.5 µs 19.4 µs17.9 µs 12
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions off 2.05 ms2.08 ms 2.45 ms2.00 ms 334
transition: sheet swap, whole-graph apply (2000 slots diff + tween)transitions on 4.75 ms4.41 ms 6.57 ms3.46 ms 154

geometry-tween N=2,000 · 32.6 s

size tick: unlabelled (2000 slots) — tick
567 µs
size tick: labelled, center/center (re-anchor early-out) (2000 slots) — tick
588 µs
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots) — tick
1.24 ms
edge width tick (4000 slots) — bare
276 µs
edge width tick (4000 slots) — with rides (casing + match-line arrows)
712 µs
padding tick + auto-bounds flush (250 parents × 8 children) — tick + flush
177 µs
font-size tick (2000 labels) — wrap none (dims scale-patch)
369 µs
font-size tick (2000 labels) — wrapped (re-break per tick)
5.54 ms
baseline: paint (opacity) tick (2000 slots) — tick
146 µs
100 µs1 ms10 ms
All stats (table view)
groupbenchp50avgp99minsamples
size tick: unlabelled (2000 slots)tick 567 µs601 µs 1.18 ms549 µs 1144
size tick: labelled, center/center (re-anchor early-out) (2000 slots)tick 588 µs619 µs 1.05 ms570 µs 1112
size tick: labelled, hanging (sidecar rewrite per tick) (2000 slots)tick 1.24 ms1.31 ms 2.21 ms1.10 ms 516
edge width tick (4000 slots)bare 276 µs284 µs 397 µs267 µs 2442
edge width tick (4000 slots)with rides (casing + match-line arrows) 712 µs721 µs 960 µs680 µs 964
padding tick + auto-bounds flush (250 parents × 8 children)tick + flush 177 µs183 µs 358 µs170 µs 3800
font-size tick (2000 labels)wrap none (dims scale-patch) 369 µs385 µs 891 µs320 µs 1796
font-size tick (2000 labels)wrapped (re-break per tick) 5.54 ms5.58 ms 6.08 ms5.16 ms 119
baseline: paint (opacity) tick (2000 slots)tick 146 µs151 µs 248 µs141 µs 4612