Skip to content

overall benchmark 2026 09 22

Randy Zwitch edited this page Sep 23, 2026 · 13 revisions

Overall benchmark, 2026-09-22

Merged main at 4e5ded3, Polars 1.44.2, Linux x86-64, 32 threads. pixi run -e oracle bench-polars --reps 7 checks row counts and checksums before reporting best warmed read/operation times. Ratios are Mojo / Polars; rows are sorted by the 1M-row ratio as requested. Times are milliseconds.

Workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
grouped_str 8.03 / 2.11 3.81x 122.31 / 14.18 8.63x
filter 7.06 / 3.84 1.84x 44.91 / 7.04 6.38x
join_inner 11.32 / 4.19 2.70x 108.38 / 25.05 4.33x
sort_multi 20.72 / 7.21 2.87x 138.50 / 51.05 2.71x
grouped_high 4.94 / 3.09 1.60x 33.37 / 12.42 2.69x
global_sum 0.24 / 0.14 1.71x 0.58 / 0.24 2.42x
grouped_skew 4.32 / 2.20 1.96x 24.86 / 10.90 2.28x
grouped_low 4.23 / 1.67 2.53x 24.28 / 11.16 2.18x
arithmetic_chain 2.36 / 3.59 0.66x 7.99 / 3.86 2.07x
nullable_compare 2.20 / 3.12 0.71x 5.66 / 3.99 1.42x
csv_read 5.66 / 2.39 2.37x 18.32 / 16.45 1.11x

The large-filter improvement merged in PR #167; this table remains the earlier merged-main baseline for judging each PR independently.

Candidate integration after PR #167

Current merged main at 869c2c0 plus the unmerged changes in PR #169, PR #170, and PR #171. Built as one optimized runner; bench-polars --reps 7 verified row counts and checksums against Polars 1.44.2. This is an integration checkpoint, not a new merged-main baseline. Ratios use the displayed rounded milliseconds and are sorted by the 1M ratio.

Workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
join_inner 12.98 / 4.06 3.20x 115.17 / 26.66 4.32x
sort_multi 22.66 / 6.98 3.25x 143.18 / 52.56 2.72x
grouped_high 5.27 / 2.84 1.86x 33.25 / 14.28 2.33x
global_sum 0.24 / 0.14 1.71x 0.58 / 0.26 2.23x
filter 7.25 / 4.49 1.61x 14.65 / 7.14 2.05x
grouped_str 4.94 / 2.02 2.45x 29.49 / 14.81 1.99x
grouped_low 4.16 / 1.82 2.29x 22.44 / 12.17 1.84x
grouped_skew 4.28 / 1.70 2.52x 23.35 / 15.24 1.53x
arithmetic_chain 2.35 / 3.19 0.74x 8.17 / 5.57 1.47x
nullable_compare 2.20 / 3.37 0.65x 5.80 / 5.20 1.12x
csv_read 5.79 / 2.59 2.24x 19.12 / 19.83 0.96x

Candidate integration through PR #175

Merged main at b3096ef plus the unmerged changes in PRs #170–#175. Polars 1.44.2, Linux x86-64, 32 threads. Each of three matched bench-polars --reps 7 runs checked row counts and checksums; cells are medians of the reported times. Ratios are median Mojo / median Polars and rows are sorted by the 1M ratio. This is an integration checkpoint, not a merged-main baseline.

workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
global_sum 0.24 / 0.12 2.00x 0.59 / 0.24 2.46x
grouped_high 5.31 / 2.86 1.86x 32.00 / 15.51 2.06x
grouped_str 4.96 / 2.16 2.30x 29.66 / 15.35 1.93x
sort_multi 16.75 / 7.46 2.25x 99.48 / 52.23 1.90x
filter 7.35 / 4.13 1.78x 14.77 / 7.91 1.87x
grouped_low 4.19 / 1.85 2.26x 22.91 / 13.54 1.69x
grouped_skew 4.30 / 2.40 1.79x 23.67 / 14.03 1.69x
join_inner 3.43 / 5.32 0.64x 42.55 / 25.82 1.65x
arithmetic_chain 2.40 / 4.39 0.55x 8.37 / 5.53 1.51x
nullable_compare 2.22 / 3.64 0.61x 5.90 / 4.35 1.36x
csv_read 5.66 / 2.63 2.15x 18.79 / 18.95 0.99x

Candidate integration through PR #178

Merged main at eb23bee plus the unmerged changes in PR #175, #176, #177, and #178. Polars 1.44.2, Linux x86-64, 32 threads. Each of three matched bench-polars --reps 7 runs checked row counts and checksums; cells are medians of reported times. Ratios are median Mojo / median Polars, sorted by the 1M ratio. This is an integration checkpoint, not a merged-main baseline.

workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
arithmetic_chain 2.36 / 3.51 0.67x 8.31 / 3.96 2.10x
grouped_high 4.72 / 2.64 1.79x 28.09 / 13.74 2.04x
global_sum 0.21 / 0.13 1.62x 0.51 / 0.25 2.04x
filter 7.24 / 4.33 1.67x 14.89 / 7.59 1.96x
grouped_str 4.40 / 1.86 2.37x 29.80 / 15.39 1.94x
grouped_low 3.60 / 1.84 1.96x 22.62 / 13.25 1.71x
join_inner 3.44 / 4.46 0.77x 42.71 / 25.41 1.68x
sort_multi 16.50 / 6.85 2.41x 84.18 / 54.30 1.55x
grouped_skew 3.74 / 1.91 1.96x 23.57 / 15.68 1.50x
nullable_compare 2.22 / 3.39 0.65x 5.89 / 4.17 1.41x
csv_read 5.80 / 2.53 2.29x 19.99 / 17.17 1.16x

Candidate integration through PR #180

Polars 1.44.2; 32 configured threads; each run uses best of seven timed repetitions and verifies rows/checksums. Merged main at eb23bee plus the unmerged changes in PRs #175–#178 and PR #180. This is an integration checkpoint, not a merged-main baseline. Ratios use median Mojo / median Polars.

workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
global_sum 0.14 / 0.13 1.08x 0.52 / 0.23 2.26x
grouped_high 4.08 / 2.99 1.36x 28.04 / 13.41 2.09x
filter 6.25 / 4.04 1.55x 15.06 / 7.30 2.06x
grouped_str 3.92 / 2.02 1.94x 29.79 / 15.39 1.94x
join_inner 3.24 / 4.99 0.65x 48.45 / 27.05 1.79x
sort_multi 15.97 / 7.06 2.26x 87.30 / 53.40 1.63x
grouped_low 3.12 / 1.76 1.77x 23.12 / 14.22 1.63x
arithmetic_chain 2.17 / 3.73 0.58x 8.32 / 5.44 1.53x
grouped_skew 3.22 / 2.30 1.40x 23.69 / 16.28 1.46x
nullable_compare 2.01 / 3.52 0.57x 5.85 / 4.68 1.25x
csv_read 4.93 / 2.57 1.92x 20.13 / 16.91 1.19x

Candidate integration through PR #181

Polars 1.44.2; 32 configured threads; each run uses best of seven timed repetitions and verifies rows/checksums. Merged main at eb23bee plus the unmerged changes in PRs #175–#178, #180, and #181. This is an integration checkpoint, not a merged-main baseline. Ratios use median Mojo / median Polars.

workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
filter 6.38 / 4.47 1.43x 14.78 / 7.47 1.98x
grouped_high 4.12 / 2.98 1.38x 28.28 / 15.03 1.88x
grouped_str 3.92 / 2.23 1.76x 29.76 / 15.98 1.86x
join_inner 3.24 / 5.11 0.63x 47.11 / 26.78 1.76x
sort_multi 15.82 / 7.29 2.17x 87.95 / 52.65 1.67x
grouped_low 3.10 / 1.96 1.58x 23.41 / 14.29 1.64x
grouped_skew 3.24 / 2.44 1.33x 23.69 / 15.38 1.54x
arithmetic_chain 2.20 / 3.96 0.56x 8.44 / 5.59 1.51x
nullable_compare 2.02 / 3.65 0.55x 5.91 / 4.68 1.26x
csv_read 4.99 / 2.64 1.89x 20.07 / 16.64 1.21x
global_sum 0.07 / 0.14 0.50x 0.26 / 0.24 1.08x

Candidate integration through PR #182

Polars 1.44.2; 32 configured threads; each run uses best of seven timed repetitions and verifies rows/checksums. Merged main at eb23bee plus the unmerged changes in PRs #175–#178, #180, #181, and #182. This is an integration checkpoint, not a merged-main baseline. Ratios use median Mojo / median Polars.

workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
filter 6.36 / 4.79 1.33x 14.71 / 7.39 1.99x
grouped_high 4.10 / 2.92 1.40x 28.14 / 14.48 1.94x
grouped_str 3.93 / 2.18 1.80x 29.75 / 15.41 1.93x
sort_multi 13.32 / 7.35 1.81x 92.48 / 54.90 1.68x
grouped_low 3.12 / 1.97 1.58x 22.99 / 13.74 1.67x
arithmetic_chain 2.19 / 3.81 0.57x 8.44 / 5.62 1.50x
join_inner 3.26 / 5.06 0.64x 42.16 / 28.13 1.50x
grouped_skew 3.23 / 2.37 1.36x 23.87 / 16.14 1.48x
global_sum 0.07 / 0.12 0.58x 0.25 / 0.20 1.25x
nullable_compare 2.02 / 3.72 0.54x 5.89 / 4.76 1.24x
csv_read 4.82 / 2.80 1.72x 18.62 / 17.28 1.08x

Candidate integration through PR #183

Polars 1.44.2; 32 configured threads; each run uses best of seven timed repetitions and verifies rows/checksums. Merged main at eb23bee plus the unmerged changes in PRs #175–#178 and #180–#183. This is an integration checkpoint, not a merged-main baseline. Five matched runs were used for this table. Ratios use median Mojo / median Polars.

workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
grouped_high 4.09 / 3.00 1.36x 28.14 / 14.99 1.88x
grouped_str 3.94 / 2.11 1.87x 29.94 / 16.21 1.85x
join_inner 3.27 / 4.94 0.66x 46.47 / 25.58 1.82x
arithmetic_chain 2.18 / 4.20 0.52x 8.51 / 4.78 1.78x
sort_multi 12.28 / 7.47 1.64x 88.65 / 52.78 1.68x
grouped_low 3.13 / 1.84 1.70x 23.51 / 14.02 1.68x
grouped_skew 3.24 / 2.23 1.45x 23.92 / 16.16 1.48x
filter 4.85 / 4.11 1.18x 11.13 / 7.70 1.45x
nullable_compare 2.01 / 3.41 0.59x 5.90 / 4.53 1.30x
csv_read 4.69 / 2.68 1.75x 19.02 / 16.65 1.14x
global_sum 0.07 / 0.15 0.47x 0.25 / 0.27 0.93x

Candidate integration through PR #185

Polars 1.44.2; 32 configured threads; each run uses best of seven timed repetitions and verifies rows/checksums. Merged main at eb23bee plus the unmerged changes in PRs #175–#178 and #180–#185. This is an integration checkpoint, not a merged-main baseline. Five matched runs were used for this table. Ratios use median Mojo / median Polars.

workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
grouped_high 4.08 / 2.99 1.36x 27.99 / 13.65 2.05x
grouped_str 3.92 / 2.06 1.90x 29.81 / 15.14 1.97x
join_inner 3.23 / 5.06 0.64x 48.51 / 26.25 1.85x
grouped_low 3.14 / 1.84 1.71x 23.22 / 13.89 1.67x
sort_multi 12.70 / 7.40 1.72x 86.36 / 52.96 1.63x
filter 4.87 / 4.76 1.02x 11.16 / 6.95 1.61x
grouped_skew 3.24 / 2.36 1.37x 23.63 / 15.91 1.49x
arithmetic_chain 1.38 / 4.34 0.32x 7.99 / 5.47 1.46x
nullable_compare 1.23 / 3.76 0.33x 5.25 / 4.56 1.15x
csv_read 4.73 / 2.95 1.60x 18.68 / 17.27 1.08x
global_sum 0.07 / 0.12 0.58x 0.26 / 0.25 1.04x

Candidate integration through PR #187

Merged main at eb23bee plus the unmerged performance changes in PRs #175–#178, #180–#186, and #187. The integrated optimized runner used Polars 1.44.2 and 32 threads on Linux x86-64. Five complete matched bench-polars --reps 7 runs checked row counts and checksums for each workload; each cell below is the median time across those five runs. Ratios use the unrounded median times and rows are sorted by the 1M ratio. This is an integration checkpoint; the PRs remain individually reviewable.

Workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
grouped_high 4.10 / 2.88 1.42x 26.19 / 13.80 1.90x
grouped_str 3.94 / 2.05 1.92x 29.98 / 16.10 1.86x
grouped_low 3.14 / 1.73 1.82x 23.20 / 14.43 1.61x
sort_multi 13.38 / 7.20 1.86x 84.09 / 53.00 1.59x
join_inner 3.27 / 4.82 0.68x 41.28 / 26.45 1.56x
grouped_skew 3.23 / 2.17 1.49x 23.90 / 15.73 1.52x
arithmetic_chain 1.39 / 4.85 0.29x 8.07 / 5.55 1.45x
filter 4.87 / 4.15 1.17x 11.17 / 7.78 1.44x
csv_read 4.87 / 2.61 1.87x 19.00 / 17.82 1.07x
nullable_compare 1.20 / 3.66 0.33x 5.30 / 5.04 1.05x
global_sum 0.07 / 0.13 0.54x 0.26 / 0.27 0.96x

The narrowest 100k margin is grouped_str at 1.92x. Individual runs vary, and CI on the newest PRs is still pending at this checkpoint.

Candidate integration through PR #189

Merged main at eb23bee plus the unmerged performance changes in PRs #175–#178 and #180–#189. The optimized runner used Polars 1.44.2 and 32 threads on Linux x86-64. Five complete matched bench-polars --reps 7 runs checked row counts and checksums; each cell is the median time across runs. Ratios use unrounded medians and rows are sorted by the 1M ratio. These PRs remain individually reviewable.

Workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
grouped_high 4.10 / 2.95 1.39x 26.06 / 13.53 1.93x
join_inner 3.29 / 5.26 0.63x 49.16 / 26.16 1.88x
grouped_low 3.13 / 1.96 1.60x 23.15 / 13.61 1.70x
sort_multi 12.84 / 7.07 1.82x 87.90 / 54.46 1.61x
grouped_skew 3.24 / 2.32 1.40x 23.96 / 15.92 1.51x
filter 4.86 / 4.87 1.00x 11.40 / 7.88 1.45x
arithmetic_chain 1.39 / 3.67 0.38x 6.52 / 5.64 1.16x
global_sum 0.07 / 0.13 0.54x 0.25 / 0.22 1.14x
nullable_compare 1.22 / 3.83 0.32x 5.24 / 4.94 1.06x
csv_read 4.74 / 2.76 1.72x 18.26 / 17.57 1.04x
grouped_str 3.93 / 2.09 1.88x 15.11 / 15.48 0.98x

The largest default median ratio is now 1.93x at 1M grouped_high. Separate 10M scaling remains a more demanding check, especially filter and join.

Candidate integration through PR #191

Merged main at eb23bee plus the unmerged performance changes in PRs #175–#178 and #180–#191. The optimized runner used Polars 1.44.2 and 32 threads on Linux x86-64. Five complete matched bench-polars --reps 7 runs checked row counts and checksums; each cell is the median time across runs. Ratios use unrounded medians and rows are sorted by the 1M ratio. These PRs remain individually reviewable.

Workload 100k Mojo / Polars 100k ratio 1M Mojo / Polars 1M ratio
grouped_high 4.09 / 2.81 1.46x 26.29 / 14.04 1.87x
grouped_low 3.10 / 1.81 1.71x 23.19 / 13.54 1.71x
sort_multi 13.54 / 7.56 1.79x 84.91 / 54.85 1.55x
filter 4.81 / 4.14 1.16x 11.42 / 7.52 1.52x
grouped_skew 3.22 / 2.35 1.37x 23.69 / 16.01 1.48x
global_sum 0.07 / 0.12 0.58x 0.26 / 0.20 1.30x
nullable_compare 1.23 / 3.48 0.35x 5.24 / 4.44 1.18x
arithmetic_chain 1.38 / 3.69 0.37x 6.43 / 5.72 1.12x
csv_read 4.76 / 2.76 1.72x 17.69 / 16.86 1.05x
grouped_str 3.93 / 2.09 1.88x 15.01 / 15.17 0.99x
join_inner 0.80 / 4.96 0.16x 9.34 / 26.34 0.35x

All 22 default cells have median ratios below 2x. The largest 1M median is grouped_high at 1.87x; the largest 100k median is grouped_str at 1.88x.

Clone this wiki locally