use criterion::{black_box, criterion_group, criterion_main, Criterion};
use bytevm::prelude::*;
fn fibonacci(input: i64) -> i64 {
let mut program = ProgramBuilder::default();
program.add_function(FunctionBuilder::default()
.name("main")
.arity(0)
.body(BlockEncoder::default()
.declare_local("n")
.push_integer(input)
.set_local("n")
.get_local("n")
.call_function_by_name("fib")
.return_value()
)
.build()
);
program.add_function(FunctionBuilder::default()
.name("fib")
.arity(1)
.body(BlockEncoder::default()
.declare_local("n")
.get_local("n")
.push_integer(1)
.less_than_or_equal()
.jump_if_false("end")
.get_local("n")
.return_value()
.add_label("end")
.get_local("n")
.push_integer(1)
.sub()
.call_function_by_name("fib")
.get_local("n")
.push_integer(2)
.sub()
.call_function_by_name("fib")
.add()
.return_value())
.build()
);
let mut vm = Vm::default();
vm.load_program(program.build());
vm.run(None, None).unwrap().result.unwrap().into()
}
fn bench_fibonacci(c: &mut Criterion) {
let mut group = c.benchmark_group("fibonacci");
for i in [20, 21, 22].iter() {
group.bench_function(criterion::BenchmarkId::from_parameter(i), |b| {
b.iter(|| fibonacci(black_box(*i)));
});
}
group.finish();
}
criterion_group!(benches, bench_fibonacci);
criterion_main!(benches);