extern crate evalexpr_jit;
use std::time::Instant;
use evalexpr::{build_operator_tree, ContextWithMutableVariables, HashMapContext, Node};
use evalexpr_jit::Equation;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let expression = "2*x + y^2 + z^2".to_string();
let eq = Equation::new(expression.clone())?;
let time_jit = time_it(
"evalexpr-jit",
|| {
eq.eval(&[1.0, 2.0, 3.0]).unwrap();
},
10_000_000,
);
let tree: Node = build_operator_tree(&expression)?;
let mut context = HashMapContext::new();
context.set_value("x".to_string(), evalexpr::Value::Float(1.0))?;
context.set_value("y".to_string(), evalexpr::Value::Float(2.0))?;
context.set_value("z".to_string(), evalexpr::Value::Float(3.0))?;
let time_evalexpr = time_it(
"evalexpr",
|| {
tree.eval_float_with_context(&context).unwrap();
},
10_000_000,
);
println!(
"evalexpr-jit is {}% faster than evalexpr",
((time_evalexpr / time_jit) * 100.0).round() as i64
);
Ok(())
}
fn time_it<F: Fn()>(name: &str, f: F, n: usize) -> f64 {
let start = Instant::now();
for _ in 0..n {
f();
}
let end = Instant::now();
println!(
"{}: Takes {:?} for {} runs",
name,
end.duration_since(start),
n
);
end.duration_since(start).as_secs_f64()
}