Benchmarks
At a glance
Running ten programs
Compiling a 100,000-line project
Desktop · Core i9-11900KF · October 15, 2026
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.
| Metric | Rux | Rust | C++ | Go | C# AOT | C# JIT | Java AOT | Java 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.
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)
| App | Rux | Rust | C++ | Go | C# AOT | C# JIT | Java AOT | Java JIT |
|---|---|---|---|---|---|---|---|---|
| Sha512 | 0.535 | 0.497 | 0.469 | 0.662 | 0.686 | 0.825 | 0.627 | 0.703 |
| Mandelbrot | 0.932 | 0.916 | 0.903 | 0.887 | 0.916 | 0.970 | 0.923 | 0.985 |
| WordCount | 0.747 | 0.637 | 0.606 | 0.813 | 0.846 | 0.851 | 1.098 | 0.978 |
| BinaryTrees | 1.315 | 2.075 | 1.892 | 0.892 | 0.752 | 0.873 | 0.242 | 0.309 |
| Sort | 0.612 | 0.595 | 0.598 | 0.616 | 0.646 | 0.720 | 0.647 | 0.723 |
| NBody | 0.219 | 0.233 | 0.221 | 0.280 | 0.359 | 0.539 | 0.206 | 0.275 |
| MatrixMultiply | 0.210 | 0.631 | 0.193 | 0.575 | 0.682 | 0.794 | 0.741 | 0.399 |
| PrimeSieve | 0.568 | 0.587 | 0.553 | 0.570 | 0.582 | 0.636 | 0.631 | 0.627 |
| Fannkuch | 0.140 | 0.136 | 0.133 | 0.141 | 0.134 | 0.197 | 0.161 | 0.207 |
| Base64 | 0.232 | 0.280 | 0.223 | 0.276 | 0.303 | 0.348 | 0.565 | 0.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.
| App | What it does | Stresses | Standard size |
|---|---|---|---|
| Sha512 | SHA-512 of a pseudo-random buffer, re-hashed with the digest fed back in | 64-bit integer and bit operations | 16 MiB × 16 rounds |
| Mandelbrot | Renders the Mandelbrot set and writes it as a PPM image | Floating point, file output | 2000×2000, 500 iterations |
| WordCount | Generates text from a random vocabulary, counts words in a hash map, prints the top 10 | Strings, hashing, hash maps | 10M words, 100k vocabulary |
| BinaryTrees | Builds and frees many complete binary trees | Allocation | depth 18 |
| Sort | Quicksort (median of three, insertion sort below 16) of random 32-bit integers | Branches, memory access | 10M integers |
| NBody | Five-body planetary simulation | Floating point, square root | 5M steps |
| MatrixMultiply | Dense double-precision matrix product, i-k-j loop order | Loops, cache, vectorization | 1024×1024 |
| PrimeSieve | Sieve of Eratosthenes over a byte array, prints count and sum | Memory bandwidth | primes up to 100M |
| Fannkuch | Pancake flips over every permutation (fannkuch-redux) | Small arrays, branches | n = 10 |
| Base64 | Hand-written Base64 encode and decode round trip | Byte manipulation, table lookups | 32 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.
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.
| Large project | Rux | Rust | C++ | Go | C# AOT | C# JIT | Java AOT | Java JIT |
|---|---|---|---|---|---|---|---|---|
| Clean build of Large (s) | 0.85 | 9.81 | 9.80 | 2.25 | 9.05 | 9.71 | 72.79 | 5.68 |
| Clean build of Baseline (s) | 0.10 | 0.49 | 0.26 | 0.33 | 4.33 | 4.85 | 31.58 | 2.55 |
| Large − Baseline (s) | 0.75 | 9.32 | 9.54 | 1.91 | 4.72 | 4.86 | 41.21 | 3.13 |
| Compile speed (lines/s) · higher is better | 131,841 | 10,850 | 11,341 | 50,196 | 22,465 | 21,820 | 2,303 | 30,320 |
| Clean build of Large on one CPU (s) | 3.62 | 40.35 | 75.69 | 5.42 | 35.41 | 37.80 | 206.67 | 16.88 |
| Clean build of Baseline on one CPU (s) | 0.17 | 0.63 | 0.39 | 0.39 | 5.52 | 7.07 | 144.90 | 6.90 |
| Large − Baseline on one CPU (s) | 3.45 | 39.72 | 75.30 | 5.04 | 29.89 | 30.73 | 61.77 | 9.97 |
| Compile speed on one CPU (lines/s) · higher is better | 28,500 | 2,546 | 1,437 | 19,058 | 3,546 | 3,449 | 1,537 | 9,517 |
| Parallel speed-up · higher is better | 4.26× | 4.11× | 7.72× | 2.42× | 3.91× | 3.89× | 2.84× | 2.97× |
| Rebuild after a one-line edit (s) | 0.33 | 9.76 | 0.89 | 0.56 | 8.96 | 9.49 | 48.51 | 3.36 |
| Peak memory, clean build of Large (MiB) | 490 | 698 | 1,802 | 211 | 840 | 930 | 2,425 | 562 |
| Peak memory, clean build of Baseline (MiB) | 101 | 226 | 144 | 161 | 179 | 366 | 2,408 | 550 |
| Peak memory, clean build of Large on one CPU (MiB) | 355 | 597 | 131 | 193 | 395 | 393 | 2,330 | 519 |
| Peak memory, rebuild (MiB) | 204 | 696 | 158 | 210 | 853 | 826 | 2,427 | 590 |
| Source files (files) | 112 | 112 | 222 | 112 | 112 | 112 | 113 | 113 |
| Source lines (lines) | 98,574 | 101,264 | 108,385 | 96,155 | 106,112 | 106,112 | 95,052 | 95,052 |
| Executable size (KiB) | 4,344 | 2,765 | 3,083 | 4,520 | 2,505 | 1,137 | 12,148 | 2,122 |
| Deployable size (KiB) | 4,344 | 2,765 | 3,083 | 4,520 | 2,505 | 15,065 | 12,148 | 60,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.