Chart · millijoules a run

sort into a new table, in energy.

neo 144 mJ in the energy run. Closest: Polars at 2.20×. Farthest: Spark at 44.2×.

—

neo crosses once

neo

TAKE THIS CHART WITH YOU

Embed anywhere.

<iframe src="https://n0.is/embed/chart/sort-table-energy" title="sort into a new table, in energy" width="100%" height="520" loading="lazy" sandbox="allow-scripts" referrerpolicy="no-referrer" style="border:0;border-radius:12px"></iframe>

Every engine's multiple of neo

  1. neo
    1×
  2. Polars
    2.20× · 317 vs 144
  3. pandas
    4.43× · 637 vs 144
  4. DuckDB
    6.26× · 900 vs 144
  5. Spark
    44.2× · 6,350 vs 144

Bars to scale, from zero to the slowest engine. The gray pair is the engine's measurement and neo's in the same run, in mJ.

What this measures

Sort by amount and build the whole sorted table, every column reordered. Energy is the same run in millijoules: what the machine billed each engine's whole process tree, with its draw at rest subtracted for the seconds of the window. neo's pool is told to rest after the kernel, as the editor tells it.

What neo is held to

The whole table in that order, every column, with the same first values as every other engine.

Each side, this kernel only

Polars2.20× neo · neo vs Polars

Polars, this kernel · neon-cpp/bench/lang/python/yardstick.py:218
timed("sort_mat", lambda: df.sort("amount"))

pandas4.43× neo · neo vs pandas

pandas, this kernel · neon-cpp/bench/lang/python/yardstick.py:197
timed("sort_mat", lambda: df.sort_values("amount"))

DuckDB6.26× neo · neo vs DuckDB

DuckDB, this kernel · neon-cpp/bench/lang/python/yardstick.py:237
timed("sort_mat", lambda: con.execute("CREATE OR REPLACE TABLE s AS SELECT * FROM t ORDER BY amount"))

Spark44.2× neo · neo vs Spark

Spark, this kernel · neon-cpp/bench/lang/python/yardstick.py:255
timed("sort_mat", lambda: sink(df.orderBy("amount")))

neo · confidential

neo's kernels, the ports written in-house to beat them, and the techniques behind both stay with the engine. Nothing about how the numbers were made is withheld: the method, the checks every engine had to pass, every number and every place neo is behind are on this page. The engine itself we keep confidential, because we don't want it getting into the wrong hands. The binaries run on request and reproduce every number here.

Measured on Apple M5 Max, 18 cores, 26.4.1, 2026-10-11. Every number here is also on the comparison page of its engine, with how it was taken and the caveats.

All evalsEvery comparisonStart a conversation