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