1 //! Benchmarking tests.
4 use self::test
::Bencher
;
6 use crate::db
::ChalkDatabase
;
7 use crate::query
::{ProgramSolverChoice, ProgramText}
;
8 use chalk_solve
::SolverChoice
;
12 use super::{assert_result, parse_and_lower_goal, parse_and_lower_program}
;
16 solver_choice
: SolverChoice
,
18 bencher
: &mut Bencher
,
21 ChalkDatabase
::with_program(Arc
::new(program_text
.to_string()), solver_choice
, |db
| {
22 let program
= db
.lowered_program().unwrap();
23 let env
= db
.environment().unwrap();
24 ir
::tls
::set_current_program(&program
, || {
25 let goal
= parse_and_lower_goal(&program
, goal_text
).unwrap();
26 let peeled_goal
= goal
.into_peeled_goal();
28 // Execute once to get an expected result.
29 let result
= solver_choice
.solve_root_goal(&env
, &peeled_goal
);
32 assert_result(&result
, expected
);
34 // Then do it many times to measure time.
35 bencher
.iter(|| solver_choice
.solve_root_goal(&env
, &peeled_goal
));
40 const CYCLEY
: &str = "
43 trait Copy where Self: Clone { }
48 impl Clone for i32 { }
49 impl Sized for i32 { }
53 impl Clone for u32 { }
54 impl Sized for u32 { }
57 impl<T> Clone for Rc<T> { }
58 impl<T> Sized for Rc<T> { }
61 impl<T> AsRef<T> for Box<T> where T: Sized { }
62 impl<T> Clone for Box<T> where T: Clone { }
63 impl<T> Sized for Box<T> { }
66 struct Slice<T> where T: Sized { }
67 impl<T> Sized for Slice<T> { }
68 impl<T> AsRef<Slice<T>> for Slice<T> where T: Sized { }
70 struct Vec<T> where T: Sized { }
71 impl<T> AsRef<Slice<T>> for Vec<T> where T: Sized { }
72 impl<T> AsRef<Vec<T>> for Vec<T> where T: Sized { }
73 impl<T> Clone for Vec<T> where T: Clone, T: Sized { }
74 impl<T> Sized for Vec<T> where T: Sized { }
77 where <Self as SliceExt>::Item: Clone
82 impl<T> SliceExt for Slice<T>
89 const CYCLEY_GOAL
: &str = "
92 <Slice<T> as SliceExt>::Item: Clone;
93 <Slice<T> as SliceExt>::Item: Sized;
103 fn cycley_slg(b
: &mut Bencher
) {
106 SolverChoice
::SLG { max_size: 20 }
,