Skip to content

Array VTables#7215

Merged
gatesn merged 50 commits intodevelopfrom
ngates/array-vtables-view2
Apr 2, 2026
Merged

Array VTables#7215
gatesn merged 50 commits intodevelopfrom
ngates/array-vtables-view2

Conversation

@gatesn
Copy link
Copy Markdown
Contributor

@gatesn gatesn commented Mar 31, 2026

See #7181

This is a large break that changes how Vortex arrays are held in memory. Previously they were modeled as Arc where all array impls used a vtable macro to unsafely transmute into a dyn Array.

This was cute, but meant that we were performing a lot of unnecessary clones and Arc allocations for things that should never have required them. We were also limited by how expressive we could make APIs since Arc is considered a foreign type.

This PR makes ArrayRef a struct, makes typed arrays a struct of Array<V: VTable>, and adds an ArrayView<'a, V>. This means all arrays are Arc allocated up-front in any of these forms, and we pass the Arc allocation around everywhere allowing us to cheaply clone in either the type-erased or typed structs.

The main user-facing change is that array constructors should now live on the vtable struct, e.g. Primitive::new(...) instead of PrimitiveArray::new(...)

gatesn and others added 18 commits March 29, 2026 16:59
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
- Fix reduce() signature mismatch in dyn_.rs
- Fix as_any() ambiguity in downcast helper

Signed-off-by: Nicholas Gates <nick@nickgates.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq bot commented Mar 31, 2026

Merging this PR will degrade performance by 25.97%

⚡ 146 improved benchmarks
❌ 13 regressed benchmarks
✅ 963 untouched benchmarks
⏩ 1530 skipped benchmarks1

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Simulation chunked_bool_canonical_into[(100, 100)] 218.5 µs 139.5 µs +56.6%
Simulation chunked_dict_primitive_canonical_into[f32, (1000, 10, 10)] 115.9 µs 92 µs +26.01%
Simulation chunked_dict_primitive_canonical_into[f32, (1000, 1000, 10)] 133.9 µs 112 µs +19.54%
Simulation chunked_dict_primitive_canonical_into[f32, (1000, 100, 100)] 934.1 µs 732.4 µs +27.54%
Simulation chunked_dict_primitive_canonical_into[f32, (1000, 100, 10)] 117.5 µs 93.4 µs +25.82%
Simulation chunked_bool_canonical_into[(10, 1000)] 1.9 ms 1.2 ms +66.35%
Simulation chunked_constant_i32_append_to_builder[(10, 1000)] 267.6 µs 235.7 µs +13.56%
Simulation chunked_dict_primitive_canonical_into[f32, (1000, 1000, 100)] 1,099.5 µs 911 µs +20.7%
Simulation chunked_dict_primitive_canonical_into[f32, (1000, 10, 100)] 916.9 µs 726.7 µs +26.17%
Simulation chunked_bool_canonical_into[(1000, 10)] 72.9 µs 63.3 µs +15.1%
Simulation chunked_dict_primitive_canonical_into[f64, (1000, 10, 100)] 1,175.1 µs 981.4 µs +19.73%
Simulation chunked_dict_primitive_canonical_into[u32, (1000, 10, 100)] 916.5 µs 715.7 µs +28.05%
Simulation chunked_dict_primitive_canonical_into[f64, (1000, 10, 10)] 143.8 µs 120.3 µs +19.56%
Simulation chunked_constant_i32_append_to_builder[(1000, 10)] 30.7 µs 41.5 µs -25.97%
Simulation chunked_dict_primitive_canonical_into[f64, (1000, 100, 100)] 1.2 ms 1 ms +20.64%
Simulation chunked_dict_primitive_canonical_into[u32, (1000, 10, 10)] 115.7 µs 95.2 µs +21.55%
Simulation chunked_dict_primitive_canonical_into[u64, (1000, 10, 100)] 1,172.6 µs 979.4 µs +19.73%
Simulation chunked_dict_primitive_canonical_into[f64, (1000, 1000, 100)] 1.5 ms 1.3 ms +14.48%
Simulation chunked_opt_bool_canonical_into[(10, 1000)] 2.2 ms 1.4 ms +57.36%
Simulation chunked_dict_primitive_canonical_into[u64, (1000, 1000, 10)] 180.5 µs 157.5 µs +14.63%
... ... ... ... ... ...

ℹ️ Only the first 20 benchmarks are displayed. Go to the app to view all benchmarks.


Comparing ngates/array-vtables-view2 (4ebb321) with develop (38ab5af)

Open in CodSpeed

Footnotes

  1. 1530 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

gatesn added 7 commits March 31, 2026 16:45
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
gatesn and others added 3 commits April 1, 2026 15:43
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 1, 2026

Benchmarks: TPC-H SF=10 on S3

Verdict: No clear signal (environment too noisy confidence)
Attributed Vortex impact: +18.5%
Vortex (geomean): 0.916x ➖
Parquet (geomean): 0.773x ➖
Shifts: Parquet (control) -22.7% · Median polish -12.4%


datafusion / vortex-file-compressed (0.825x ➖, 5↑ 0↓)
name PR aa20eea (ns) base 38ab5af (ns) ratio (PR/base)
tpch_q01/datafusion:vortex-file-compressed 🚀 690765029 1138334875 0.61
tpch_q02/datafusion:vortex-file-compressed 🚀 590026470 1014740963 0.58
tpch_q03/datafusion:vortex-file-compressed 🚀 779667468 1456520553 0.54
tpch_q04/datafusion:vortex-file-compressed 555587635 614386206 0.90
tpch_q05/datafusion:vortex-file-compressed 1134990486 1131060655 1.00
tpch_q06/datafusion:vortex-file-compressed 583463873 700291220 0.83
tpch_q07/datafusion:vortex-file-compressed 1094036510 1289721862 0.85
tpch_q08/datafusion:vortex-file-compressed 1171035328 1447344680 0.81
tpch_q09/datafusion:vortex-file-compressed 1554573112 1359670319 1.14
tpch_q10/datafusion:vortex-file-compressed 1061183755 1165516379 0.91
tpch_q11/datafusion:vortex-file-compressed 531494845 519630441 1.02
tpch_q12/datafusion:vortex-file-compressed 960690230 1132458548 0.85
tpch_q13/datafusion:vortex-file-compressed 460972551 453397641 1.02
tpch_q14/datafusion:vortex-file-compressed 552207420 615092924 0.90
tpch_q15/datafusion:vortex-file-compressed 1068492844 1256954591 0.85
tpch_q16/datafusion:vortex-file-compressed 356019395 325430435 1.09
tpch_q17/datafusion:vortex-file-compressed 1203043801 1176658488 1.02
tpch_q18/datafusion:vortex-file-compressed 1276972248 1501451676 0.85
tpch_q19/datafusion:vortex-file-compressed 🚀 885325151 1414722445 0.63
tpch_q20/datafusion:vortex-file-compressed 972638336 1233255395 0.79
tpch_q21/datafusion:vortex-file-compressed 1590954810 2046548027 0.78
tpch_q22/datafusion:vortex-file-compressed 🚀 447398386 763307710 0.59
datafusion / vortex-compact (0.856x ➖, 2↑ 0↓)
name PR aa20eea (ns) base 38ab5af (ns) ratio (PR/base)
tpch_q01/datafusion:vortex-compact 760593606 698252597 1.09
tpch_q02/datafusion:vortex-compact 966821479 755291415 1.28
tpch_q03/datafusion:vortex-compact 989754141 1044832375 0.95
tpch_q04/datafusion:vortex-compact 605879688 678777394 0.89
tpch_q05/datafusion:vortex-compact 1139748708 1430726935 0.80
tpch_q06/datafusion:vortex-compact 599950922 719967108 0.83
tpch_q07/datafusion:vortex-compact 1117253019 1190542688 0.94
tpch_q08/datafusion:vortex-compact 1274256010 1098555097 1.16
tpch_q09/datafusion:vortex-compact 1306324580 1801192426 0.73
tpch_q10/datafusion:vortex-compact 🚀 877236028 2086044371 0.42
tpch_q11/datafusion:vortex-compact 🚀 416770031 786718693 0.53
tpch_q12/datafusion:vortex-compact 936580441 1156650994 0.81
tpch_q13/datafusion:vortex-compact 432809129 498819978 0.87
tpch_q14/datafusion:vortex-compact 590198911 656899376 0.90
tpch_q15/datafusion:vortex-compact 1095965595 1361507444 0.80
tpch_q16/datafusion:vortex-compact 353414378 440889617 0.80
tpch_q17/datafusion:vortex-compact 1202687505 1512157571 0.80
tpch_q18/datafusion:vortex-compact 1134302039 1257675136 0.90
tpch_q19/datafusion:vortex-compact 945209138 817294134 1.16
tpch_q20/datafusion:vortex-compact 939438635 1052433086 0.89
tpch_q21/datafusion:vortex-compact 1460509412 1600970068 0.91
tpch_q22/datafusion:vortex-compact 581731179 667869790 0.87
datafusion / parquet (0.673x ✅, 13↑ 0↓)
name PR aa20eea (ns) base 38ab5af (ns) ratio (PR/base)
tpch_q01/datafusion:parquet 893844619 983656409 0.91
tpch_q02/datafusion:parquet 🚀 711479812 1671853790 0.43
tpch_q03/datafusion:parquet 🚀 1049743114 1552454963 0.68
tpch_q04/datafusion:parquet 546883915 770647109 0.71
tpch_q05/datafusion:parquet 🚀 1092867832 2529976041 0.43
tpch_q06/datafusion:parquet 🚀 508182766 1180253738 0.43
tpch_q07/datafusion:parquet 🚀 1328134006 3450402172 0.38
tpch_q08/datafusion:parquet 1596636435 1816617873 0.88
tpch_q09/datafusion:parquet 1978570713 2063461616 0.96
tpch_q10/datafusion:parquet 🚀 2061220899 3485238481 0.59
tpch_q11/datafusion:parquet 826803505 750393826 1.10
tpch_q12/datafusion:parquet 🚀 780995931 1119065860 0.70
tpch_q13/datafusion:parquet 🚀 965177448 1401049610 0.69
tpch_q14/datafusion:parquet 🚀 960548311 1469366648 0.65
tpch_q15/datafusion:parquet 🚀 1505422096 2152420004 0.70
tpch_q16/datafusion:parquet 🚀 409971125 756537633 0.54
tpch_q17/datafusion:parquet 1670772652 2034661288 0.82
tpch_q18/datafusion:parquet 1977592494 1644790061 1.20
tpch_q19/datafusion:parquet 🚀 1109914351 1751886362 0.63
tpch_q20/datafusion:parquet 🚀 1380090107 3039561005 0.45
tpch_q21/datafusion:parquet 2019444478 2183121471 0.93
tpch_q22/datafusion:parquet 993870411 1365464719 0.73
duckdb / vortex-file-compressed (0.961x ➖, 1↑ 0↓)
name PR aa20eea (ns) base 38ab5af (ns) ratio (PR/base)
tpch_q01/duckdb:vortex-file-compressed 617479605 663996429 0.93
tpch_q02/duckdb:vortex-file-compressed 1334557845 1328305669 1.00
tpch_q03/duckdb:vortex-file-compressed 971794434 984467062 0.99
tpch_q04/duckdb:vortex-file-compressed 755343565 870702091 0.87
tpch_q05/duckdb:vortex-file-compressed 1297142087 1328025364 0.98
tpch_q06/duckdb:vortex-file-compressed 854795422 917244864 0.93
tpch_q07/duckdb:vortex-file-compressed 1229554438 1114275918 1.10
tpch_q08/duckdb:vortex-file-compressed 1479544584 1547074907 0.96
tpch_q09/duckdb:vortex-file-compressed 1672248730 1571073315 1.06
tpch_q10/duckdb:vortex-file-compressed 1131911790 1122989314 1.01
tpch_q11/duckdb:vortex-file-compressed 779103980 779073786 1.00
tpch_q12/duckdb:vortex-file-compressed 788033811 871075691 0.90
tpch_q13/duckdb:vortex-file-compressed 🚀 1083297487 1629589575 0.66
tpch_q14/duckdb:vortex-file-compressed 948801006 1034673580 0.92
tpch_q15/duckdb:vortex-file-compressed 618689647 538126515 1.15
tpch_q16/duckdb:vortex-file-compressed 440332940 599886098 0.73
tpch_q17/duckdb:vortex-file-compressed 1062807191 1003882627 1.06
tpch_q18/duckdb:vortex-file-compressed 1092244996 922912685 1.18
tpch_q19/duckdb:vortex-file-compressed 876166138 752311720 1.16
tpch_q20/duckdb:vortex-file-compressed 1457960404 1490181606 0.98
tpch_q21/duckdb:vortex-file-compressed 2030072008 2192099590 0.93
tpch_q22/duckdb:vortex-file-compressed 565949456 684210837 0.83
duckdb / vortex-compact (1.037x ➖, 0↑ 1↓)
name PR aa20eea (ns) base 38ab5af (ns) ratio (PR/base)
tpch_q01/duckdb:vortex-compact 633084514 623622486 1.02
tpch_q02/duckdb:vortex-compact 1110151452 1201676988 0.92
tpch_q03/duckdb:vortex-compact 912792096 950756898 0.96
tpch_q04/duckdb:vortex-compact 676596738 639400894 1.06
tpch_q05/duckdb:vortex-compact 1131275643 1071391738 1.06
tpch_q06/duckdb:vortex-compact 883926618 884571191 1.00
tpch_q07/duckdb:vortex-compact 1058234371 1169458149 0.90
tpch_q08/duckdb:vortex-compact 1440734172 1344458374 1.07
tpch_q09/duckdb:vortex-compact 1365477306 1494441385 0.91
tpch_q10/duckdb:vortex-compact 🚨 1760067599 1086187935 1.62
tpch_q11/duckdb:vortex-compact 858079245 664244202 1.29
tpch_q12/duckdb:vortex-compact 872970522 792368268 1.10
tpch_q13/duckdb:vortex-compact 839936345 1022766889 0.82
tpch_q14/duckdb:vortex-compact 870834778 901580153 0.97
tpch_q15/duckdb:vortex-compact 563377022 499843016 1.13
tpch_q16/duckdb:vortex-compact 489519027 408228938 1.20
tpch_q17/duckdb:vortex-compact 960306245 1138099754 0.84
tpch_q18/duckdb:vortex-compact 900509641 806813591 1.12
tpch_q19/duckdb:vortex-compact 694923714 744265310 0.93
tpch_q20/duckdb:vortex-compact 1334084713 1427844454 0.93
tpch_q21/duckdb:vortex-compact 1676677607 1764758857 0.95
tpch_q22/duckdb:vortex-compact 757891991 590174916 1.28
duckdb / parquet (0.888x ➖, 1↑ 0↓)
name PR aa20eea (ns) base 38ab5af (ns) ratio (PR/base)
tpch_q01/duckdb:parquet 1118530605 1201902641 0.93
tpch_q02/duckdb:parquet 1449915545 1635435914 0.89
tpch_q03/duckdb:parquet 1928142821 2367023746 0.81
tpch_q04/duckdb:parquet 1229543943 1202241369 1.02
tpch_q05/duckdb:parquet 2185819544 2513416328 0.87
tpch_q06/duckdb:parquet 656060757 649045934 1.01
tpch_q07/duckdb:parquet 1750316318 2191712730 0.80
tpch_q08/duckdb:parquet 2685115756 2990132610 0.90
tpch_q09/duckdb:parquet 2375954225 2359075896 1.01
tpch_q10/duckdb:parquet 3050670900 4304197343 0.71
tpch_q11/duckdb:parquet 1045984177 1121011662 0.93
tpch_q12/duckdb:parquet 🚀 870792840 1405474122 0.62
tpch_q13/duckdb:parquet 1464578744 1201945187 1.22
tpch_q14/duckdb:parquet 1448579241 1312563984 1.10
tpch_q15/duckdb:parquet 1032558842 1135650954 0.91
tpch_q16/duckdb:parquet 809145182 787397501 1.03
tpch_q17/duckdb:parquet 1272310033 1644904155 0.77
tpch_q18/duckdb:parquet 1401147181 1965262584 0.71
tpch_q19/duckdb:parquet 1455037952 2042718827 0.71
tpch_q20/duckdb:parquet 1834150124 1872306051 0.98
tpch_q21/duckdb:parquet 1888621714 2257324249 0.84
tpch_q22/duckdb:parquet 1069111905 1046107208 1.02
Full attributed analysis
Query Config Raw Δ Control Δ Attributed α Noise floor Significant?
1 datafusion:vortex-compact +8.9% -8.0% +18.5% +93.5% ➖ noise
1 datafusion:vortex-file-compressed -39.3% -8.0% -34.0% +78.9% ➖ noise
1 duckdb:vortex-compact +1.5% -8.0% +10.4% +56.5% ➖ noise
1 duckdb:vortex-file-compressed -7.0% -8.0% +1.1% +56.5% ➖ noise
2 datafusion:vortex-compact +28.0% -38.6% +108.4% +69.3% 🚨 regression
2 datafusion:vortex-file-compressed -41.9% -38.6% -5.3% +72.6% ➖ noise
2 duckdb:vortex-compact -7.6% -38.6% +50.4% +58.2% ➖ noise
2 duckdb:vortex-file-compressed +0.5% -38.6% +63.6% +56.5% 🚨 regression
3 datafusion:vortex-compact -5.3% -25.8% +27.6% +73.0% ➖ noise
3 datafusion:vortex-file-compressed -46.5% -25.8% -27.9% +78.8% ➖ noise
3 duckdb:vortex-compact -4.0% -25.8% +29.4% +81.3% ➖ noise
3 duckdb:vortex-file-compressed -1.3% -25.8% +33.0% +72.5% ➖ noise
4 datafusion:vortex-compact -10.7% -14.8% +4.8% +65.5% ➖ noise
4 datafusion:vortex-file-compressed -9.6% -14.8% +6.1% +56.5% ➖ noise
4 duckdb:vortex-compact +5.8% -14.8% +24.2% +56.5% ➖ noise
4 duckdb:vortex-file-compressed -13.2% -14.8% +1.8% +82.4% ➖ noise
5 datafusion:vortex-compact -20.3% -38.7% +30.0% +56.5% ➖ noise
5 datafusion:vortex-file-compressed +0.3% -38.7% +63.7% +56.5% 🚨 regression
5 duckdb:vortex-compact +5.6% -38.7% +72.3% +56.5% 🚨 regression
5 duckdb:vortex-file-compressed -2.3% -38.7% +59.4% +56.5% 🚨 regression
6 datafusion:vortex-compact -16.7% -34.0% +26.3% +56.5% ➖ noise
6 datafusion:vortex-file-compressed -16.7% -34.0% +26.3% +56.5% ➖ noise
6 duckdb:vortex-compact -0.1% -34.0% +51.5% +56.5% ➖ noise
6 duckdb:vortex-file-compressed -6.8% -34.0% +41.3% +56.5% ➖ noise
7 datafusion:vortex-compact -6.2% -44.6% +69.3% +56.5% 🚨 regression
7 datafusion:vortex-file-compressed -15.2% -44.6% +53.0% +56.5% ➖ noise
7 duckdb:vortex-compact -9.5% -44.6% +63.2% +56.5% 🚨 regression
7 duckdb:vortex-file-compressed +10.3% -44.6% +99.0% +56.5% 🚨 regression
8 datafusion:vortex-compact +16.0% -11.2% +30.6% +56.5% ➖ noise
8 datafusion:vortex-file-compressed -19.1% -11.2% -8.9% +67.5% ➖ noise
8 duckdb:vortex-compact +7.2% -11.2% +20.6% +56.5% ➖ noise
8 duckdb:vortex-file-compressed -4.4% -11.2% +7.6% +56.5% ➖ noise
9 datafusion:vortex-compact -27.5% -1.7% -26.2% +56.5% ➖ noise
9 datafusion:vortex-file-compressed +14.3% -1.7% +16.3% +56.5% ➖ noise
9 duckdb:vortex-compact -8.6% -1.7% -7.0% +56.5% ➖ noise
9 duckdb:vortex-file-compressed +6.4% -1.7% +8.3% +56.5% ➖ noise
10 datafusion:vortex-compact -57.9% -35.3% -35.0% +63.7% ➖ noise
10 datafusion:vortex-file-compressed -9.0% -35.3% +40.6% +56.5% ➖ noise
10 duckdb:vortex-compact +62.0% -35.3% +150.3% +56.5% 🚨 regression
10 duckdb:vortex-file-compressed +0.8% -35.3% +55.7% +56.5% ➖ noise
11 datafusion:vortex-compact -47.0% +1.4% -47.8% +72.4% ✅ faster
11 datafusion:vortex-file-compressed +2.3% +1.4% +0.9% +56.5% ➖ noise
11 duckdb:vortex-compact +29.2% +1.4% +27.4% +56.5% ➖ noise
11 duckdb:vortex-file-compressed +0.0% +1.4% -1.4% +56.5% ➖ noise
12 datafusion:vortex-compact -19.0% -34.2% +23.1% +56.5% ➖ noise
12 datafusion:vortex-file-compressed -15.2% -34.2% +29.0% +56.5% ➖ noise
12 duckdb:vortex-compact +10.2% -34.2% +67.5% +56.7% 🚨 regression
12 duckdb:vortex-file-compressed -9.5% -34.2% +37.6% +56.5% ➖ noise
13 datafusion:vortex-compact -13.2% -8.4% -5.3% +98.0% ➖ noise
13 datafusion:vortex-file-compressed +1.7% -8.4% +11.0% +75.4% ➖ noise
13 duckdb:vortex-compact -17.9% -8.4% -10.4% +94.0% ➖ noise
13 duckdb:vortex-file-compressed -33.5% -8.4% -27.4% +71.1% ➖ noise
14 datafusion:vortex-compact -10.2% -15.1% +5.8% +56.5% ➖ noise
14 datafusion:vortex-file-compressed -10.2% -15.1% +5.7% +56.5% ➖ noise
14 duckdb:vortex-compact -3.4% -15.1% +13.7% +56.5% ➖ noise
14 duckdb:vortex-file-compressed -8.3% -15.1% +8.0% +56.5% ➖ noise
15 datafusion:vortex-compact -19.5% -20.3% +0.9% +56.5% ➖ noise
15 datafusion:vortex-file-compressed -15.0% -20.3% +6.6% +56.5% ➖ noise
15 duckdb:vortex-compact +12.7% -20.3% +41.3% +56.5% ➖ noise
15 duckdb:vortex-file-compressed +15.0% -20.3% +44.2% +56.5% ➖ noise
16 datafusion:vortex-compact -19.8% -25.4% +7.4% +56.5% ➖ noise
16 datafusion:vortex-file-compressed +9.4% -25.4% +46.6% +56.5% ➖ noise
16 duckdb:vortex-compact +19.9% -25.4% +60.7% +69.7% ➖ noise
16 duckdb:vortex-file-compressed -26.6% -25.4% -1.6% +56.5% ➖ noise
17 datafusion:vortex-compact -20.5% -20.3% -0.2% +56.5% ➖ noise
17 datafusion:vortex-file-compressed +2.2% -20.3% +28.3% +56.5% ➖ noise
17 duckdb:vortex-compact -15.6% -20.3% +5.9% +56.5% ➖ noise
17 duckdb:vortex-file-compressed +5.9% -20.3% +32.8% +56.5% ➖ noise
18 datafusion:vortex-compact -9.8% -7.4% -2.6% +56.5% ➖ noise
18 datafusion:vortex-file-compressed -15.0% -7.4% -8.1% +56.5% ➖ noise
18 duckdb:vortex-compact +11.6% -7.4% +20.6% +56.5% ➖ noise
18 duckdb:vortex-file-compressed +18.3% -7.4% +27.8% +56.5% ➖ noise
19 datafusion:vortex-compact +15.7% -32.8% +72.2% +56.5% 🚨 regression
19 datafusion:vortex-file-compressed -37.4% -32.8% -6.8% +56.5% ➖ noise
19 duckdb:vortex-compact -6.6% -32.8% +39.0% +56.5% ➖ noise
19 duckdb:vortex-file-compressed +16.5% -32.8% +73.4% +56.5% 🚨 regression
20 datafusion:vortex-compact -10.7% -33.3% +33.8% +56.5% ➖ noise
20 datafusion:vortex-file-compressed -21.1% -33.3% +18.3% +56.5% ➖ noise
20 duckdb:vortex-compact -6.6% -33.3% +40.1% +56.5% ➖ noise
20 duckdb:vortex-file-compressed -2.2% -33.3% +46.7% +56.5% ➖ noise
21 datafusion:vortex-compact -8.8% -12.0% +3.7% +56.5% ➖ noise
21 datafusion:vortex-file-compressed -22.3% -12.0% -11.6% +56.5% ➖ noise
21 duckdb:vortex-compact -5.0% -12.0% +8.0% +56.5% ➖ noise
21 duckdb:vortex-file-compressed -7.4% -12.0% +5.3% +56.5% ➖ noise
22 datafusion:vortex-compact -12.9% -13.8% +1.0% +56.5% ➖ noise
22 datafusion:vortex-file-compressed -41.4% -13.8% -32.0% +59.0% ➖ noise
22 duckdb:vortex-compact +28.4% -13.8% +48.9% +76.4% ➖ noise
22 duckdb:vortex-file-compressed -17.3% -13.8% -4.1% +56.5% ➖ noise

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 1, 2026

Benchmarks: Statistical and Population Genetics

Verdict: No clear signal (low confidence)
Attributed Vortex impact: +0.2%
Vortex (geomean): 0.966x ➖
Parquet (geomean): 0.963x ➖
Shifts: Parquet (control) -3.7% · Median polish -2.9%


duckdb / vortex-file-compressed (0.969x ➖, 1↑ 0↓)
name PR aa20eea (ns) base 38ab5af (ns) ratio (PR/base)
statpopgen_q00/duckdb:vortex-file-compressed 10849427 11303413 0.96
statpopgen_q01/duckdb:vortex-file-compressed 🚀 25874017 28800432 0.90
statpopgen_q02/duckdb:vortex-file-compressed 1303718576 1323674733 0.98
statpopgen_q03/duckdb:vortex-file-compressed 3111361693 3120903523 1.00
statpopgen_q04/duckdb:vortex-file-compressed 3126653141 3073990497 1.02
statpopgen_q05/duckdb:vortex-file-compressed 1402086762 1440894189 0.97
statpopgen_q06/duckdb:vortex-file-compressed 2078575401 2087706961 1.00
statpopgen_q07/duckdb:vortex-file-compressed 236113127 244945457 0.96
statpopgen_q08/duckdb:vortex-file-compressed 240696907 266373418 0.90
statpopgen_q09/duckdb:vortex-file-compressed 2851452588 2875191636 0.99
statpopgen_q10/duckdb:vortex-file-compressed 4626966568 4738189624 0.98
duckdb / vortex-compact (0.963x ➖, 0↑ 0↓)
name PR aa20eea (ns) base 38ab5af (ns) ratio (PR/base)
statpopgen_q00/duckdb:vortex-compact 10800105 11627876 0.93
statpopgen_q01/duckdb:vortex-compact 161964803 174204255 0.93
statpopgen_q02/duckdb:vortex-compact 1827803725 1857434119 0.98
statpopgen_q03/duckdb:vortex-compact 3461192582 3547568498 0.98
statpopgen_q04/duckdb:vortex-compact 3546008474 3605920262 0.98
statpopgen_q05/duckdb:vortex-compact 1822401234 1935601155 0.94
statpopgen_q06/duckdb:vortex-compact 2668583777 2731991296 0.98
statpopgen_q07/duckdb:vortex-compact 946801653 974991829 0.97
statpopgen_q08/duckdb:vortex-compact 978336021 1007799938 0.97
statpopgen_q09/duckdb:vortex-compact 3359142263 3478398222 0.97
statpopgen_q10/duckdb:vortex-compact 5352477300 5550508968 0.96
duckdb / parquet (0.963x ➖, 0↑ 0↓)
name PR aa20eea (ns) base 38ab5af (ns) ratio (PR/base)
statpopgen_q00/duckdb:parquet 311345234 322752820 0.96
statpopgen_q01/duckdb:parquet 401004579 407483627 0.98
statpopgen_q02/duckdb:parquet 1004693746 1033135830 0.97
statpopgen_q03/duckdb:parquet 1502641174 1595760658 0.94
statpopgen_q04/duckdb:parquet 1507950536 1603703903 0.94
statpopgen_q05/duckdb:parquet 1006291787 1055936568 0.95
statpopgen_q06/duckdb:parquet 1491515473 1557159826 0.96
statpopgen_q07/duckdb:parquet 1866619638 1912650408 0.98
statpopgen_q08/duckdb:parquet 1875092783 1948105442 0.96
statpopgen_q09/duckdb:parquet 1394020016 1413065516 0.99
statpopgen_q10/duckdb:parquet 2683927886 2800344248 0.96
Full attributed analysis
Query Config Raw Δ Control Δ Attributed α Noise floor Significant?
0 duckdb:vortex-compact -7.1% -3.5% -3.7% +10.0% ➖ noise
0 duckdb:vortex-file-compressed -4.0% -3.5% -0.5% +13.5% ➖ noise
1 duckdb:vortex-compact -7.0% -1.6% -5.5% +27.6% ➖ noise
1 duckdb:vortex-file-compressed -10.2% -1.6% -8.7% +245.0% ➖ noise
2 duckdb:vortex-compact -1.6% -2.8% +1.2% +10.0% ➖ noise
2 duckdb:vortex-file-compressed -1.5% -2.8% +1.3% +10.0% ➖ noise
3 duckdb:vortex-compact -2.4% -5.8% +3.6% +10.0% ➖ noise
3 duckdb:vortex-file-compressed -0.3% -5.8% +5.9% +10.0% ➖ noise
4 duckdb:vortex-compact -1.7% -6.0% +4.6% +10.0% ➖ noise
4 duckdb:vortex-file-compressed +1.7% -6.0% +8.2% +10.0% ➖ noise
5 duckdb:vortex-compact -5.8% -4.7% -1.2% +10.0% ➖ noise
5 duckdb:vortex-file-compressed -2.7% -4.7% +2.1% +10.0% ➖ noise
6 duckdb:vortex-compact -2.3% -4.2% +2.0% +10.0% ➖ noise
6 duckdb:vortex-file-compressed -0.4% -4.2% +3.9% +10.0% ➖ noise
7 duckdb:vortex-compact -2.9% -2.4% -0.5% +10.0% ➖ noise
7 duckdb:vortex-file-compressed -3.6% -2.4% -1.2% +24.8% ➖ noise
8 duckdb:vortex-compact -2.9% -3.7% +0.9% +10.0% ➖ noise
8 duckdb:vortex-file-compressed -9.6% -3.7% -6.1% +10.0% ➖ noise
9 duckdb:vortex-compact -3.4% -1.3% -2.1% +10.0% ➖ noise
9 duckdb:vortex-file-compressed -0.8% -1.3% +0.5% +10.0% ➖ noise
10 duckdb:vortex-compact -3.6% -4.2% +0.6% +10.0% ➖ noise
10 duckdb:vortex-file-compressed -2.3% -4.2% +1.9% +10.0% ➖ noise

Signed-off-by: Nicholas Gates <nick@nickgates.com>
@gatesn gatesn added the action/benchmark Trigger full benchmarks to run on this PR label Apr 2, 2026
@github-actions github-actions bot removed the action/benchmark Trigger full benchmarks to run on this PR label Apr 2, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 2, 2026

Polar Signals Profiling Results

Latest Run

Status Commit Job Attempt Link
🟢 Done aa20eea 1 Explore Profiling Data
Previous Runs (2)
Status Commit Job Attempt Link
🟢 Done b88954e 2 Explore Profiling Data
🟢 Done b88954e 1 Explore Profiling Data

Powered by Polar Signals Cloud

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 2, 2026

Benchmarks: Random Access

Vortex (geomean): 0.841x ✅
Parquet (geomean): 0.978x ➖


unknown / unknown (0.920x ➖, 12↑ 1↓)
name PR aa20eea (ns) base 38ab5af (ns) ratio (PR/base)
random-access/feature-vectors/correlated/lance-tokio-local-disk 🚀 2303474 3108404 0.74
random-access/feature-vectors/correlated/lance-tokio-local-disk-footer 1290950 1287458 1.00
random-access/feature-vectors/correlated/parquet-tokio-local-disk 11644454900 12132618560 0.96
random-access/feature-vectors/correlated/parquet-tokio-local-disk-footer 11245926608 11248461342 1.00
random-access/feature-vectors/correlated/vortex-tokio-local-disk 8236462 8515025 0.97
random-access/feature-vectors/correlated/vortex-tokio-local-disk-footer 6340192 6867608 0.92
random-access/feature-vectors/uniform/lance-tokio-local-disk 1452620 1424080 1.02
random-access/feature-vectors/uniform/lance-tokio-local-disk-footer 2355397 2325988 1.01
random-access/feature-vectors/uniform/parquet-tokio-local-disk 11231319149 11279769813 1.00
random-access/feature-vectors/uniform/parquet-tokio-local-disk-footer 11255754940 11257055380 1.00
random-access/feature-vectors/uniform/vortex-tokio-local-disk 12626123 13731415 0.92
random-access/feature-vectors/uniform/vortex-tokio-local-disk-footer 🚀 12703182 14138363 0.90
random-access/lance-tokio-local-disk 749791 832224 0.90
random-access/lance-tokio-local-disk-footer 🚀 1350490 1615825 0.84
random-access/nested-lists/correlated/lance-tokio-local-disk 269262 269818 1.00
random-access/nested-lists/correlated/lance-tokio-local-disk-footer 714655 716800 1.00
random-access/nested-lists/correlated/parquet-tokio-local-disk 140426504 141498933 0.99
random-access/nested-lists/correlated/parquet-tokio-local-disk-footer 140098471 143132054 0.98
random-access/nested-lists/correlated/vortex-tokio-local-disk 699256 700781 1.00
random-access/nested-lists/correlated/vortex-tokio-local-disk-footer 703090 705701 1.00
random-access/nested-lists/uniform/lance-tokio-local-disk 1162591 1138605 1.02
random-access/nested-lists/uniform/lance-tokio-local-disk-footer 1657842 1621364 1.02
random-access/nested-lists/uniform/parquet-tokio-local-disk 140212084 143301126 0.98
random-access/nested-lists/uniform/parquet-tokio-local-disk-footer 142436406 142887108 1.00
random-access/nested-lists/uniform/vortex-tokio-local-disk 2419406 2413806 1.00
random-access/nested-lists/uniform/vortex-tokio-local-disk-footer 2556938 2621224 0.98
random-access/nested-structs/correlated/lance-tokio-local-disk 433449 431124 1.01
random-access/nested-structs/correlated/lance-tokio-local-disk-footer 642652 639795 1.00
random-access/nested-structs/correlated/parquet-tokio-local-disk 26227066 25070430 1.05
random-access/nested-structs/correlated/parquet-tokio-local-disk-footer 26162112 25225056 1.04
random-access/nested-structs/correlated/vortex-tokio-local-disk 🚨 924122 836385 1.10
random-access/nested-structs/correlated/vortex-tokio-local-disk-footer 916595 923486 0.99
random-access/nested-structs/uniform/lance-tokio-local-disk 2792911 2744043 1.02
random-access/nested-structs/uniform/lance-tokio-local-disk-footer 3034720 2985451 1.02
random-access/nested-structs/uniform/parquet-tokio-local-disk 26089189 25213265 1.03
random-access/nested-structs/uniform/parquet-tokio-local-disk-footer 26047749 25214588 1.03
random-access/nested-structs/uniform/vortex-tokio-local-disk 1849985 1885628 0.98
random-access/nested-structs/uniform/vortex-tokio-local-disk-footer 1815693 1824382 1.00
random-access/parquet-tokio-local-disk 186181149 194763858 0.96
random-access/parquet-tokio-local-disk-footer 185548671 198666012 0.93
random-access/taxi/correlated/lance-tokio-local-disk 964806 1068810 0.90
random-access/taxi/correlated/lance-tokio-local-disk-footer 🚀 1651131 1941011 0.85
random-access/taxi/correlated/parquet-tokio-local-disk 277353553 302420913 0.92
random-access/taxi/correlated/parquet-tokio-local-disk-footer 277088415 305127083 0.91
random-access/taxi/correlated/vortex-tokio-local-disk 🚀 1708817 3055362 0.56
random-access/taxi/correlated/vortex-tokio-local-disk-footer 🚀 1727840 2899523 0.60
random-access/taxi/uniform/lance-tokio-local-disk 🚀 8635059 9675221 0.89
random-access/taxi/uniform/lance-tokio-local-disk-footer 🚀 9253855 10501094 0.88
random-access/taxi/uniform/parquet-tokio-local-disk 293513791 319352295 0.92
random-access/taxi/uniform/parquet-tokio-local-disk-footer 300909751 321866191 0.93
random-access/taxi/uniform/vortex-tokio-local-disk 🚀 4416042 6551151 0.67
random-access/taxi/uniform/vortex-tokio-local-disk-footer 🚀 4486352 6284475 0.71
random-access/vortex-tokio-local-disk 🚀 1249394 2107231 0.59
random-access/vortex-tokio-local-disk-footer 🚀 1255902 2081140 0.60

gatesn added 3 commits April 2, 2026 10:51
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
return Ok(None);
};

if cfg!(debug_assertions) {
vortex_ensure!(
result.as_ref().len() == parent.len(),
result.len() == parent.len(),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

probably worth doing this check even outside the debug_assertions block? dtype comparison can be expensive, but length should be quite fast

@lwwmanning lwwmanning marked this pull request as ready for review April 2, 2026 15:42
Copy link
Copy Markdown
Contributor

@lwwmanning lwwmanning left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minor nits, but worth merging asap as long as all the benchmark suites succeed / continue to be flat / better. it's a clear improvement from a code concepts point of view

gatesn added 8 commits April 2, 2026 11:57
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
Signed-off-by: Nicholas Gates <nick@nickgates.com>
@gatesn gatesn enabled auto-merge (squash) April 2, 2026 16:42
@gatesn gatesn added the action/benchmark Trigger full benchmarks to run on this PR label Apr 2, 2026
@github-actions github-actions bot removed the action/benchmark Trigger full benchmarks to run on this PR label Apr 2, 2026
Signed-off-by: Nicholas Gates <nick@nickgates.com>
@gatesn gatesn merged commit f43e12b into develop Apr 2, 2026
58 of 59 checks passed
@gatesn gatesn deleted the ngates/array-vtables-view2 branch April 2, 2026 16:50
@a10y a10y mentioned this pull request Apr 2, 2026
a10y added a commit that referenced this pull request Apr 2, 2026
#7215 dropped PatchedArray and left this very descriptive doc comment
hanging. I moved it to be a module level comment.

Signed-off-by: Andrew Duffy <andrew@a10y.dev>
@gatesn gatesn mentioned this pull request Apr 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog/break A breaking API change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants