ZZust

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.

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

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]))
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)