Across commits — quick profile

Intel Core i9-9900K 8c/16t · 62.6 GiB · CoffeeLake-S GT2 [UHD Graphics 630] + Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (8.0 GiB) · machine id 5cf3f79c

6 runs, oldest first. Only runs from this machine are compared — a cross-machine line would be a hardware history wearing a performance history's clothes.

  1. dc6d3505 · 2026-08-05 18:11 — round 46.5 baseline: CPU/collection quick profile
  2. e37d2444 · 2026-08-09 16:39 — round 60 baseline: quick profile after the round-59 force rebuild and round-60 tooling
  3. 6df994f1 · 2026-08-09 23:08
  4. d4ff0730 · 2026-08-10 18:18 — round 65 baseline: quick profile after the async algorithm tier (65.1) and the kernel perf pass (65.8) — the algorithm rows here are the CPU executor, which 65.8 also sped up (AP build fix, typed median)
  5. 54062c08 · 2026-08-11 14:54 — round 65.12: first --repeat 3 run — each row is the median of three processes and carries the band they spanned. Replicate A of a same-commit pair published to give the new harness epoch its measured noise floor.
  6. 54062c08 · 2026-08-11 15:16 — round 65.12: replicate B, same commit and harness as A. Any change between the two is noise by construction — the pair exists so the comparison has a measured band to screen against, and so the screen's own false-positive rate is on the record (1 of 217 rows here, against 6 under a flat ±10%).

Of the 219 rows that could be compared, none moved beyond its own measured noise in the slower direction. 1 moved beyond it faster. 5 other row(s) moved beyond ±10% but carry no evidence about their own noise — listed below, ranked nowhere.

Drift: across the 219 row measurements shared between consecutive runs, the geometric mean change is +0.1%. A row moving near that factor is the box (thermals, load, driver), not the commit — and the frozen twin beside each mover is the same control per row, since v3 (and, for the executor sweep, the cpu side) is not what changed.

Runs are grouped by machine and by harness version. The benchmark harness has been corrected several times — most consequentially round 62.5c, which equalised inline-cache state between the v3 and v4 sides and moved v4 rows 12–35% with the library untouched. Rows measured across such a change are not comparable, so this page shows a ⋮ harness break instead of a change. Within one epoch, a change is screened against the row's own run-to-run band where the run was made with --repeat.

Slower than the previous run (beyond ±10%, evidence-backed)

No v4 row moved beyond its own measured noise in the slower direction.

Faster than the previous run (beyond ±10%, evidence-backed)

rowp50changenoise controlevidencespan
mutators · mut-bulk: select + unselect [gpu] 274 µs → 243 µs −11.3% +1.3% (v3 twin) median of 3, band +9.2% 54062c08 → 54062c08
Moved, but unscreened 5 row(s) — one-shot, or inside their own run-to-run band. Not evidence of anything, in either direction.
rowp50changenoise controlwhy unscreenedspan
core+collection · traverse: connectedEdges() [gpu] 383 ns → 454 ns +19% −3.4% (v3 twin) inside the row's own 24% run-to-run band 54062c08 → 54062c08
algorithms · algo: kMedoids [gpu] 41.7 ms → 34.9 ms −16.3% +42% (v3 twin) inside the row's own 49% run-to-run band 54062c08 → 54062c08
core+collection · traverse: outgoers() [gpu] 443 ns → 497 ns +12% −4.0% (v3 twin) inside the row's own 27% run-to-run band 54062c08 → 54062c08
core+collection · traverse: neighborhood() [gpu] 943 ns → 1.06 µs +12% −1.1% (v3 twin) inside the row's own 17% run-to-run band 54062c08 → 54062c08
core+collection · traverse: incomers() [gpu] 445 ns → 494 ns +11% −2.3% (v3 twin) inside the row's own 28% run-to-run band 54062c08 → 54062c08

Every row, every run

Each cell is that run's p50 with its change against the nearest earlier run that measured the same row. A dash means the run did not measure it (a --suite filter, or the row did not exist yet) — gaps are shown, never dropped.

core+collection n=2000 · 72 rows
row dc6d3505
2026-08-05
e37d2444
2026-08-09
6df994f1
2026-08-09
d4ff0730
2026-08-10
54062c08
2026-08-11
54062c08
2026-08-11
core: getElementById() [v3]83.1 ns87.3 ns ⋮ harness73.5 ns −15.8%100 ns ⋮ harness89.8 ns ⋮ harness90.3 ns +0.5%
core: getElementById() [gpu]93.5 ns92.1 ns ⋮ harness92.1 ns −0.1%84.7 ns ⋮ harness91.3 ns ⋮ harness92.1 ns +0.9%
core: id lookup ($("#id") vs $id()) [v3]2.63 µs2.42 µs ⋮ harness2.44 µs +0.7%2.06 µs ⋮ harness2.01 µs ⋮ harness2.08 µs +3.1%
core: id lookup ($("#id") vs $id()) [gpu]84.7 ns80.0 ns ⋮ harness85.2 ns +6.6%77.5 ns ⋮ harness85.2 ns ⋮ harness85.0 ns −0.2%
core: nodes() [v3]415 µs418 µs ⋮ harness427 µs +2.1%426 µs ⋮ harness414 µs ⋮ harness419 µs +1.2%
core: nodes() [gpu]89.0 ns81.0 ns ⋮ harness82.0 ns +1.2%8.21 ns ⋮ harness8.20 ns ⋮ harness8.19 ns −0.1%
core: edges() [v3]729 µs733 µs ⋮ harness732 µs −0.1%753 µs ⋮ harness720 µs ⋮ harness723 µs +0.5%
core: edges() [gpu]33.0 ns31.0 ns ⋮ harness32.0 ns +3.2%8.10 ns ⋮ harness7.93 ns ⋮ harness7.73 ns −2.5%
core: elements() [v3]139 µs135 µs ⋮ harness152 µs +13%140 µs ⋮ harness139 µs ⋮ harness140 µs +0.6%
core: elements() [gpu]8.49 ns39.0 ns ⋮ harness8.43 ns −78.4%6.99 ns ⋮ harness6.95 ns ⋮ harness6.98 ns +0.5%
core: nodes ($("node") vs filter({group})) [v3]545 µs538 µs ⋮ harness538 µs +0.1%556 µs ⋮ harness556 µs ⋮ harness548 µs −1.5%
core: nodes ($("node") vs filter({group})) [gpu]77.9 µs62.5 µs ⋮ harness69.8 µs +12%100 µs ⋮ harness113 µs ⋮ harness111 µs −2.0%
core: selected ($(":selected") vs filter({selected})) [v3]354 µs333 µs ⋮ harness354 µs +6.4%339 µs ⋮ harness340 µs ⋮ harness327 µs −3.8%
core: selected ($(":selected") vs filter({selected})) [gpu]25.2 µs25.7 µs ⋮ harness25.2 µs −1.7%25.8 µs ⋮ harness25.1 µs ⋮ harness24.5 µs −2.3%
core: filter(fn) [v3]424 µs418 µs ⋮ harness424 µs +1.3%417 µs ⋮ harness415 µs ⋮ harness411 µs −0.9%
core: filter(fn) [gpu]257 µs260 µs ⋮ harness263 µs +1.4%351 µs ⋮ harness426 µs ⋮ harness422 µs −1.0%
core: collection() [v3]461 ns463 ns ⋮ harness464 ns +0.1%493 ns ⋮ harness458 ns ⋮ harness461 ns +0.8%
core: collection() [gpu]54.8 ns54.7 ns ⋮ harness57.1 ns +4.5%67.5 ns ⋮ harness66.1 ns ⋮ harness65.9 ns −0.3%
core: pan() get [v3]6.31 ns5.99 ns ⋮ harness6.04 ns +0.8%
core: pan() get [gpu]6.57 ns6.68 ns ⋮ harness6.57 ns −1.6%
core: extent() [v3]21.9 ns22.0 ns ⋮ harness21.8 ns −0.9%23.0 ns ⋮ harness22.6 ns ⋮ harness22.6 ns +0.2%
core: extent() [gpu]21.7 ns21.5 ns ⋮ harness21.6 ns +0.3%20.8 ns ⋮ harness20.8 ns ⋮ harness20.8 ns +0.0%
core: add + remove [v3]122 µs121 µs ⋮ harness124 µs +2.5%133 µs ⋮ harness125 µs ⋮ harness122 µs −2.0%
core: add + remove [gpu]7.37 µs7.71 µs ⋮ harness6.99 µs −9.4%7.09 µs ⋮ harness7.09 µs ⋮ harness7.09 µs +0.0%
core: zoom set [v3]1.23 µs1.27 µs ⋮ harness1.22 µs −4.1%1.21 µs ⋮ harness1.36 µs ⋮ harness1.39 µs +2.3%
core: zoom set [gpu]662 ns631 ns ⋮ harness671 ns +6.3%657 ns ⋮ harness602 ns ⋮ harness597 ns −0.8%
traverse: neighborhood() [v3]3.70 µs3.60 µs ⋮ harness3.93 µs +9.1%3.70 µs ⋮ harness3.67 µs ⋮ harness3.63 µs −1.1%
traverse: neighborhood() [gpu]862 ns827 ns ⋮ harness886 ns +7.2%938 ns ⋮ harness943 ns ⋮ harness1.06 µs +12%
traverse: connectedEdges() [v3]1.01 µs1.06 µs ⋮ harness1.04 µs −2.0%1.01 µs ⋮ harness1.05 µs ⋮ harness1.02 µs −3.4%
traverse: connectedEdges() [gpu]471 ns438 ns ⋮ harness468 ns +6.8%378 ns ⋮ harness383 ns ⋮ harness454 ns +19%
traverse: outgoers() [v3]2.30 µs2.42 µs ⋮ harness2.43 µs +0.8%2.30 µs ⋮ harness2.41 µs ⋮ harness2.32 µs −4.0%
traverse: outgoers() [gpu]432 ns423 ns ⋮ harness440 ns +4.0%455 ns ⋮ harness443 ns ⋮ harness497 ns +12%
traverse: incomers() [v3]2.31 µs2.43 µs ⋮ harness2.47 µs +1.7%2.60 µs ⋮ harness2.40 µs ⋮ harness2.34 µs −2.3%
traverse: incomers() [gpu]438 ns431 ns ⋮ harness453 ns +5.0%424 ns ⋮ harness445 ns ⋮ harness494 ns +11%
traverse: components() [v3]78.9 ms80.7 ms ⋮ harness82.4 ms +2.1%77.9 ms ⋮ harness79.0 ms ⋮ harness78.6 ms −0.5%
traverse: components() [gpu]2.03 ms1.95 ms ⋮ harness1.97 ms +1.3%2.02 ms ⋮ harness2.01 ms ⋮ harness1.98 ms −1.3%
degree: node.degree() [v3]3.50 µs3.40 µs ⋮ harness3.36 µs −1.2%3.39 µs ⋮ harness3.38 µs ⋮ harness3.33 µs −1.6%
degree: node.degree() [gpu]25.0 ns23.9 ns ⋮ harness24.1 ns +0.8%27.9 ns ⋮ harness27.8 ns ⋮ harness27.9 ns +0.5%
degree: nodes.totalDegree() [v3]7.46 ms7.67 ms ⋮ harness7.74 ms +1.0%7.09 ms ⋮ harness7.25 ms ⋮ harness7.67 ms +5.7%
degree: nodes.totalDegree() [gpu]38.0 µs38.5 µs ⋮ harness44.3 µs +15%43.6 µs ⋮ harness44.7 µs ⋮ harness44.7 µs +0.1%
degree: nodes.maxDegree() [v3]7.82 ms7.17 ms ⋮ harness7.35 ms +2.6%7.28 ms ⋮ harness7.83 ms ⋮ harness7.41 ms −5.4%
degree: nodes.maxDegree() [gpu]52.0 µs53.1 µs ⋮ harness53.8 µs +1.3%51.5 µs ⋮ harness52.0 µs ⋮ harness51.7 µs −0.6%
data: get [v3]25.8 ns25.9 ns ⋮ harness26.2 ns +1.3%30.6 ns ⋮ harness30.3 ns ⋮ harness29.8 ns −1.5%
data: get [gpu]24.8 ns24.7 ns ⋮ harness23.7 ns −4.0%25.8 ns ⋮ harness29.7 ns ⋮ harness29.8 ns +0.4%
position: get [v3]23.8 ns24.2 ns ⋮ harness23.9 ns −1.5%34.4 ns ⋮ harness35.7 ns ⋮ harness35.2 ns −1.2%
position: get [gpu]32.0 ns27.2 ns ⋮ harness26.1 ns −4.0%20.9 ns ⋮ harness21.8 ns ⋮ harness22.0 ns +1.0%
json: element [v3]292 ns293 ns ⋮ harness293 ns −0.1%301 ns ⋮ harness302 ns ⋮ harness298 ns −1.3%
json: element [gpu]342 ns335 ns ⋮ harness332 ns −0.8%152 ns ⋮ harness159 ns ⋮ harness159 ns +0.3%
set: union() [v3]94.3 µs92.5 µs ⋮ harness93.1 µs +0.6%90.7 µs ⋮ harness92.6 µs ⋮ harness94.1 µs +1.6%
set: union() [gpu]16.6 µs17.1 µs ⋮ harness16.7 µs −2.5%18.1 µs ⋮ harness18.0 µs ⋮ harness17.0 µs −5.8%
set: intersection() [v3]88.5 µs94.8 µs ⋮ harness90.2 µs −4.9%91.1 µs ⋮ harness89.2 µs ⋮ harness90.6 µs +1.6%
set: intersection() [gpu]3.27 µs3.37 µs ⋮ harness3.38 µs +0.4%3.46 µs ⋮ harness3.45 µs ⋮ harness3.58 µs +3.6%
set: difference() [v3]90.8 µs94.6 µs ⋮ harness90.2 µs −4.6%90.4 µs ⋮ harness90.9 µs ⋮ harness91.8 µs +1.1%
set: difference() [gpu]3.23 µs3.35 µs ⋮ harness3.28 µs −2.0%3.44 µs ⋮ harness3.42 µs ⋮ harness3.55 µs +3.9%
iter: map() [v3]26.3 µs23.3 µs ⋮ harness25.2 µs +7.9%25.5 µs ⋮ harness27.5 µs ⋮ harness28.5 µs +3.9%
iter: map() [gpu]10.2 µs10.0 µs ⋮ harness9.70 µs −3.2%10.3 µs ⋮ harness10.6 µs ⋮ harness10.3 µs −2.2%
iter: forEach() [v3]3.49 µs3.45 µs ⋮ harness3.48 µs +0.9%3.48 µs ⋮ harness3.51 µs ⋮ harness3.50 µs −0.3%
iter: forEach() [gpu]3.44 µs5.10 µs ⋮ harness3.50 µs −31.3%3.34 µs ⋮ harness3.36 µs ⋮ harness3.30 µs −1.9%
iter: filter(fn) [v3]224 µs218 µs ⋮ harness222 µs +1.9%244 µs ⋮ harness248 µs ⋮ harness247 µs −0.5%
iter: filter(fn) [gpu]99.9 µs105 µs ⋮ harness102 µs −3.5%127 µs ⋮ harness130 µs ⋮ harness135 µs +3.8%
compare: same() [v3]114 µs122 µs ⋮ harness118 µs −3.8%119 µs ⋮ harness122 µs ⋮ harness116 µs −4.3%
compare: same() [gpu]12.0 ns12.2 ns ⋮ harness12.5 ns +2.2%15.0 ns ⋮ harness14.9 ns ⋮ harness14.9 ns −0.0%
compare: contains() [v3]6.11 µs6.74 µs ⋮ harness6.17 µs −8.5%6.21 µs ⋮ harness6.24 µs ⋮ harness5.95 µs −4.7%
compare: contains() [gpu]1.25 µs1.39 µs ⋮ harness1.25 µs −9.6%1.24 µs ⋮ harness1.24 µs ⋮ harness1.24 µs −0.2%
mut: data set [v3]479 ns492 ns ⋮ harness465 ns −5.3%419 ns ⋮ harness600 ns ⋮ harness603 ns +0.6%
mut: data set [gpu]744 ns773 ns ⋮ harness803 ns +3.8%106 ns ⋮ harness238 ns ⋮ harness235 ns −1.2%
mut: position set [v3]1.20 µs1.20 µs ⋮ harness1.25 µs +4.5%1.21 µs ⋮ harness1.20 µs ⋮ harness1.23 µs +2.8%
mut: position set [gpu]59.0 ns57.8 ns ⋮ harness52.4 ns −9.3%48.6 ns ⋮ harness49.3 ns ⋮ harness52.7 ns +7.0%
mut: select + unselect [v3]2.46 µs2.56 µs ⋮ harness2.69 µs +5.2%2.62 µs ⋮ harness2.56 µs ⋮ harness2.53 µs −1.1%
mut: select + unselect [gpu]106 ns4.92 µs ⋮ harness654 ns −86.7%665 ns ⋮ harness593 ns ⋮ harness604 ns +1.9%
core: pan() get (x32) [v3]45.5 ns44.6 ns ⋮ harness44.7 ns +0.2%
core: pan() get (x32) [gpu]36.1 ns34.0 ns ⋮ harness35.8 ns +5.2%
materializers n=2000 · 16 rows
row dc6d3505
2026-08-05
e37d2444
2026-08-09
6df994f1
2026-08-09
d4ff0730
2026-08-10
54062c08
2026-08-11
54062c08
2026-08-11
sweep: nodes() [v3]421 µs422 µs ⋮ harness473 µs +12%424 µs ⋮ harness415 µs −2.1%409 µs −1.5%
sweep: nodes() [gpu]30.0 ns29.0 ns ⋮ harness30.0 ns +3.4%2.46 ns ⋮ harness2.41 ns −2.0%2.41 ns +0.2%
sweep: edges() [v3]729 µs723 µs ⋮ harness834 µs +15%724 µs ⋮ harness718 µs −0.9%702 µs −2.2%
sweep: edges() [gpu]95.0 ns79.0 ns ⋮ harness79.0 ns +0.0%2.56 ns ⋮ harness2.56 ns +0.0%2.51 ns −2.0%
sweep: elements() [v3]141 µs138 µs ⋮ harness158 µs +14%150 µs ⋮ harness144 µs −3.7%137 µs −5.2%
sweep: elements() [gpu]95.0 ns79.0 ns ⋮ harness79.0 ns +0.0%4.85 ns ⋮ harness4.80 ns −1.1%4.85 ns +1.1%
sweep: all nodes ($("node") vs filter({group})) [v3]543 µs527 µs ⋮ harness570 µs +8.2%535 µs ⋮ harness542 µs +1.3%543 µs +0.3%
sweep: all nodes ($("node") vs filter({group})) [gpu]83.2 µs64.0 µs ⋮ harness80.3 µs +25%58.9 µs ⋮ harness57.6 µs −2.3%57.6 µs +0.1%
sweep: selected ($(":selected") vs filter({selected})) [v3]340 µs328 µs ⋮ harness364 µs +11%346 µs ⋮ harness341 µs −1.5%332 µs −2.8%
sweep: selected ($(":selected") vs filter({selected})) [gpu]25.2 µs26.0 µs ⋮ harness26.1 µs +0.5%26.2 µs ⋮ harness26.2 µs −0.3%25.7 µs −1.6%
sweep: selected nodes ($("node:selected") vs filter({group, selected})) [v3]325 µs315 µs ⋮ harness345 µs +9.7%329 µs ⋮ harness327 µs −0.7%317 µs −2.9%
sweep: selected nodes ($("node:selected") vs filter({group, selected})) [gpu]8.71 µs8.93 µs ⋮ harness9.11 µs +2.0%9.38 µs ⋮ harness9.04 µs −3.6%9.05 µs +0.1%
sweep: nodes(":selected") vs nodes({selected}) [v3]527 µs534 µs ⋮ harness580 µs +8.6%522 µs ⋮ harness530 µs +1.5%534 µs +0.6%
sweep: nodes(":selected") vs nodes({selected}) [gpu]8.65 µs8.91 µs ⋮ harness9.21 µs +3.3%8.93 µs ⋮ harness8.98 µs +0.5%8.95 µs −0.3%
sweep: filter(fn) [v3]415 µs417 µs ⋮ harness455 µs +9.2%421 µs ⋮ harness411 µs −2.4%407 µs −1.0%
sweep: filter(fn) [gpu]263 µs274 µs ⋮ harness266 µs −2.7%248 µs ⋮ harness241 µs −2.6%243 µs +0.6%
mutators n=2000 · 16 rows
row dc6d3505
2026-08-05
e37d2444
2026-08-09
6df994f1
2026-08-09
d4ff0730
2026-08-10
54062c08
2026-08-11
54062c08
2026-08-11
mut-bulk: select + unselect [v3]1.81 ms1.92 ms ⋮ harness1.86 ms −3.3%1.83 ms −1.2%1.97 ms ⋮ harness2.00 ms +1.3%
mut-bulk: select + unselect [gpu]47.9 µs6.30 ms ⋮ harness231 µs −96.3%275 µs +19%274 µs ⋮ harness243 µs −11.3%
mut-bulk: hide + show [v3]59.7 ms62.0 ms ⋮ harness60.3 ms −2.8%59.5 ms −1.3%60.1 ms ⋮ harness59.8 ms −0.6%
mut-bulk: hide + show [gpu]223 µs216 µs ⋮ harness218 µs +1.3%213 µs −2.5%224 µs ⋮ harness218 µs −2.4%
mut-bulk: lock + unlock [v3]2.21 ms2.12 ms ⋮ harness2.12 ms +0.1%2.14 ms +1.0%1.96 ms ⋮ harness1.98 ms +1.0%
mut-bulk: lock + unlock [gpu]29.8 µs48.5 µs ⋮ harness49.2 µs +1.4%38.9 µs −21.0%38.8 µs ⋮ harness38.9 µs +0.1%
mut-bulk: positions(obj) [v3]2.27 ms2.39 ms ⋮ harness2.20 ms −7.6%2.42 ms +9.6%2.13 ms ⋮ harness2.25 ms +5.6%
mut-bulk: positions(obj) [gpu]18.0 µs17.8 µs ⋮ harness18.1 µs +1.7%20.4 µs +13%36.8 µs ⋮ harness37.1 µs +0.7%
mut-bulk: positions(fn) [v3]3.43 ms3.57 ms ⋮ harness3.27 ms −8.5%3.32 ms +1.4%3.25 ms ⋮ harness3.37 ms +3.9%
mut-bulk: positions(fn) [gpu]34.7 µs35.0 µs ⋮ harness35.0 µs +0.2%34.8 µs −0.6%148 µs ⋮ harness146 µs −0.8%
mut-bulk: shift [v3]3.56 ms3.53 ms ⋮ harness3.37 ms −4.4%3.40 ms +0.8%3.37 ms ⋮ harness3.45 ms +2.4%
mut-bulk: shift [gpu]30.1 µs30.4 µs ⋮ harness30.2 µs −0.6%34.0 µs +13%32.4 µs ⋮ harness32.6 µs +0.4%
mut-bulk: data set [v3]921 µs867 µs ⋮ harness843 µs −2.8%922 µs +9.5%832 µs ⋮ harness853 µs +2.6%
mut-bulk: data set [gpu]60.4 µs60.3 µs ⋮ harness63.2 µs +4.9%64.8 µs +2.4%65.2 µs ⋮ harness63.5 µs −2.6%
mut-bulk: remove + re-add (256 nodes + cascade) [v3]40.8 ms41.9 ms ⋮ harness42.3 ms +0.8%46.0 ms +8.7%40.9 ms ⋮ harness44.3 ms +8.4%
mut-bulk: remove + re-add (256 nodes + cascade) [gpu]6.94 ms7.24 ms ⋮ harness6.43 ms −11.3%6.78 ms +5.5%6.70 ms ⋮ harness6.81 ms +1.6%
scenarios n=2000 · 10 rows
row dc6d3505
2026-08-05
e37d2444
2026-08-09
6df994f1
2026-08-09
d4ff0730
2026-08-10
54062c08
2026-08-11
54062c08
2026-08-11
scn: explore (expand 2-hop + select + fit) [v3]296 µs326 µs ⋮ harness315 µs −3.6%290 µs −8.0%297 µs +2.5%290 µs −2.3%
scn: explore (expand 2-hop + select + fit) [gpu]25.3 µs165 µs ⋮ harness38.3 µs −76.8%37.0 µs −3.4%37.3 µs +0.9%37.8 µs +1.3%
scn: select-all + fit (listeners on) [v3]24.1 ms25.7 ms ⋮ harness24.9 ms −2.9%24.3 ms −2.7%24.8 ms +2.1%24.5 ms −1.0%
scn: select-all + fit (listeners on) [gpu]695 µs7.14 ms ⋮ harness958 µs −86.6%918 µs −4.3%930 µs +1.4%944 µs +1.5%
scn: drag (select band of 100 + 8-step shift, position listener) [v3]1.66 ms1.61 ms ⋮ harness1.60 ms −0.6%1.67 ms +4.3%1.62 ms −3.3%1.64 ms +1.1%
scn: drag (select band of 100 + 8-step shift, position listener) [gpu]91.2 µs412 µs ⋮ harness103 µs −75.1%103 µs +0.7%98.4 µs −4.7%99.7 µs +1.3%
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners) [v3]43.7 ms43.7 ms ⋮ harness49.0 ms +12%44.5 ms −9.3%44.7 ms +0.6%45.5 ms +1.7%
scn: edit (remove + re-add 256 nodes + cascade, add/remove listeners) [gpu]7.26 ms7.55 ms ⋮ harness6.98 ms −7.6%6.86 ms −1.7%6.93 ms +1.1%6.93 ms −0.0%
scn: refresh (bulk data write + mapped labels + filter + fit, data listener) [v3]7.55 ms7.92 ms ⋮ harness7.51 ms −5.1%7.73 ms +2.8%7.45 ms −3.6%7.73 ms +3.8%
scn: refresh (bulk data write + mapped labels + filter + fit, data listener) [gpu]4.17 ms4.20 ms ⋮ harness4.35 ms +3.7%4.26 ms −2.1%4.14 ms −2.8%4.23 ms +2.1%
traversal n=2000 · 24 rows
row dc6d3505
2026-08-05
e37d2444
2026-08-09
6df994f1
2026-08-09
d4ff0730
2026-08-10
54062c08
2026-08-11
54062c08
2026-08-11
trav: neighborhood() [v3]3.84 µs4.30 µs ⋮ harness4.04 µs −6.1%3.85 µs ⋮ harness4.04 µs +5.1%4.00 µs −1.1%
trav: neighborhood() [gpu]941 ns964 ns ⋮ harness932 ns −3.3%991 ns ⋮ harness999 ns +0.8%990 ns −0.9%
trav: closedNeighborhood() [v3]5.70 µs6.16 µs ⋮ harness5.89 µs −4.4%5.85 µs ⋮ harness5.75 µs −1.7%6.01 µs +4.5%
trav: closedNeighborhood() [gpu]2.07 µs2.08 µs ⋮ harness2.01 µs −3.2%2.17 µs ⋮ harness2.23 µs +2.5%2.10 µs −5.8%
trav: connectedEdges() [v3]1.03 µs1.04 µs ⋮ harness1.06 µs +1.9%974 ns ⋮ harness988 ns +1.5%1.01 µs +2.1%
trav: connectedEdges() [gpu]438 ns433 ns ⋮ harness437 ns +0.7%391 ns ⋮ harness387 ns −1.1%389 ns +0.6%
trav: outgoers() [v3]2.28 µs2.33 µs ⋮ harness2.42 µs +4.2%2.27 µs ⋮ harness2.31 µs +1.6%2.35 µs +1.5%
trav: outgoers() [gpu]416 ns407 ns ⋮ harness408 ns +0.3%478 ns ⋮ harness469 ns −1.9%442 ns −5.7%
trav: incomers() [v3]2.32 µs2.38 µs ⋮ harness2.42 µs +1.4%2.26 µs ⋮ harness2.30 µs +1.5%2.34 µs +1.7%
trav: incomers() [gpu]427 ns427 ns ⋮ harness435 ns +1.9%475 ns ⋮ harness468 ns −1.6%436 ns −6.8%
trav: successors() [v3]433 ms465 ms ⋮ harness438 ms −5.7%435 ms ⋮ harness435 ms −0.0%442 ms +1.7%
trav: successors() [gpu]545 µs538 µs ⋮ harness545 µs +1.3%599 µs ⋮ harness558 µs −6.9%557 µs −0.1%
trav: predecessors() [v3]425 ms454 ms ⋮ harness436 ms −4.1%430 ms ⋮ harness435 ms +1.1%436 ms +0.3%
trav: predecessors() [gpu]571 µs544 µs ⋮ harness571 µs +5.0%593 µs ⋮ harness579 µs −2.4%579 µs +0.1%
trav: band neighborhood() [v3]186 µs193 µs ⋮ harness187 µs −3.1%183 µs ⋮ harness185 µs +1.2%192 µs +3.5%
trav: band neighborhood() [gpu]35.6 µs35.6 µs ⋮ harness35.4 µs −0.5%38.0 µs ⋮ harness37.3 µs −1.9%37.3 µs −0.0%
trav: band connectedEdges() [v3]24.5 µs25.7 µs ⋮ harness24.3 µs −5.6%24.4 µs ⋮ harness24.3 µs −0.6%24.7 µs +1.6%
trav: band connectedEdges() [gpu]28.6 µs23.6 µs ⋮ harness23.1 µs −2.4%18.3 µs ⋮ harness16.5 µs −9.6%16.6 µs +0.8%
trav: band roots() [v3]109 µs116 µs ⋮ harness113 µs −3.3%107 µs ⋮ harness109 µs +1.5%114 µs +4.8%
trav: band roots() [gpu]4.84 µs4.82 µs ⋮ harness4.85 µs +0.7%4.81 µs ⋮ harness4.81 µs +0.1%4.87 µs +1.2%
trav: band sources() [v3]7.19 µs6.68 µs ⋮ harness6.48 µs −3.1%6.56 µs ⋮ harness6.65 µs +1.4%6.51 µs −2.1%
trav: band sources() [gpu]4.49 µs4.52 µs ⋮ harness4.43 µs −2.0%4.44 µs ⋮ harness4.37 µs −1.5%4.38 µs +0.2%
trav: band connectedNodes() [v3]14.0 µs14.1 µs ⋮ harness13.7 µs −2.6%13.7 µs ⋮ harness14.3 µs +3.9%14.0 µs −1.8%
trav: band connectedNodes() [gpu]5.03 µs5.11 µs ⋮ harness5.10 µs −0.2%5.06 µs ⋮ harness5.07 µs +0.2%4.95 µs −2.4%
algorithms n=2000 · 26 rows
row dc6d3505
2026-08-05
e37d2444
2026-08-09
6df994f1
2026-08-09
d4ff0730
2026-08-10
54062c08
2026-08-11
54062c08
2026-08-11
algo: bfs (whole graph) [v3]49.1 ms55.5 ms ⋮ harness51.1 ms −7.9%54.2 ms ⋮ harness50.9 ms −6.1%50.1 ms −1.5%
algo: bfs (whole graph) [gpu]1.20 ms1.14 ms ⋮ harness1.22 ms +7.0%924 µs ⋮ harness933 µs +1.0%911 µs −2.3%
algo: dfs (whole graph) [v3]48.6 ms50.2 ms ⋮ harness51.6 ms +2.8%49.8 ms ⋮ harness50.7 ms +1.8%48.6 ms −4.1%
algo: dfs (whole graph) [gpu]1.06 ms1.09 ms ⋮ harness1.05 ms −3.5%850 µs ⋮ harness838 µs −1.5%818 µs −2.3%
algo: dijkstra + pathTo [v3]51.6 ms54.7 ms ⋮ harness52.5 ms −4.1%54.0 ms ⋮ harness52.6 ms −2.6%52.1 ms −1.0%
algo: dijkstra + pathTo [gpu]1.21 ms1.23 ms ⋮ harness1.21 ms −1.3%959 µs ⋮ harness937 µs −2.3%927 µs −1.0%
algo: aStar [v3]1.73 ms1.76 ms ⋮ harness1.69 ms −4.0%1.72 ms ⋮ harness1.67 ms −2.9%1.72 ms +2.7%
algo: aStar [gpu]784 µs812 µs ⋮ harness789 µs −2.8%511 µs ⋮ harness504 µs −1.3%505 µs +0.2%
algo: bellmanFord [v3]232 ms244 ms ⋮ harness227 ms −7.0%235 ms ⋮ harness235 ms −0.2%230 ms −2.3%
algo: bellmanFord [gpu]11.9 ms12.3 ms ⋮ harness12.1 ms −1.3%11.8 ms ⋮ harness11.8 ms +0.0%11.8 ms +0.1%
algo: kruskal [v3]12.9 ms13.7 ms ⋮ harness12.7 ms −6.8%13.3 ms ⋮ harness13.4 ms +0.7%13.2 ms −1.7%
algo: kruskal [gpu]766 µs799 µs ⋮ harness750 µs −6.1%529 µs ⋮ harness494 µs −6.6%493 µs −0.3%
algo: tarjan SCC [v3]22.5 ms24.8 ms ⋮ harness23.4 ms −5.3%24.2 ms ⋮ harness23.7 ms −2.2%22.7 ms −4.3%
algo: tarjan SCC [gpu]911 µs928 µs ⋮ harness1.03 ms +11%666 µs ⋮ harness622 µs −6.6%611 µs −1.7%
algo: hopcroft-tarjan biconnected [v3]86.8 ms86.7 ms ⋮ harness87.9 ms +1.5%87.9 ms ⋮ harness85.9 ms −2.2%85.0 ms −1.1%
algo: hopcroft-tarjan biconnected [gpu]3.69 ms3.76 ms ⋮ harness3.70 ms −1.6%3.51 ms ⋮ harness3.44 ms −2.1%3.44 ms −0.1%
algo: hierholzer (directed) [v3]24.3 ms23.2 ms ⋮ harness22.6 ms −2.9%23.4 ms ⋮ harness22.7 ms −3.3%22.0 ms −2.8%
algo: hierholzer (directed) [gpu]8.65 ms8.35 ms ⋮ harness8.12 ms −2.7%7.91 ms ⋮ harness7.88 ms −0.3%7.89 ms +0.1%
algo: betweennessCentrality (unweighted) [v3]4.00 s4.13 s ⋮ harness4.03 s −2.4%4.09 s ⋮ harness4.07 s −0.6%4.02 s −1.3%
algo: betweennessCentrality (unweighted) [gpu]343 ms341 ms ⋮ harness343 ms +0.8%364 ms ⋮ harness357 ms −2.0%357 ms +0.0%
algo: degreeCentralityNormalized [v3]15.1 ms14.9 ms ⋮ harness14.7 ms −0.8%14.9 ms ⋮ harness15.8 ms +5.7%14.7 ms −7.2%
algo: degreeCentralityNormalized [gpu]659 µs669 µs ⋮ harness670 µs +0.1%393 µs ⋮ harness404 µs +2.8%396 µs −1.9%
algo: closenessCentrality (one root) [v3]59.8 ms60.8 ms ⋮ harness68.0 ms +12%60.2 ms ⋮ harness60.4 ms +0.3%59.5 ms −1.5%
algo: closenessCentrality (one root) [gpu]1.33 ms1.38 ms ⋮ harness1.36 ms −1.5%820 µs ⋮ harness822 µs +0.3%825 µs +0.3%
algo: degreeCentrality (one root) [v3]6.95 µs7.10 µs ⋮ harness7.14 µs +0.6%7.49 µs ⋮ harness7.45 µs −0.6%7.43 µs −0.3%
algo: degreeCentrality (one root) [gpu]262 µs276 µs ⋮ harness259 µs −6.4%247 ns ⋮ harness249 ns +0.9%247 ns −0.8%
algorithms n=500 · 50 rows
row dc6d3505
2026-08-05
e37d2444
2026-08-09
6df994f1
2026-08-09
d4ff0730
2026-08-10
54062c08
2026-08-11
54062c08
2026-08-11
algo: bfs (whole graph) [v3]12.9 ms12.7 ms ⋮ harness12.2 ms −3.7%12.3 ms ⋮ harness12.4 ms +0.7%12.9 ms +3.9%
algo: bfs (whole graph) [gpu]276 µs279 µs ⋮ harness274 µs −1.6%213 µs ⋮ harness198 µs −6.9%194 µs −2.2%
algo: dfs (whole graph) [v3]12.7 ms11.3 ms ⋮ harness10.8 ms −3.9%11.2 ms ⋮ harness11.5 ms +2.8%11.4 ms −1.1%
algo: dfs (whole graph) [gpu]258 µs262 µs ⋮ harness254 µs −2.9%181 µs ⋮ harness190 µs +5.2%191 µs +0.2%
algo: dijkstra + pathTo [v3]11.7 ms11.8 ms ⋮ harness11.9 ms +0.5%12.0 ms ⋮ harness12.3 ms +2.2%12.0 ms −2.6%
algo: dijkstra + pathTo [gpu]288 µs297 µs ⋮ harness294 µs −0.9%235 µs ⋮ harness230 µs −2.3%233 µs +1.5%
algo: aStar [v3]428 µs439 µs ⋮ harness418 µs −4.8%438 µs ⋮ harness437 µs −0.2%439 µs +0.5%
algo: aStar [gpu]187 µs187 µs ⋮ harness190 µs +1.7%122 µs ⋮ harness122 µs −0.3%121 µs −0.9%
algo: bellmanFord [v3]16.0 ms15.9 ms ⋮ harness14.3 ms −10.0%16.8 ms ⋮ harness17.1 ms +1.8%17.2 ms +0.7%
algo: bellmanFord [gpu]873 µs896 µs ⋮ harness888 µs −0.8%808 µs ⋮ harness812 µs +0.5%810 µs −0.2%
algo: kruskal [v3]3.12 ms3.20 ms ⋮ harness3.07 ms −4.1%3.23 ms ⋮ harness3.24 ms +0.3%3.21 ms −0.8%
algo: kruskal [gpu]189 µs191 µs ⋮ harness193 µs +0.9%135 µs ⋮ harness127 µs −6.0%139 µs +9.1%
algo: tarjan SCC [v3]5.34 ms5.34 ms ⋮ harness5.31 ms −0.5%5.29 ms ⋮ harness5.39 ms +1.8%5.40 ms +0.2%
algo: tarjan SCC [gpu]229 µs230 µs ⋮ harness234 µs +1.8%157 µs ⋮ harness151 µs −3.7%156 µs +3.2%
algo: hopcroft-tarjan biconnected [v3]20.9 ms20.2 ms ⋮ harness19.6 ms −2.8%20.2 ms ⋮ harness21.6 ms +7.1%20.5 ms −5.1%
algo: hopcroft-tarjan biconnected [gpu]858 µs867 µs ⋮ harness859 µs −0.9%801 µs ⋮ harness823 µs +2.7%821 µs −0.3%
algo: hierholzer (directed) [v3]4.13 ms4.32 ms ⋮ harness4.15 ms −4.0%4.25 ms ⋮ harness4.25 ms −0.1%4.24 ms −0.2%
algo: hierholzer (directed) [gpu]896 µs905 µs ⋮ harness893 µs −1.4%816 µs ⋮ harness816 µs +0.0%806 µs −1.2%
algo: betweennessCentrality (unweighted) [v3]252 ms254 ms ⋮ harness252 ms −0.8%251 ms ⋮ harness259 ms +3.4%258 ms −0.7%
algo: betweennessCentrality (unweighted) [gpu]19.9 ms20.5 ms ⋮ harness20.2 ms −1.4%20.4 ms ⋮ harness20.8 ms +1.6%20.5 ms −1.4%
algo: degreeCentralityNormalized [v3]3.41 ms3.71 ms ⋮ harness3.52 ms −5.2%3.47 ms ⋮ harness3.57 ms +3.0%3.50 ms −2.0%
algo: degreeCentralityNormalized [gpu]158 µs163 µs ⋮ harness160 µs −2.1%94.0 µs ⋮ harness93.4 µs −0.6%93.9 µs +0.5%
algo: closenessCentrality (one root) [v3]13.3 ms13.8 ms ⋮ harness13.3 ms −3.5%14.1 ms ⋮ harness13.9 ms −1.0%13.6 ms −2.2%
algo: closenessCentrality (one root) [gpu]327 µs335 µs ⋮ harness334 µs −0.3%202 µs ⋮ harness204 µs +1.1%199 µs −2.5%
algo: degreeCentrality (one root) [v3]7.06 µs7.09 µs ⋮ harness7.24 µs +2.1%7.28 µs ⋮ harness7.73 µs +6.2%7.46 µs −3.6%
algo: degreeCentrality (one root) [gpu]64.9 µs63.4 µs ⋮ harness65.0 µs +2.5%241 ns ⋮ harness245 ns +1.7%239 ns −2.5%
algo: pageRank (20 iters) [v3]2.80 ms2.79 ms ⋮ harness2.74 ms −1.8%2.73 ms ⋮ harness2.77 ms +1.3%2.76 ms −0.2%
algo: pageRank (20 iters) [gpu]1.53 ms1.53 ms ⋮ harness1.53 ms +0.2%1.46 ms ⋮ harness39.3 µs −97.3%39.6 µs +0.6%
algo: closenessCentrality (weighted, one root) [v3]13.5 ms13.7 ms ⋮ harness13.9 ms +1.6%13.9 ms ⋮ harness14.0 ms +1.1%13.8 ms −2.0%
algo: closenessCentrality (weighted, one root) [gpu]380 µs389 µs ⋮ harness387 µs −0.4%255 µs ⋮ harness249 µs −2.3%259 µs +3.9%
algo: floydWarshall [v3]248 ms251 ms ⋮ harness252 ms +0.1%246 ms ⋮ harness248 ms +0.9%247 ms −0.3%
algo: floydWarshall [gpu]295 ms300 ms ⋮ harness296 ms −1.2%155 ms ⋮ harness140 ms −9.8%140 ms +0.3%
algo: closenessCentralityNormalized [v3]276 ms275 ms ⋮ harness274 ms −0.3%274 ms ⋮ harness275 ms +0.5%276 ms +0.1%
algo: closenessCentralityNormalized [gpu]320 ms325 ms ⋮ harness322 ms −0.9%164 ms ⋮ harness165 ms +0.6%167 ms +1.5%
algo: markovClustering [v3]4.65 s4.66 s ⋮ harness4.65 s −0.2%4.12 s ⋮ harness4.13 s +0.2%4.12 s −0.3%
algo: markovClustering [gpu]3.37 s3.31 s ⋮ harness3.30 s −0.2%3.75 s ⋮ harness3.75 s −0.2%3.75 s +0.0%
algo: hierarchicalClustering (threshold) [v3]27.9 ms26.9 ms ⋮ harness27.6 ms +2.7%34.6 ms ⋮ harness34.5 ms −0.2%34.8 ms +0.7%
algo: hierarchicalClustering (threshold) [gpu]27.9 ms26.8 ms ⋮ harness28.9 ms +7.9%14.7 ms ⋮ harness4.15 ms −71.7%4.16 ms +0.4%
algo: kMeans (fixed centroids) [v3]8.52 ms9.00 ms ⋮ harness8.53 ms −5.2%9.11 ms ⋮ harness9.19 ms +0.9%9.01 ms −2.0%
algo: kMeans (fixed centroids) [gpu]8.56 ms8.88 ms ⋮ harness8.24 ms −7.2%2.35 ms ⋮ harness1.93 ms −17.7%2.10 ms +8.4%
algo: kMedoids [v3]367 ms306 ms ⋮ harness335 ms +9.4%376 ms ⋮ harness247 ms −34.4%350 ms +42%
algo: kMedoids [gpu]359 ms349 ms ⋮ harness340 ms −2.6%42.0 ms ⋮ harness41.7 ms −0.9%34.9 ms −16.3%
algo: fuzzyCMeans [v3]80.3 ms85.9 ms ⋮ harness79.8 ms −7.0%78.8 ms ⋮ harness78.4 ms −0.6%79.0 ms +0.8%
algo: fuzzyCMeans [gpu]76.9 ms77.4 ms ⋮ harness76.1 ms −1.7%9.06 ms ⋮ harness6.81 ms −24.8%7.21 ms +6.0%
algo: affinityPropagation [v3]215 ms227 ms ⋮ harness211 ms −6.7%215 ms ⋮ harness212 ms −1.5%210 ms −0.8%
algo: affinityPropagation [gpu]117 ms114 ms ⋮ harness115 ms +0.8%41.2 ms ⋮ harness39.7 ms −3.4%39.3 ms −1.1%
algo: kargerStein [v3]325 ms325 ms ⋮ harness326 ms +0.4%316 ms ⋮ harness320 ms +1.4%323 ms +1.0%
algo: kargerStein [gpu]314 ms304 ms ⋮ harness309 ms +1.7%306 ms ⋮ harness300 ms −2.1%303 ms +1.0%
algo: betweennessCentrality (weighted) [v3]757 ms732 ms ⋮ harness714 ms −2.5%703 ms ⋮ harness724 ms +2.9%725 ms +0.2%
algo: betweennessCentrality (weighted) [gpu]83.1 ms77.2 ms ⋮ harness76.5 ms −0.9%80.9 ms ⋮ harness80.9 ms +0.0%80.4 ms −0.7%
mappers n=2000 · 5 rows
row dc6d3505
2026-08-05
e37d2444
2026-08-09
6df994f1
2026-08-09
d4ff0730
2026-08-10
54062c08
2026-08-11
54062c08
2026-08-11
mapper: bulk write, color [cpu eval]3.73 ms3.79 ms ⋮ harness2.55 ms −32.8%2.54 ms −0.3%2.58 ms +1.3%2.53 ms −1.9%
mapper: bulk write, color [gpu path]180 µs176 µs ⋮ harness175 µs −0.5%175 µs −0.0%175 µs −0.3%175 µs +0.2%
mapper: bulk write, color + size [cpu eval]4.06 ms4.27 ms ⋮ harness2.88 ms −32.6%3.01 ms +4.6%2.96 ms −1.6%2.91 ms −1.5%
mapper: bulk write, color + size [gpu color / cpu size]3.69 ms3.88 ms ⋮ harness2.46 ms −36.7%2.61 ms +6.4%2.60 ms −0.4%2.53 ms −2.9%
mapper: bulk write, mapped labels (round-5 path) [label refresh]3.98 ms4.00 ms ⋮ harness3.94 ms −1.5%4.09 ms +3.7%3.93 ms −4.0%3.97 ms +1.2%