#![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); | |
} |