| #![feature(test)] |
| |
| extern crate test; |
| |
| #[cfg(feature = "std")] |
| use backtrace::Backtrace; |
| |
| #[bench] |
| #[cfg(feature = "std")] |
| fn trace(b: &mut test::Bencher) { |
| #[inline(never)] |
| fn the_function() { |
| backtrace::trace(|frame| { |
| let ip = frame.ip(); |
| test::black_box(ip); |
| true |
| }); |
| } |
| b.iter(the_function); |
| } |
| |
| #[bench] |
| #[cfg(feature = "std")] |
| fn trace_and_resolve_callback(b: &mut test::Bencher) { |
| #[inline(never)] |
| fn the_function() { |
| backtrace::trace(|frame| { |
| backtrace::resolve(frame.ip(), |symbol| { |
| let addr = symbol.addr(); |
| test::black_box(addr); |
| }); |
| true |
| }); |
| } |
| b.iter(the_function); |
| } |
| |
| #[bench] |
| #[cfg(feature = "std")] |
| fn trace_and_resolve_separate(b: &mut test::Bencher) { |
| #[inline(never)] |
| fn the_function(frames: &mut Vec<*mut std::ffi::c_void>) { |
| backtrace::trace(|frame| { |
| frames.push(frame.ip()); |
| true |
| }); |
| frames.iter().for_each(|frame_ip| { |
| backtrace::resolve(*frame_ip, |symbol| { |
| test::black_box(symbol); |
| }); |
| }); |
| } |
| let mut frames = Vec::with_capacity(1024); |
| b.iter(|| { |
| the_function(&mut frames); |
| frames.clear(); |
| }); |
| } |
| |
| #[bench] |
| #[cfg(feature = "std")] |
| fn new_unresolved(b: &mut test::Bencher) { |
| #[inline(never)] |
| fn the_function() { |
| let bt = Backtrace::new_unresolved(); |
| test::black_box(bt); |
| } |
| b.iter(the_function); |
| } |
| |
| #[bench] |
| #[cfg(feature = "std")] |
| fn new(b: &mut test::Bencher) { |
| #[inline(never)] |
| fn the_function() { |
| let bt = Backtrace::new(); |
| test::black_box(bt); |
| } |
| b.iter(the_function); |
| } |
| |
| #[bench] |
| #[cfg(feature = "std")] |
| fn new_unresolved_and_resolve_separate(b: &mut test::Bencher) { |
| #[inline(never)] |
| fn the_function() { |
| let mut bt = Backtrace::new_unresolved(); |
| bt.resolve(); |
| test::black_box(bt); |
| } |
| b.iter(the_function); |
| } |