Skip to content

Commit 639d994

Browse files
authored
Merge pull request #1 from exyi/fast-funcia
2 parents 9a7442a + 6db7475 commit 639d994

20 files changed

+9348
-56
lines changed

Cargo.lock

Lines changed: 526 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,20 @@ num-integer = "0.1.45"
1717
members = [
1818
"ksplang-cli",
1919
"."
20-
]
20+
]
21+
22+
[lib]
23+
bench = false
24+
25+
[dev-dependencies]
26+
# Criterion is used only for benchmarks
27+
criterion = { version = "0.7", features = ["html_reports"] }
28+
rand = "0.9.2"
29+
30+
[[bench]]
31+
name = "funkcia_bench"
32+
harness = false
33+
34+
[[bench]]
35+
name = "program_bench"
36+
harness = false

benches/funkcia_bench.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
2+
use rand::{Rng, SeedableRng};
3+
use std::hint::black_box;
4+
5+
use ksplang::funkcia::funkcia;
6+
7+
fn criterion_benchmark(c: &mut Criterion) {
8+
let mut group = c.benchmark_group("funkcia");
9+
let pairs: &[(i64, i64)] = &[
10+
(2, 3),
11+
(3, 9),
12+
(10, 16),
13+
(24, 32),
14+
(1000, 1001),
15+
(1 << 61, (1 << 61) + 1),
16+
(3 << 62, 5 << 62),
17+
(7 << 61, i32::MAX as i64),
18+
(1_000_000_007, 1_000_000_009),
19+
(614_889_782_588_491_410, 307_444_891_294_245_705),
20+
(1_000_000_000_000_000_007, i64::MAX - 2),
21+
// (108, 225), // values taken from a real run of AOC24 3-2 solution
22+
// (114, 109),
23+
// (12426, 225),
24+
// (16300, 225),
25+
// (163, 100),
26+
// (3, 2),
27+
// (32, 109),
28+
// (33, 100),
29+
// (4, 3),
30+
// (49, 100),
31+
// (5, 3),
32+
// (5, 4),
33+
// (6225, 100),
34+
// (6640, 75),
35+
// (6641, 109),
36+
// (7, 113),
37+
// (7, 16),
38+
// (723870, 225),
39+
// (80, 75),
40+
// (80, 83),
41+
// (83, 75),
42+
// (996, 32),
43+
];
44+
for &(a, b) in pairs.iter() {
45+
group.bench_with_input(BenchmarkId::from_parameter(format!("{a}-{b}")), &(a, b), |bencher, &(a, b)| {
46+
bencher.iter(|| black_box(funkcia(black_box(a), black_box(b))));
47+
});
48+
}
49+
let rng = rand::rngs::StdRng::from_seed([1; 32]);
50+
// generate i64 numbers 0..=i64::MAX
51+
let inputs: Vec<i64> = rng.random_iter().take(2048).collect();
52+
group.bench_function("random", |bencher| {
53+
bencher.iter(||
54+
for i in 0..inputs.len() {
55+
black_box(funkcia(black_box(inputs[i]), black_box(inputs[inputs.len() - 1 - i])));
56+
}
57+
);
58+
});
59+
group.finish();
60+
}
61+
62+
criterion_group!(name = benches; config = Criterion::default(); targets = criterion_benchmark);
63+
criterion_main!(benches);

benches/program_bench.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
2+
use std::hint::black_box;
3+
4+
use ksplang::{ops::Op, parser::parse_program, vm::VMOptions};
5+
6+
fn parse_in_num(str: &str) -> Vec<i64> {
7+
let mut stack = vec![];
8+
for line in str.lines() {
9+
for word in line.split_whitespace() {
10+
stack.push(word.parse().unwrap());
11+
}
12+
}
13+
stack
14+
}
15+
16+
fn parse_in_txt(str: &str) -> Vec<i64> {
17+
let mut stack = vec![];
18+
for c in str.chars() {
19+
stack.push(c as i64);
20+
}
21+
stack
22+
}
23+
24+
fn run(ops: &[Op], input: &[i64]) {
25+
let options = VMOptions::new(input, 2097152, &[], 10_000_000_000, u64::MAX);
26+
black_box(ksplang::vm::run(&ops, options).unwrap());
27+
}
28+
29+
fn criterion_benchmark(c: &mut Criterion) {
30+
// programs are taken from: https://github.com/Sejsel/aoc2024-ksplang
31+
32+
// target at most 100ms
33+
let fast_tests: Vec<(String, Vec<Op>, Vec<i64>)> = vec![
34+
(format!("aoc24-1-1"), parse_program(include_str!("programs/aoc24-1-1.ksplang")).unwrap(), parse_in_num(include_str!("programs/aoc24-1-short.in"))),
35+
(format!("aoc24-1-2"), parse_program(include_str!("programs/aoc24-1-2.ksplang")).unwrap(), parse_in_num(include_str!("programs/aoc24-1-short.in"))),
36+
(format!("aoc24-2-1"), parse_program(include_str!("programs/aoc24-2-1.ksplang")).unwrap(), parse_in_txt(include_str!("programs/aoc24-2-short.in"))),
37+
(format!("aoc24-3-2"), parse_program(include_str!("programs/aoc24-3-2.ksplang")).unwrap(), parse_in_txt(include_str!("programs/aoc24-3-short.in"))),
38+
(format!("aoc24-7-1"), parse_program(include_str!("programs/aoc24-7-1.ksplang")).unwrap(), parse_in_txt(include_str!("programs/aoc24-7-short.in"))),
39+
];
40+
// target at most few seconds
41+
let slow_tests: Vec<(String, Vec<Op>, Vec<i64>)> = vec![
42+
(format!("aoc24-1-1"), parse_program(include_str!("programs/aoc24-1-1.ksplang")).unwrap(), parse_in_num(include_str!("programs/aoc24-1.in"))),
43+
(format!("aoc24-1-2"), parse_program(include_str!("programs/aoc24-1-2.ksplang")).unwrap(), parse_in_num(include_str!("programs/aoc24-1.in"))),
44+
(format!("aoc24-2-1"), parse_program(include_str!("programs/aoc24-2-1.ksplang")).unwrap(), parse_in_txt(include_str!("programs/aoc24-2.in"))),
45+
(format!("aoc24-3-2"), parse_program(include_str!("programs/aoc24-3-2.ksplang")).unwrap(), parse_in_txt(include_str!("programs/aoc24-3.in"))),
46+
(format!("aoc24-7-1"), parse_program(include_str!("programs/aoc24-7-1.ksplang")).unwrap(), parse_in_txt(include_str!("programs/aoc24-7.in"))),
47+
];
48+
49+
let mut group = c.benchmark_group("full_program");
50+
51+
for (name, prog, input) in fast_tests.iter() {
52+
group.bench_function(BenchmarkId::from_parameter(format!("{name}")), |bencher: &mut criterion::Bencher<'_>| {
53+
bencher.iter(|| run(black_box(&prog), black_box(&input)));
54+
});
55+
}
56+
group.finish();
57+
58+
let mut slow_group = c.benchmark_group("full_program_slow");
59+
slow_group.sample_size(10);
60+
slow_group.sampling_mode(criterion::SamplingMode::Flat);
61+
for (name, prog, input) in slow_tests.iter() {
62+
slow_group.bench_function(BenchmarkId::from_parameter(format!("{name}")), |bencher: &mut criterion::Bencher<'_>| {
63+
bencher.iter(|| run(black_box(&prog), black_box(&input)));
64+
});
65+
}
66+
slow_group.finish();
67+
}
68+
69+
criterion_group!(name = benches; config = Criterion::default(); targets = criterion_benchmark);
70+
criterion_main!(benches);

0 commit comments

Comments
 (0)