Benchmarks

Two benchmarks of Rux against Rust, C++, Go, C# and Java, run on real machines by one open-source runner: ten identical programs, built and run, and a 100,000-line project, compiled by each toolchain.

At a glance

Running ten programs

Compiling a 100,000-line project

Desktop · Core i9-11900KF · October 15, 2026

Rux is pre-1.0
These figures are a baseline to track from release to release, not a verdict. Times are comparable only within one machine, and memory is measured differently on Windows and Linux, so compare languages on the same machine rather than machines with each other.

Machine

Type
Desktop
CPU
11th Gen Intel(R) Core(TM) i9-11900KF @ 3.50GHz
Threads
16
Memory
64 GiB
OS
Windows 11 (build 26300)
Program benchmark
October 15, 2026 · 73e4999
Compile benchmark
October 15, 2026 · 73e4999
Toolchains
Rux
Rux 0.4.0 (2026-10-15 16:05:55 UTC)
Rust
rustc 1.99.0 (b940084d7 2026-09-28)
Cargo
cargo 1.99.0 (5f94df478 2026-08-27)
C++
clang version 23.1.2 (https://github.com/llvm/llvm-project 85ac560262434c9ccfc0c183ec22d4138ed647fb)
CMake
cmake version 4.4.3
Ninja
1.13.2
Go
go version go1.27.1 windows/amd64
.NET SDK
10.0.401
JDK
java version "27" 2026-09-15
GraalVM
native-image 25.0.4 2026-07-21

Benchmark 1 of 2

Program benchmark

Ten small programs, written the same way in every language, each built with its usual tool and then run. It measures what a user of a program sees: how fast it runs, how much memory it takes, how long it takes to build and how big it is.

Desktop · Core i9-11900KF · October 15, 2026 · standard profile · 3 timed clean builds · 1 warm-up + 5 measured runs

Summary

Each cell is the geometric mean, over all ten apps, of the language's value divided by Rux's. Rux is 1.00× by definition.

Geometric mean over all apps of each language's value divided by Rux's. Above 1.00× Rux is lower, below 1.00× Rux is higher; every metric is lower-is-better.
Metric RuxRustC++GoC# AOTC# JITJava AOTJava JIT
1.00×1.17×0.98×1.14×1.19×1.41×1.13×1.13×
1.00×1.17×0.96×1.24×1.20×1.41×1.13×1.27×
1.00×1.11×1.11×1.37×1.60×2.27×1.78×4.34×
1.00×3.85×3.41×1.88×33×35×239×18×
1.00×2.12×1.20×1.50×1.78×3.40×22×5.12×
1.00×2.80×6.64×19×14×—76×—
1.00×2.80×6.64×19×14×165×76×696×

Above 1.00× — Rux is lower Below 1.00× — Rux is higher Every metric is lower-is-better. — not ranked: a JIT program file needs its runtime.Select a metric to see it per app.

Results by app

Wall-clock time from process start to exit, including start-up. Median of runs; lower is better.

Rux compared with

Use Up and Down Arrow keys to move between apps and Left and Right Arrow keys to move between languages. Press Escape to clear.

Other languages Hollow: JIT, runs on a runtime it ships with Hover, tap or focus the chart for values.

Execution time (s)

Execution time (s), median of runs for each app. The best value in each row is bold.
AppRuxRustC++GoC# AOTC# JITJava AOTJava JIT
Sha5120.5350.4970.4690.6620.6860.8250.6270.703
Mandelbrot0.9320.9160.9030.8870.9160.9700.9230.985
WordCount0.7470.6370.6060.8130.8460.8511.0980.978
BinaryTrees1.3152.0751.8920.8920.7520.8730.2420.309
Sort0.6120.5950.5980.6160.6460.7200.6470.723
NBody0.2190.2330.2210.2800.3590.5390.2060.275
MatrixMultiply0.2100.6310.1930.5750.6820.7940.7410.399
PrimeSieve0.5680.5870.5530.5700.5820.6360.6310.627
Fannkuch0.1400.1360.1330.1410.1340.1970.1610.207
Base640.2320.2800.2230.2760.3030.3480.5650.393

The programs

Each is an ordinary console program written the same way in every language. It takes its sizes as arguments, prints a deterministic result and exits; there is no timing code inside.

AppWhat it doesStressesStandard size
Sha512SHA-512 of a pseudo-random buffer, re-hashed with the digest fed back in64-bit integer and bit operations16 MiB × 16 rounds
MandelbrotRenders the Mandelbrot set and writes it as a PPM imageFloating point, file output2000×2000, 500 iterations
WordCountGenerates text from a random vocabulary, counts words in a hash map, prints the top 10Strings, hashing, hash maps10M words, 100k vocabulary
BinaryTreesBuilds and frees many complete binary treesAllocationdepth 18
SortQuicksort (median of three, insertion sort below 16) of random 32-bit integersBranches, memory access10M integers
NBodyFive-body planetary simulationFloating point, square root5M steps
MatrixMultiplyDense double-precision matrix product, i-k-j loop orderLoops, cache, vectorization1024×1024
PrimeSieveSieve of Eratosthenes over a byte array, prints count and sumMemory bandwidthprimes up to 100M
FannkuchPancake flips over every permutation (fannkuch-redux)Small arrays, branchesn = 10
Base64Hand-written Base64 encode and decode round tripByte manipulation, table lookups32 MiB × 4 rounds

Benchmark 2 of 2

Compile benchmark

The programs above are one file each, so their compile time is mostly the fixed cost of a build. This benchmark builds a real-sized project instead: 1,000 generated modules in about 100 files, the same code in every language (Rux: 98,574 lines in 112 files). Beside it, Baseline is the same build with one module, so the difference between the two is the time spent on the code itself.

Desktop · Core i9-11900KF · October 15, 2026 · 3 timed clean builds on all CPUs, 3 on one CPU and 3 rebuilds after a one-line edit

Results

A clean release build of the Large project, from deleting the build output to a finished program. Lower is better.

Rux compared with

Clean build of Large

Use the Arrow keys to move between languages. Press Escape to clear.

Other languages Outlined: JIT Hover, tap or focus the chart for the spread of the builds.

All measurements

Medians of 3 timed builds each, as the runner's report prints them.

Compile benchmark, median of the timed builds. The best value in each row is bold.
Large project RuxRustC++GoC# AOTC# JITJava AOTJava JIT
Clean build of Large (s) 0.859.819.802.259.059.7172.795.68
Clean build of Baseline (s) 0.100.490.260.334.334.8531.582.55
Large − Baseline (s) 0.759.329.541.914.724.8641.213.13
Compile speed (lines/s) · higher is better131,84110,85011,34150,19622,46521,8202,30330,320
Clean build of Large on one CPU (s) 3.6240.3575.695.4235.4137.80206.6716.88
Clean build of Baseline on one CPU (s) 0.170.630.390.395.527.07144.906.90
Large − Baseline on one CPU (s) 3.4539.7275.305.0429.8930.7361.779.97
Compile speed on one CPU (lines/s) · higher is better28,5002,5461,43719,0583,5463,4491,5379,517
Parallel speed-up · higher is better4.26×4.11×7.72×2.42×3.91×3.89×2.84×2.97×
Rebuild after a one-line edit (s) 0.339.760.890.568.969.4948.513.36
Peak memory, clean build of Large (MiB) 4906981,8022118409302,425562
Peak memory, clean build of Baseline (MiB) 1012261441611793662,408550
Peak memory, clean build of Large on one CPU (MiB) 3555971311933953932,330519
Peak memory, rebuild (MiB) 2046961582108538262,427590
Source files (files) 112112222112112112113113
Source lines (lines) 98,574101,264108,38596,155106,112106,11295,05295,052
Executable size (KiB) 4,3442,7653,0834,5202,5051,13712,1482,122
Deployable size (KiB) 4,3442,7653,0834,5202,50515,06512,14860,877

Large is the generated project; Baseline is the same build with one module, the fixed cost of every build. C# JIT and Java JIT executables in italics are not ranked: they need their runtime to run.

Methodology

Keeping it fair

Every algorithm is written by hand, identically, in every language: the same data generation, operation order and data layout. The programs use only standard-library I/O, collections and allocation, with no third-party packages, SIMD intrinsics or threads.

Inputs come from the same SplitMix64 generator, and floating-point results are printed as raw IEEE-754 bits, so every language must agree bit for bit; C++ is built with -ffp-contract=off for that reason. All builds target baseline x86-64, and runtimes run with their defaults, with no GC or JIT tuning for .NET, Go or the JVM.

Each language allocates the way it normally does. BinaryTrees uses new/delete in C++, Box in Rust, the garbage collector in Go, C# and Java, and Allocator::Pool in Rux. WordCount uses each standard library's hash map.

The program benchmark

Each app is built with the language's usual tool: rux, cargo, clang++, go build, dotnet publish, javac and jar, or native-image. After one untimed warm-up build come timed clean release builds. Go starts from a cache holding only the precompiled standard library, so the app itself is always compiled from scratch.

Each program then gets unmeasured warm-up runs and measured runs, with the languages taking turns so that drifts in the machine's state hit all of them alike. Execution time includes process start-up, which for the JIT builds means starting the runtime and compiling.

Every run must exit with code 0 and print exactly the expected output; otherwise the cell is marked FAIL and left out. The page shows medians, and the chart tooltips add the minimum, the standard deviation and the run count.

The compile benchmark

The projects are generated from one specification, so every language compiles the same modules, types and functions and prints the same result. Each module is one of ten kinds — a struct with methods, an enum state machine, dynamic dispatch, a hash map, sorting, a ring buffer, a CRC table, text formatting, small matrices, union-find — and calls a few of the modules before it. C++ builds with CMake and Ninja, Rust with Cargo, C# with dotnet publish, Java with javac and then native-image or jar and jlink.

A clean build removes the build output first: Ninja's object files, Cargo's target folder, the Go build cache except a precompiled standard library, and the MSBuild and Java output folders. Rux compiles its standard library from source as part of every build, while the other languages link a precompiled one, so most of Rux's Baseline time is its standard library.

The same clean builds are then repeated with the runner and every process the build starts pinned to one logical CPU; Cargo and Ninja are also told to run one job. The parallel speed-up is the build on one CPU divided by the build on all of them. A rebuild changes one line in the last module, which only Main calls, and builds again without cleaning: Ninja recompiles one file and links, Go one package, while release Cargo, C# and javac rebuild the whole project.

Reading the numbers

C# and Java appear twice. AOT is one native executable (NativeAOT, GraalVM Native Image). JIT ships its own runtime: C# JIT is published self-contained and trimmed, and Java JIT runs its jar from a minimal jlink runtime. Their executable size is only the program file (the IL assembly or the jar), which cannot run alone, so it is shown in italics and not ranked; their deployable size includes the runtime.

Peak memory and compile memory are the working set and the memory committed by all build processes on Windows, and the maximum resident set of the largest process on Linux, so they are not comparable across operating systems; times are not comparable across machines. Ratios are a language's value divided by Rux's, and the program benchmark summarises them by geometric mean so that a 2× win and a 2× loss cancel out.

The apps, the generator, the runner and full instructions to reproduce these results on your own machine are in rux-lang/Benchmarks.