Benchmarks
Zust vs Lua vs Python
This page summarizes the 30 tests recorded in benchmark.md at the repository root. Zust scripts run through the VM/JIT, while Lua and Python are scripting baselines; expand each case to inspect the current source code from the benches directory.
Geometric mean
Lua 5.9x
Python 21.9x
27 valid comparisons: Zust = 1.0x, Lua = 5.9x, Python = 21.9x.
Results are from cargo run --bin bench --release on 2026-06-11.
Notes and Recent Optimizations
Notes and Recent Optimizations
- The Python versions of bubble sort and quicksort did not complete because of large integer parsing; Lua has valid data and is still shown against Zust.
- Absolute timings depend on the machine and current load; ratios are comparable because the three languages were measured in the same run and environment.
- Recent optimization: constant-divisor fast paths remove unnecessary guards for known non-zero divisors, improving div/mod-heavy cases such as collatz and pow mod.
- Recent optimization: Dynamic::Map moved from BTreeMap to IndexMap, so map get/set and access are now consistently faster than Lua and Python.
- Known optimization point: list push/sum is bottlenecked by one native FFI call per element; inlining push/get_idx into Cranelift IR should remove that cost.
Summary Results
Summary Results
| Benchmark | Size | Zust | Lua | Python | Lua / Zust | Python / Zust |
|---|---|---|---|---|---|---|
| fibonacci(35) recursive | 35 | 231ms | 318ms | 651ms | 1.4x | 2.8x |
| fibonacci iter 50M | 50,000,000 | 147ms | 365ms | 3.6s | 2.5x | 24.4x |
| sieve 100K | 100,000 | 224us | 7ms | 17ms | 31.6x | 77.1x |
| list push/sum 2M | 2,000,000 | 43ms | 22ms | 199ms | 0.5x | 4.6x |
| bintree depth 20 | 20 | 16ms | 28ms | 51ms | 1.7x | 3.1x |
| nested loops(2000) | 2,000 | 11ms | 152ms | 1.4s | 13.6x | 122.2x |
| float ops 20M | 20,000,000 | 50ms | 273ms | 1.9s | 5.5x | 37.4x |
| strcat x50000 | 50,000 | 718us | 44ms | 16ms | 61.5x | 22.9x |
| collatz(100K) | 100,000 | 24ms | 233ms | 878ms | 9.8x | 36.9x |
| pow mod 5M | 5,000,000 | 50ms | 801ms | 4.3s | 15.9x | 85.2x |
| gcd(5M) | 5,000,000 | 255ms | 514ms | 1.6s | 2.0x | 6.3x |
| prime check(500K) | 500,000 | 28ms | 229ms | 748ms | 8.3x | 26.9x |
| bubble sort 10K | 10,000 | 46ms | 801ms | ERR | 17.4x | - |
| map bracket get/set 200K | 200,000 | 91ms | 161ms | 110ms | 1.8x | 1.2x |
| mandelbrot 1000 | 1,000 | 30ms | 628ms | 3.5s | 21.3x | 119.0x |
| spectral norm 550 | 550 | 39ms | 186ms | 511ms | 4.8x | 13.2x |
| bit popcount 50M | 50,000,000 | 352ms | 2.0s | 12.0s | 5.6x | 34.0x |
| sequential fact 100M | 100,000,000 | 387ms | 504ms | 5.7s | 1.3x | 14.8x |
| string build x5000 | 5,000 | 54us | 11ms | 4ms | 193.6x | 76.3x |
| map bracket acc 200K | 200,000 | 41ms | 57ms | 72ms | 1.4x | 1.7x |
| struct field ops 20M | 20,000,000 | 61ms | 669ms | 2.8s | 10.9x | 45.8x |
| closure sum 50M | 50,000,000 | 349ms | 623ms | 3.1s | 1.8x | 9.0x |
| closure 16args 10M | 10,000,000 | 77ms | 580ms | 1.7s | 7.5x | 21.6x |
| vec add 100x500K | 500,000 | 28ms | 311ms | 2.5s | 11.0x | 86.7x |
| ackermann(3,6) | 6 | 2ms | 7ms | 8ms | 4.1x | 4.9x |
| quicksort 2K | 2,000 | 59us | 570us | ERR | 9.7x | - |
| matrix mul 40x40 x50 | 50 | 3ms | 87ms | 273ms | 31.7x | 99.4x |
| binary search 10K | 10,000 | 494us | 8ms | 22ms | 15.6x | 44.6x |
| random LCG 50M | 50,000,000 | 63ms | 437ms | 7.0s | 6.9x | 111.3x |
| array reverse 1K x10K | 10,000 | 9ms | 136ms | 1.1s | 15.0x | 122.4x |
All Tests, Code, and Results
All Tests, Code, and Results
fibonacci(35) recursive Zust 231ms · Lua 318ms · Python 651ms
Size35
Zust231ms
Lua318ms
Python651ms
Lua / Zust1.4x
Python / Zust2.8x
Zust
fn fib(n: i64) {
if n <= 1 {
return n;
}
fib(n - 1) + fib(n - 2)
}
pub fn bench(n: i64) {
fib(n)
}
Lua
local function fib(n)
if n <= 1 then return n end
return fib(n - 1) + fib(n - 2)
end
local n = tonumber(arg[1])
print(fib(n))
Python
import sys
def fib(n):
if n <= 1: return n
return fib(n - 1) + fib(n - 2)
n = int(sys.argv[1])
print(fib(n))
fibonacci iter 50M Zust 147ms · Lua 365ms · Python 3.6s
Size50,000,000
Zust147ms
Lua365ms
Python3.6s
Lua / Zust2.5x
Python / Zust24.4x
Zust
pub fn bench(n: i64) {
let a = 0i64;
let b = 1i64;
for _ in 0..n {
(a, b) = (b, (a + b) % 1000000007i64);
}
a
}
Lua
local n = tonumber(arg[1])
local a, b = 0, 1
for _ = 1, n do
a, b = b, (a + b) % 1000000007
end
print(a)
Python
import sys
n = int(sys.argv[1])
a, b = 0, 1
for _ in range(n):
a, b = b, (a + b) % 1000000007
print(a)
sieve 100K Zust 224us · Lua 7ms · Python 17ms
Size100,000
Zust224us
Lua7ms
Python17ms
Lua / Zust31.6x
Python / Zust77.1x
Zust
pub fn bench<N>() {
let is_prime = [true; N];
is_prime[0] = false;
is_prime[1] = false;
let count = 0i64;
for p in 2i64..N {
if is_prime[p] == true {
count = count + 1;
let step = p;
let j = p * p;
while j < N {
is_prime[j] = false;
j = j + step;
}
}
}
count
}
Lua
local n = tonumber(arg[1])
local is_prime = {}
for i = 0, n do is_prime[i] = true end
if n >= 0 then is_prime[0] = false end
if n >= 1 then is_prime[1] = false end
local count = 0
for p = 2, n do
if is_prime[p] then
count = count + 1
local step = p
local j = p * p
while j <= n do
is_prime[j] = false
j = j + step
end
end
end
print(count)
Python
import sys
n = int(sys.argv[1])
is_prime = [True] * (n + 1)
if n >= 0: is_prime[0] = False
if n >= 1: is_prime[1] = False
count = 0
for p in range(2, n + 1):
if is_prime[p]:
count += 1
step = p
j = p * p
while j <= n:
is_prime[j] = False
j += step
print(count)
list push/sum 2M Zust 43ms · Lua 22ms · Python 199ms
Size2,000,000
Zust43ms
Lua22ms
Python199ms
Lua / Zust0.5x
Python / Zust4.6x
Zust
pub fn bench(n: i64) {
let l = [];
for i in 0..n {
l.push(i);
}
let sum = 0i64;
for j in 0..n {
sum = sum + l[j];
}
sum
}
Lua
local n = tonumber(arg[1])
local l = {}
for i = 0, n - 1 do l[i] = i end
local sum = 0
for i = 0, n - 1 do sum = sum + l[i] end
print(sum)
Python
import sys
n = int(sys.argv[1])
l = []
for i in range(n): l.append(i)
total = 0
for i in range(n): total += l[i]
print(total)
bintree depth 20 Zust 16ms · Lua 28ms · Python 51ms
Size20
Zust16ms
Lua28ms
Python51ms
Lua / Zust1.7x
Python / Zust3.1x
Zust
fn make_tree(depth: i64) {
if depth <= 0 {
return 1;
}
1 + make_tree(depth - 1) + make_tree(depth - 1)
}
pub fn bench(n: i64) {
make_tree(n)
}
Lua
local function make_tree(depth)
if depth <= 0 then return 1 end
return 1 + make_tree(depth - 1) + make_tree(depth - 1)
end
local n = tonumber(arg[1])
print(make_tree(n))
Python
import sys
def make_tree(depth):
if depth <= 0: return 1
return 1 + make_tree(depth - 1) + make_tree(depth - 1)
n = int(sys.argv[1])
print(make_tree(n))
nested loops(2000) Zust 11ms · Lua 152ms · Python 1.4s
Size2,000
Zust11ms
Lua152ms
Python1.4s
Lua / Zust13.6x
Python / Zust122.2x
Zust
pub fn bench(n: i64) {
let bodies = 100i64;
let total = 0i64;
for step in 0..n {
for i in 0..bodies {
for j in 0..bodies {
if i != j {
total = total + i * j;
}
}
}
}
total
}
Lua
local n = tonumber(arg[1])
local bodies = 100
local total = 0
for step = 1, n do
for i = 0, bodies - 1 do
for j = 0, bodies - 1 do
if i ~= j then
total = total + i * j
end
end
end
end
print(total)
Python
import sys
n = int(sys.argv[1])
bodies = 100
total = 0
for step in range(n):
for i in range(bodies):
for j in range(bodies):
if i != j:
total += i * j
print(total)
float ops 20M Zust 50ms · Lua 273ms · Python 1.9s
Size20,000,000
Zust50ms
Lua273ms
Python1.9s
Lua / Zust5.5x
Python / Zust37.4x
Zust
pub fn bench(n: i64) {
let x = 1.0f64;
let y = 2.0f64;
for i in 0..n {
x = x * 1.000001f64 + y * 0.999999f64;
y = y * 1.000001f64 - x * 0.999999f64;
}
(x + y) as i64
}
Lua
local n = tonumber(arg[1])
local x = 1.0
local y = 2.0
for _ = 1, n do
x = x * 1.000001 + y * 0.999999
y = y * 1.000001 - x * 0.999999
end
print(math.floor(x + y))
Python
import sys
n = int(sys.argv[1])
x = 1.0
y = 2.0
for _ in range(n):
x = x * 1.000001 + y * 0.999999
y = y * 1.000001 - x * 0.999999
print(int(x + y))
strcat x50000 Zust 718us · Lua 44ms · Python 16ms
Size50,000
Zust718us
Lua44ms
Python16ms
Lua / Zust61.5x
Python / Zust22.9x
Zust
pub fn bench(n: i64) {
let s = "";
for i in 0..n {
s = s + "x";
}
s.len() as i64
}
Lua
local n = tonumber(arg[1])
local s = ""
for _ = 1, n do
s = s .. "x"
end
print(#s)
Python
import sys
n = int(sys.argv[1])
s = ""
for _ in range(n):
s += "x"
print(len(s))
collatz(100K) Zust 24ms · Lua 233ms · Python 878ms
Size100,000
Zust24ms
Lua233ms
Python878ms
Lua / Zust9.8x
Python / Zust36.9x
Zust
pub fn bench(n: i64) {
let total = 0i64;
for start in 1..=n {
let x = start;
while x != 1 {
if x % 2 == 0 {
x = x / 2;
} else {
x = 3 * x + 1;
}
total = total + 1;
}
}
total
}
Lua
local n = tonumber(arg[1])
local total = 0
for start = 1, n do
local x = start
while x ~= 1 do
if x % 2 == 0 then
x = x / 2
else
x = 3 * x + 1
end
total = total + 1
end
end
print(total)
Python
import sys
n = int(sys.argv[1])
total = 0
for start in range(1, n + 1):
x = start
while x != 1:
if x % 2 == 0:
x = x // 2
else:
x = 3 * x + 1
total += 1
print(total)
pow mod 5M Zust 50ms · Lua 801ms · Python 4.3s
Size5,000,000
Zust50ms
Lua801ms
Python4.3s
Lua / Zust15.9x
Python / Zust85.2x
Zust
pub fn bench(n: i64) {
let result = 1i64;
for i in 0..n {
let base = (i % 100i64) + 2i64;
let exp = (i % 31i64) + 1i64;
let m = 1000000007i64;
let r = 1i64;
let b = base;
let e = exp;
while e > 0 {
if e % 2i64 == 1i64 {
r = (r * b) % m;
}
b = (b * b) % m;
e = e / 2i64;
}
result = (result + r) % m;
}
result
}
Lua
local n = tonumber(arg[1])
local result = 1
for i = 0, n - 1 do
local base = (i % 100) + 2
local exp = (i % 31) + 1
local m = 1000000007
local r = 1
local b = base
local e = exp
while e > 0 do
if e % 2 == 1 then
r = (r * b) % m
end
b = (b * b) % m
e = math.floor(e / 2)
end
result = (result + r) % m
end
print(result)
Python
import sys
n = int(sys.argv[1])
result = 1
for i in range(n):
base = (i % 100) + 2
exp = (i % 31) + 1
m = 1000000007
r = 1
b = base
e = exp
while e > 0:
if e % 2 == 1:
r = (r * b) % m
b = (b * b) % m
e = e // 2
result = (result + r) % m
print(result)
gcd(5M) Zust 255ms · Lua 514ms · Python 1.6s
Size5,000,000
Zust255ms
Lua514ms
Python1.6s
Lua / Zust2.0x
Python / Zust6.3x
Zust
fn gcd(a: i64, b: i64) {
let x = a;
let y = b;
while y != 0 {
let t = y;
y = x % y;
x = t;
}
x
}
pub fn bench(n: i64) {
let total = 0i64;
for i in 0..n {
total = total + gcd(i, n - i);
}
total
}
Lua
local function gcd(a, b)
while b ~= 0 do
a, b = b, a % b
end
return a
end
local n = tonumber(arg[1])
local total = 0
for i = 0, n - 1 do
total = total + gcd(i, n - i)
end
print(total)
Python
import sys
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
n = int(sys.argv[1])
total = 0
for i in range(n):
total += gcd(i, n - i)
print(total)
prime check(500K) Zust 28ms · Lua 229ms · Python 748ms
Size500,000
Zust28ms
Lua229ms
Python748ms
Lua / Zust8.3x
Python / Zust26.9x
Zust
fn is_prime(n: i64) {
if n < 2 { return false; }
let i = 2i64;
while i * i <= n {
if n % i == 0 { return false; }
i = i + 1;
}
true
}
pub fn bench(n: i64) {
let count = 0i64;
for x in 2..=n {
if is_prime(x) == true {
count = count + 1;
}
}
count
}
Lua
local function is_prime(n)
if n < 2 then return false end
local i = 2
while i * i <= n do
if n % i == 0 then return false end
i = i + 1
end
return true
end
local n = tonumber(arg[1])
local count = 0
for x = 2, n do
if is_prime(x) then count = count + 1 end
end
print(count)
Python
import sys
def is_prime(n):
if n < 2:
return False
i = 2
while i * i <= n:
if n % i == 0:
return False
i += 1
return True
n = int(sys.argv[1])
count = 0
for x in range(2, n + 1):
if is_prime(x):
count += 1
print(count)
bubble sort 10K Zust 46ms · Lua 801ms · Python ERR
Size10,000
Zust46ms
Lua801ms
PythonERR
Lua / Zust17.4x
Python / Zust-
NoteThe Python version did not complete in this run and is excluded from the geometric mean. Lua has valid data and is still shown against Zust.
Zust
pub fn bench<N>() {
let items: [i64; N] = [0i64; N];
for i in 0i64..N {
let seed = i * 6364136223846793005i64 + 1i64;
items[i] = seed;
}
for i in 0i64..N {
let limit = N - i - 1;
for j in 0i64..limit {
if items[j] > items[j + 1] {
let a = items[j];
let b = items[j + 1];
items[j] = b;
items[j + 1] = a;
}
}
}
let sum = 0i64;
for i in 0i64..N {
sum = sum + items[i];
}
sum
}
Lua
local function bubble_sort(items)
local n = #items
for i = 1, n do
for j = 1, n - i do
if items[j] > items[j + 1] then
items[j], items[j + 1] = items[j + 1], items[j]
end
end
end
end
local n = tonumber(arg[1])
local items = {}
for i = 0, n - 1 do
local seed = i * 6364136223846793005 + 1
items[i + 1] = seed
end
bubble_sort(items)
local sum = 0
for i = 1, n do sum = sum + items[i] end
print(sum)
Python
import sys
def bubble_sort(items):
n = len(items)
for i in range(n):
for j in range(n - i - 1):
if items[j] > items[j + 1]:
items[j], items[j + 1] = items[j + 1], items[j]
n = int(sys.argv[1])
items = []
for i in range(n):
seed = i * 6364136223846793005 + 1
items.append(seed)
bubble_sort(items)
print(sum(items))
map bracket get/set 200K Zust 91ms · Lua 161ms · Python 110ms
Size200,000
Zust91ms
Lua161ms
Python110ms
Lua / Zust1.8x
Python / Zust1.2x
Zust
pub fn bench(n: i64) {
let m = {};
for i in 0..n {
let key = "key_" + i;
m[key] = i;
}
let sum = 0i64;
for i in 0..n {
let key = "key_" + i;
sum = sum + m[key];
}
sum
}
Lua
local n = tonumber(arg[1])
local m = {}
for i = 0, n - 1 do
local key = "key_" .. i
m[key] = i
end
local sum = 0
for i = 0, n - 1 do
local key = "key_" .. i
sum = sum + m[key]
end
print(sum)
Python
import sys
n = int(sys.argv[1])
m = {}
for i in range(n):
key = "key_" + str(i)
m[key] = i
total = 0
for i in range(n):
key = "key_" + str(i)
total += m[key]
print(total)
mandelbrot 1000 Zust 30ms · Lua 628ms · Python 3.5s
Size1,000
Zust30ms
Lua628ms
Python3.5s
Lua / Zust21.3x
Python / Zust119.0x
Zust
pub fn bench(n: i64) {
let hw = n / 2;
let total = 0i64;
let nf = n as f64;
let hwf = hw as f64;
for y in 0..n {
let yf = y as f64;
let ci = (yf - hwf) / (0.5f64 * nf);
for x in 0..n {
let xf = x as f64;
let cr = 1.5f64 * (xf - hwf) / (0.5f64 * nf);
let zr = 0.0f64;
let zi = 0.0f64;
let k = 0i64;
while k < 50 && zr * zr + zi * zi < 4.0f64 {
let zr2 = zr * zr;
let zi2 = zi * zi;
zi = 2.0f64 * zr * zi + ci;
zr = zr2 - zi2 + cr;
k = k + 1;
}
total = total + k;
}
}
total
}
Lua
local n = tonumber(arg[1])
local total = 0
for y = 0, n - 1 do
for x = 0, n - 1 do
local cr = 1.5 * (x - n / 2) / (0.5 * n)
local ci = (y - n / 2) / (0.5 * n)
local zr, zi = 0.0, 0.0
local k = 0
while k < 50 and zr * zr + zi * zi < 4 do
zr, zi = zr * zr - zi * zi + cr, 2 * zr * zi + ci
k = k + 1
end
total = total + k
end
end
print(total)
Python
import sys
n = int(sys.argv[1])
total = 0
for y in range(n):
for x in range(n):
cr = 1.5 * (x - n / 2) / (0.5 * n)
ci = (y - n / 2) / (0.5 * n)
zr = zi = 0.0
k = 0
while k < 50 and zr * zr + zi * zi < 4:
zr, zi = zr * zr - zi * zi + cr, 2 * zr * zi + ci
k += 1
total += k
print(total)
spectral norm 550 Zust 39ms · Lua 186ms · Python 511ms
Size550
Zust39ms
Lua186ms
Python511ms
Lua / Zust4.8x
Python / Zust13.2x
Zust
fn eval_a(i: i64, j: i64) {
1.0f64 / ((i + j) * (i + j + 1) / 2 + i + 1) as f64
}
fn multiply_av(n: i64, v: [f64; 550]) {
let result: [f64; 550] = [0.0f64; 550];
for i in 0..n {
let sum = 0.0f64;
for j in 0..n {
sum = sum + eval_a(i, j) * v[j];
}
result[i] = sum;
}
result
}
fn multiply_atv(n: i64, v: [f64; 550]) {
let result: [f64; 550] = [0.0f64; 550];
for i in 0..n {
let sum = 0.0f64;
for j in 0..n {
sum = sum + eval_a(j, i) * v[j];
}
result[i] = sum;
}
result
}
pub fn bench(n: i64) {
let u: [f64; 550] = [1.0f64; 550];
let v: [f64; 550] = [0.0f64; 550];
for _ in 0..10 {
v = multiply_av(n, u);
u = multiply_atv(n, v);
}
let vbv = 0.0f64;
let vv = 0.0f64;
for i in 0..n {
vbv = vbv + u[i] * v[i];
vv = vv + v[i] * v[i];
}
let result = sqrt(vbv / vv);
(result * 1000000.0f64) as i64
}
Lua
local function eval_A(i, j)
return 1.0 / ((i + j) * (i + j + 1) / 2 + i + 1)
end
local function multiply_Av(n, v)
local result = {}
for i = 0, n - 1 do
local sum = 0.0
for j = 0, n - 1 do
sum = sum + eval_A(i, j) * v[j + 1]
end
result[i + 1] = sum
end
return result
end
local function multiply_Atv(n, v)
local result = {}
for i = 0, n - 1 do
local sum = 0.0
for j = 0, n - 1 do
sum = sum + eval_A(j, i) * v[j + 1]
end
result[i + 1] = sum
end
return result
end
local n = tonumber(arg[1])
local u = {}
local v = {}
for i = 0, n - 1 do u[i + 1] = 1.0 end
for _ = 1, 10 do
v = multiply_Av(n, u)
u = multiply_Atv(n, v)
end
local vBv = 0.0
local vv = 0.0
for i = 0, n - 1 do
vBv = vBv + u[i + 1] * v[i + 1]
vv = vv + v[i + 1] * v[i + 1]
end
local result = math.sqrt(vBv / vv)
print(math.floor(result * 1000000))
Python
import sys
import math
def eval_A(i, j):
return 1.0 / ((i + j) * (i + j + 1) / 2 + i + 1)
def multiply_Av(n, v):
result = [0.0] * n
for i in range(n):
s = 0.0
for j in range(n):
s += eval_A(i, j) * v[j]
result[i] = s
return result
def multiply_Atv(n, v):
result = [0.0] * n
for i in range(n):
s = 0.0
for j in range(n):
s += eval_A(j, i) * v[j]
result[i] = s
return result
n = int(sys.argv[1])
u = [1.0] * n
v = [0.0] * n
for _ in range(10):
v = multiply_Av(n, u)
u = multiply_Atv(n, v)
vBv = 0.0
vv = 0.0
for i in range(n):
vBv += u[i] * v[i]
vv += v[i] * v[i]
result = math.sqrt(vBv / vv)
print(int(result * 1000000))
bit popcount 50M Zust 352ms · Lua 2.0s · Python 12.0s
Size50,000,000
Zust352ms
Lua2.0s
Python12.0s
Lua / Zust5.6x
Python / Zust34.0x
Zust
fn popcount(x: i64) {
let n = x;
n = n - ((n >> 1) & 0x5555555555555555i64);
n = (n & 0x3333333333333333i64) + ((n >> 2) & 0x3333333333333333i64);
n = (n + (n >> 4)) & 0x0F0F0F0F0F0F0F0Fi64;
n = n + (n >> 8);
n = n + (n >> 16);
n = n + (n >> 32);
n & 0x7Fi64
}
pub fn bench(n: i64) {
let total = 0i64;
for i in 0..n {
total = total + popcount(i);
}
total
}
Lua
local function popcount(x)
local n = x
n = n - ((n >> 1) & 0x5555555555555555)
n = (n & 0x3333333333333333) + ((n >> 2) & 0x3333333333333333)
n = (n + (n >> 4)) & 0x0F0F0F0F0F0F0F0F
n = n + (n >> 8)
n = n + (n >> 16)
n = n + (n >> 32)
return n & 0x7F
end
local n = tonumber(arg[1])
local total = 0
for i = 0, n - 1 do
total = total + popcount(i)
end
print(total)
Python
import sys
def popcount(x):
n = x
n = n - ((n >> 1) & 0x5555555555555555)
n = (n & 0x3333333333333333) + ((n >> 2) & 0x3333333333333333)
n = (n + (n >> 4)) & 0x0F0F0F0F0F0F0F0F
n = n + (n >> 8)
n = n + (n >> 16)
n = n + (n >> 32)
return n & 0x7F
n = int(sys.argv[1])
total = 0
for i in range(n):
total += popcount(i)
print(total)
sequential fact 100M Zust 387ms · Lua 504ms · Python 5.7s
Size100,000,000
Zust387ms
Lua504ms
Python5.7s
Lua / Zust1.3x
Python / Zust14.8x
Zust
pub fn bench(n: i64) {
let result = 1i64;
let m = 1000000007i64;
for i in 1..=n {
result = (result * i) % m;
}
result
}
Lua
local n = tonumber(arg[1])
local result = 1
local m = 1000000007
for i = 1, n do
result = (result * i) % m
end
print(result)
Python
import sys
n = int(sys.argv[1])
result = 1
m = 1000000007
for i in range(1, n + 1):
result = (result * i) % m
print(result)
string build x5000 Zust 54us · Lua 11ms · Python 4ms
Size5,000
Zust54us
Lua11ms
Python4ms
Lua / Zust193.6x
Python / Zust76.3x
Zust
pub fn bench(n: i64) {
let s = "";
let sep = ",";
let chunk = "hello";
for i in 0..n {
if i > 0 {
s = s + sep;
}
s = s + chunk;
}
s.len() as i64
}
Lua
local n = tonumber(arg[1])
local s = ""
local sep = ","
local chunk = "hello"
for i = 0, n - 1 do
if i > 0 then s = s .. sep end
s = s .. chunk
end
print(#s)
Python
import sys
n = int(sys.argv[1])
s = ""
sep = ","
chunk = "hello"
for i in range(n):
if i > 0:
s += sep
s += chunk
print(len(s))
map bracket acc 200K Zust 41ms · Lua 57ms · Python 72ms
Size200,000
Zust41ms
Lua57ms
Python72ms
Lua / Zust1.4x
Python / Zust1.7x
Zust
pub fn bench(n: i64) {
let m = {};
for i in 0..n {
let key = "" + i;
m[key] = i;
}
let sum = 0i64;
for i in 0..n {
let key = "" + i;
sum = sum + m[key];
}
sum
}
Lua
local n = tonumber(arg[1])
local m = {}
for i = 0, n - 1 do
local key = tostring(i)
m[key] = i
end
local sum = 0
for i = 0, n - 1 do
local key = tostring(i)
sum = sum + m[key]
end
print(sum)
Python
import sys
n = int(sys.argv[1])
m = {}
for i in range(n):
key = str(i)
m[key] = i
total = 0
for i in range(n):
key = str(i)
total += m[key]
print(total)
struct field ops 20M Zust 61ms · Lua 669ms · Python 2.8s
Size20,000,000
Zust61ms
Lua669ms
Python2.8s
Lua / Zust10.9x
Python / Zust45.8x
Zust
struct Vec3 {
x: f64,
y: f64,
z: f64,
}
pub fn bench(n: i64) {
let v = Vec3{x: 1.0f64, y: 2.0f64, z: 3.0f64};
let total = 0.0f64;
for _ in 0..n {
let sum = v.x + v.y + v.z;
v.x = v.x + 0.001f64;
v.y = v.y + 0.002f64;
v.z = v.z + 0.003f64;
total = total + sum;
}
total as i64
}
Lua
local Vec3 = {}
function Vec3.new(x, y, z)
return {x = x, y = y, z = z}
end
local n = tonumber(arg[1])
local v = Vec3.new(1.0, 2.0, 3.0)
local total = 0.0
for _ = 0, n - 1 do
local sum = v.x + v.y + v.z
v.x = v.x + 0.001
v.y = v.y + 0.002
v.z = v.z + 0.003
total = total + sum
end
print(math.floor(total))
Python
import sys
class Vec3:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
n = int(sys.argv[1])
v = Vec3(1.0, 2.0, 3.0)
total = 0.0
for _ in range(n):
s = v.x + v.y + v.z
v.x += 0.001
v.y += 0.002
v.z += 0.003
total += s
print(int(total))
closure sum 50M Zust 349ms · Lua 623ms · Python 3.1s
Size50,000,000
Zust349ms
Lua623ms
Python3.1s
Lua / Zust1.8x
Python / Zust9.0x
Zust
pub fn bench(n: i64) {
let acc = 0i64;
let add = |a: i64, b: i64| {
a + b
};
for i in 0..n {
acc = add(acc, i);
}
acc
}
Lua
local n = tonumber(arg[1])
local acc = 0
local function add(a, b)
return a + b
end
for i = 0, n - 1 do
acc = add(acc, i)
end
print(acc)
Python
import sys
n = int(sys.argv[1])
acc = 0
def add(a, b):
return a + b
for i in range(n):
acc = add(acc, i)
print(acc)
closure 16args 10M Zust 77ms · Lua 580ms · Python 1.7s
Size10,000,000
Zust77ms
Lua580ms
Python1.7s
Lua / Zust7.5x
Python / Zust21.6x
Zust
pub fn bench(n: i64) {
let acc = 0i64;
let sum16 = |a, b, c, d, e, f, g, h, i, j, k, l, m, n_arg, o, p| {
a + b + c + d + e + f + g + h + i + j + k + l + m + n_arg + o + p
};
for idx in 0..n {
acc = acc + sum16(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
}
acc
}
Lua
local n = tonumber(arg[1])
local acc = 0
local function sum16(a, b, c, d, e, f, g, h, i, j, k, l, m, n_arg, o, p)
return a + b + c + d + e + f + g + h + i + j + k + l + m + n_arg + o + p
end
for idx = 0, n - 1 do
acc = acc + sum16(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)
end
print(acc)
Python
import sys
n = int(sys.argv[1])
acc = 0
def sum16(a, b, c, d, e, f, g, h, i, j, k, l, m, n_arg, o, p):
return a + b + c + d + e + f + g + h + i + j + k + l + m + n_arg + o + p
for idx in range(n):
acc += sum16(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)
print(acc)
vec add 100x500K Zust 28ms · Lua 311ms · Python 2.5s
Size500,000
Zust28ms
Lua311ms
Python2.5s
Lua / Zust11.0x
Python / Zust86.7x
Zust
pub fn bench(n: i64) {
let size = 100i64;
let a: [f64; 100] = [0.0f64; 100];
for i in 0..size {
a[i] = (i as f64) * 1.5f64;
}
let total = 0.0f64;
for _ in 0..n {
for i in 0..size {
total = total + a[i];
}
}
total as i64
}
Lua
local n = tonumber(arg[1])
local size = 100
local a = {}
for i = 0, size - 1 do
a[i + 1] = i * 1.5
end
local total = 0.0
for _ = 0, n - 1 do
for i = 0, size - 1 do
total = total + a[i + 1]
end
end
print(math.floor(total))
Python
import sys
n = int(sys.argv[1])
size = 100
a = [i * 1.5 for i in range(size)]
total = 0.0
for _ in range(n):
for i in range(size):
total += a[i]
print(int(total))
ackermann(3,6) Zust 2ms · Lua 7ms · Python 8ms
Size6
Zust2ms
Lua7ms
Python8ms
Lua / Zust4.1x
Python / Zust4.9x
Zust
fn ack(m: i64, n: i64) {
if m == 0 {
return n + 1;
}
if n == 0 {
return ack(m - 1, 1);
}
ack(m - 1, ack(m, n - 1))
}
pub fn bench(n: i64) {
ack(3, n)
}
Lua
local function ack(m, n)
if m == 0 then return n + 1 end
if n == 0 then return ack(m - 1, 1) end
return ack(m - 1, ack(m, n - 1))
end
local n = 6 -- default
if arg and arg[1] then n = tonumber(arg[1]) or 6 end
print(ack(3, n))
Python
import sys
def ack(m, n):
if m == 0:
return n + 1
if n == 0:
return ack(m - 1, 1)
return ack(m - 1, ack(m, n - 1))
n = int(sys.argv[1]) if len(sys.argv) > 1 else 6
print(ack(3, n))
quicksort 2K Zust 59us · Lua 570us · Python ERR
Size2,000
Zust59us
Lua570us
PythonERR
Lua / Zust9.7x
Python / Zust-
NoteThe Python version did not complete in this run and is excluded from the geometric mean. Lua has valid data and is still shown against Zust.
Zust
pub fn bench<N>() {
let arr: [i64; N] = [0i64; N];
for i in 0i64..N {
let seed = i * 6364136223846793005i64 + 1i64;
arr[i] = seed;
}
let lows: [i64; N] = [0i64; N];
let highs: [i64; N] = [0i64; N];
let top = 0i64;
lows[top] = 0i64;
highs[top] = N - 1;
while top >= 0i64 {
let low = lows[top];
let high = highs[top];
top -= 1i64;
while low < high {
let pivot = arr[high];
let i = low - 1i64;
for j in low..high {
if arr[j] <= pivot {
i += 1i64;
let tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
let pi = i + 1i64;
let tmp = arr[pi];
arr[pi] = arr[high];
arr[high] = tmp;
if pi - low < high - pi {
if pi + 1i64 < high {
top += 1i64;
lows[top] = pi + 1i64;
highs[top] = high;
}
high = pi - 1i64;
} else {
if low < pi - 1i64 {
top += 1i64;
lows[top] = low;
highs[top] = pi - 1i64;
}
low = pi + 1i64;
}
}
}
let sum = 0i64;
for idx in 0i64..N {
sum = sum + arr[idx];
}
sum
}
Lua
local function partition(arr, low, high)
local pivot = arr[high + 1]
local i = low
for j = low, high - 1 do
if arr[j + 1] <= pivot then
arr[i + 1], arr[j + 1] = arr[j + 1], arr[i + 1]
i = i + 1
end
end
arr[i + 1], arr[high + 1] = arr[high + 1], arr[i + 1]
return i
end
local function quicksort(arr, low, high)
if low < high then
local pi = partition(arr, low, high)
quicksort(arr, low, pi - 1)
quicksort(arr, pi + 1, high)
end
end
local n = tonumber(arg[1])
local arr = {}
for i = 0, n - 1 do
arr[i + 1] = i * 6364136223846793005 + 1
end
quicksort(arr, 0, n - 1)
local sum = 0
for i = 0, n - 1 do
sum = sum + arr[i + 1]
end
print(sum)
Python
import sys
def partition(arr, low, high):
pivot = arr[high]
i = low - 1
for j in range(low, high):
if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[high] = arr[high], arr[i + 1]
return i + 1
def quicksort(arr, low, high):
if low < high:
pi = partition(arr, low, high)
quicksort(arr, low, pi - 1)
quicksort(arr, pi + 1, high)
n = int(sys.argv[1])
arr = [i * 6364136223846793005 + 1 for i in range(n)]
quicksort(arr, 0, n - 1)
print(sum(arr))
matrix mul 40x40 x50 Zust 3ms · Lua 87ms · Python 273ms
Size50
Zust3ms
Lua87ms
Python273ms
Lua / Zust31.7x
Python / Zust99.4x
Zust
pub fn bench(n: i64) {
let sz = 40i64;
let a: [f64; 1600] = [0.0f64; 1600];
let b: [f64; 1600] = [0.0f64; 1600];
let c: [f64; 1600] = [0.0f64; 1600];
for i in 0..sz {
for j in 0..sz {
a[i * sz + j] = ((i * j) as f64) * 0.01f64;
b[i * sz + j] = ((i + j) as f64) * 0.005f64;
}
}
for _ in 0..n {
for i in 0..sz {
for k in 0..sz {
let aik = a[i * sz + k];
for j in 0..sz {
c[i * sz + j] = c[i * sz + j] + aik * b[k * sz + j];
}
}
}
}
c[0] as i64
}
Lua
local n = tonumber(arg[1])
local sz = 40
local a, b, c = {}, {}, {}
for i = 0, sz - 1 do
for j = 0, sz - 1 do
a[i * sz + j + 1] = (i * j) * 0.01
b[i * sz + j + 1] = (i + j) * 0.005
end
end
for i = 0, sz - 1 do
for j = 0, sz - 1 do
c[i * sz + j + 1] = 0.0
end
end
for _ = 1, n do
for i = 0, sz - 1 do
for k = 0, sz - 1 do
local aik = a[i * sz + k + 1]
for j = 0, sz - 1 do
c[i * sz + j + 1] = c[i * sz + j + 1] + aik * b[k * sz + j + 1]
end
end
end
end
print(math.floor(c[1]))
Python
import sys
n = int(sys.argv[1])
sz = 40
sz2 = sz * sz
a = [0.0] * sz2
b = [0.0] * sz2
c = [0.0] * sz2
for i in range(sz):
for j in range(sz):
a[i * sz + j] = (i * j) * 0.01
b[i * sz + j] = (i + j) * 0.005
for _ in range(n):
for i in range(sz):
for k in range(sz):
aik = a[i * sz + k]
base = i * sz
bk_base = k * sz
for j in range(sz):
c[base + j] += aik * b[bk_base + j]
print(int(c[0]))
binary search 10K Zust 494us · Lua 8ms · Python 22ms
Size10,000
Zust494us
Lua8ms
Python22ms
Lua / Zust15.6x
Python / Zust44.6x
Zust
pub fn bench<N>() {
let arr: [i64; N] = [0i64; N];
for i in 0i64..N {
arr[i] = i * 2;
}
let sum = 0i64;
for target in 0i64..N {
let low = 0i64;
let high = N - 1;
let found = -1i64;
while low <= high {
let mid = (low + high) / 2;
if arr[mid] == target * 2 {
found = mid;
low = high + 1;
} else {
if arr[mid] < target * 2 {
low = mid + 1;
} else {
high = mid - 1;
}
}
}
sum = sum + found;
}
sum
}
Lua
local n = tonumber(arg[1])
local arr = {}
for i = 0, n - 1 do
arr[i + 1] = i * 2
end
local sum = 0
for target = 0, n - 1 do
local low, high = 0, n - 1
local found = -1
while low <= high do
local mid = math.floor((low + high) / 2)
if arr[mid + 1] == target * 2 then
found = mid
low = high + 1
elseif arr[mid + 1] < target * 2 then
low = mid + 1
else
high = mid - 1
end
end
sum = sum + found
end
print(sum)
Python
import sys
n = int(sys.argv[1])
arr = [i * 2 for i in range(n)]
total = 0
for target in range(n):
low, high = 0, n - 1
found = -1
while low <= high:
mid = (low + high) // 2
if arr[mid] == target * 2:
found = mid
low = high + 1
elif arr[mid] < target * 2:
low = mid + 1
else:
high = mid - 1
total += found
print(total)
random LCG 50M Zust 63ms · Lua 437ms · Python 7.0s
Size50,000,000
Zust63ms
Lua437ms
Python7.0s
Lua / Zust6.9x
Python / Zust111.3x
Zust
pub fn bench(n: i64) {
let seed = 12345i64;
let total = 0i64;
for _ in 0..n {
seed = seed * 1103515245i64 + 12345i64;
seed = seed & 0x7fffffff;
total = total + (seed & 0xff);
}
total
}
Lua
local n = tonumber(arg[1])
local seed = 12345
local total = 0
for _ = 1, n do
seed = seed * 1103515245 + 12345
seed = seed & 0x7fffffff
total = total + (seed & 0xff)
end
print(total)
Python
import sys
n = int(sys.argv[1])
seed = 12345
total = 0
for _ in range(n):
seed = seed * 1103515245 + 12345
seed = seed & 0x7fffffff
total += seed & 0xff
print(total)
array reverse 1K x10K Zust 9ms · Lua 136ms · Python 1.1s
Size10,000
Zust9ms
Lua136ms
Python1.1s
Lua / Zust15.0x
Python / Zust122.4x
Zust
pub fn bench(n: i64) {
let arr: [i64; 1000] = [0i64; 1000];
for i in 0..1000 {
arr[i] = i;
}
let total = 0i64;
for _ in 0..n {
let half = 500i64;
for i in 0..half {
let j = 999i64 - i;
let tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
for i in 0..1000 {
total = total + arr[i];
}
}
total
}
Lua
local n = tonumber(arg[1])
local arr = {}
for i = 0, 999 do
arr[i + 1] = i
end
local total = 0
for _ = 1, n do
local half = 500
for i = 0, half - 1 do
local j = 999 - i + 1
local tmp = arr[i + 1]
arr[i + 1] = arr[j]
arr[j] = tmp
end
for i = 0, 999 do
total = total + arr[i + 1]
end
end
print(total)
Python
import sys
n = int(sys.argv[1])
arr = list(range(1000))
total = 0
half = 500
for _ in range(n):
for i in range(half):
j = 999 - i
arr[i], arr[j] = arr[j], arr[i]
for i in range(1000):
total += arr[i]
print(total)