175 lines
4.7 KiB
Rust
175 lines
4.7 KiB
Rust
mod utils;
|
|
|
|
use std::hint::black_box;
|
|
|
|
use criterion::{Criterion, criterion_group, criterion_main};
|
|
use utils::eval;
|
|
|
|
fn bench_non_recursive(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("non_recursive");
|
|
|
|
group.bench_function("simple_bindings", |b| {
|
|
b.iter(|| eval(black_box("let x = 1; y = 2; z = x + y; in z")))
|
|
});
|
|
|
|
group.bench_function("many_bindings", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; g = 7; h = 8; i = 9; j = 10; in a + b + c + d + e + f + g + h + i + j",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.bench_function("dependent_chain", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let a = 1; b = a + 1; c = b + 1; d = c + 1; e = d + 1; in e",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.bench_function("rec_attrset_non_recursive", |b| {
|
|
b.iter(|| eval(black_box("rec { a = 1; b = 2; c = 3; d = a + b + c; }.d")))
|
|
});
|
|
|
|
group.finish();
|
|
}
|
|
|
|
fn bench_recursive(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("recursive");
|
|
|
|
group.bench_function("simple_recursion", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let f = n: if n == 0 then 0 else f (n - 1); in f 10",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.bench_function("fibonacci", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let fib = n: if n <= 1 then 1 else fib (n - 1) + fib (n - 2); in fib 10",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.bench_function("factorial", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let factorial = n: if n == 0 then 1 else n * factorial (n - 1); in factorial 10",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.bench_function("rec_attrset_recursive", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"rec { f = n: if n == 0 then 1 else f (n - 1); }.f 10",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.finish();
|
|
}
|
|
|
|
fn bench_mutual_recursion(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("mutual_recursion");
|
|
|
|
group.bench_function("two_way", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let f = n: if n == 0 then 0 else g (n - 1); g = n: if n == 0 then 1 else f (n - 1); in f 10",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.bench_function("even_odd", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let even = n: if n == 0 then true else odd (n - 1); odd = n: if n == 0 then false else even (n - 1); in even 20",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.bench_function("three_way", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let a = n: if n == 0 then 1 else b (n - 1); b = n: if n == 0 then 2 else c (n - 1); c = n: if n == 0 then 3 else a (n - 1); in a 15",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.finish();
|
|
}
|
|
|
|
fn bench_mixed(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("mixed");
|
|
|
|
group.bench_function("recursive_with_constants", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let x = 10; fib = n: if n <= 1 then 1 else fib (n - 1) + fib (n - 2); in fib x",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.bench_function("multiple_recursive_functions", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let fib = n: if n <= 1 then 1 else fib (n - 1) + fib (n - 2); fact = n: if n == 0 then 1 else n * fact (n - 1); in (fib 8) + (fact 5)",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.bench_function("complex_dependency_graph", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let a = 1; b = 2; c = a + b; fib = n: if n <= 1 then 1 else fib (n - 1) + fib (n - 2); result = c + fib 8; in result",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.finish();
|
|
}
|
|
|
|
fn bench_nested_scopes(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("nested_scopes");
|
|
|
|
group.bench_function("nested_let_non_recursive", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let x = 1; in let y = x + 1; in let z = y + 1; in z",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.bench_function("nested_let_with_recursive", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let f = n: if n == 0 then 0 else f (n - 1); in let g = m: f m; in g 10",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.bench_function("deeply_nested", |b| {
|
|
b.iter(|| {
|
|
eval(black_box(
|
|
"let a = 1; in let b = a + 1; in let c = b + 1; in let d = c + 1; in let e = d + 1; in e",
|
|
))
|
|
})
|
|
});
|
|
|
|
group.finish();
|
|
}
|
|
|
|
criterion_group!(
|
|
benches,
|
|
bench_non_recursive,
|
|
bench_recursive,
|
|
bench_mutual_recursion,
|
|
bench_mixed,
|
|
bench_nested_scopes
|
|
);
|
|
criterion_main!(benches);
|