#[macro_export]
macro_rules! measure_time {
($val:expr, $name:tt $(,)?) => {{
let mut measure = $crate::measure::Measure::start($name);
let result = $val;
measure.stop();
(result, measure)
}};
($val:expr) => {
measure_time!($val, "")
};
}
#[macro_export]
macro_rules! measure_us {
($expr:expr) => {{
let (result, duration) = $crate::meas_dur!($expr);
(result, duration.as_micros() as u64)
}};
}
#[macro_export]
macro_rules! meas_dur {
($expr:expr) => {{
let start = std::time::Instant::now();
let result = $expr;
(result, start.elapsed())
}};
}
#[cfg(test)]
mod tests {
use std::{thread::sleep, time::Duration};
fn my_multiply(x: i32, y: i32) -> i32 {
x * y
}
fn square(x: i32) -> i32 {
my_multiply(x, x)
}
struct SomeStruct {
x: i32,
}
impl SomeStruct {
fn add_to(&self, x: i32) -> i32 {
x + self.x
}
}
#[test]
fn test_measure_macro() {
{
let (_result, measure) = measure_time!(sleep(Duration::from_millis(1)), "test");
assert!(measure.as_s() > 0.0);
assert!(measure.as_ms() > 0);
assert!(measure.as_us() > 0);
}
{
let (result, _measure) = measure_time!(my_multiply(3, 4), "test");
assert_eq!(result, 3 * 4);
let (result, _measure) = measure_time!(square(5), "test");
assert_eq!(result, 5 * 5)
}
{
let some_struct = SomeStruct { x: 42 };
let (result, _measure) = measure_time!(some_struct.add_to(4), "test");
assert_eq!(result, 42 + 4);
}
{
let (result, _measure) = measure_time!({ 1 + 2 }, "test");
assert_eq!(result, 3);
}
{
let (result, _measure) = measure_time!(square(5), "test",);
assert_eq!(result, 5 * 5)
}
{
let (result, _measure) = measure_time!(square(5));
assert_eq!(result, 5 * 5)
}
}
#[test]
fn test_measure_us_macro() {
{
let (_result, measure) = measure_us!(sleep(Duration::from_millis(1)));
assert!(measure > 0);
}
{
let (result, _measure) = measure_us!(my_multiply(3, 4));
assert_eq!(result, 3 * 4);
let (result, _measure) = measure_us!(square(5));
assert_eq!(result, 5 * 5)
}
{
let some_struct = SomeStruct { x: 42 };
let (result, _measure) = measure_us!(some_struct.add_to(4));
assert_eq!(result, 42 + 4);
}
{
let (result, _measure) = measure_us!({ 1 + 2 });
assert_eq!(result, 3);
}
}
#[test]
fn test_meas_dur_macro() {
{
let (result, _duration) = meas_dur!(my_multiply(3, 4));
assert_eq!(result, 3 * 4);
let (result, _duration) = meas_dur!(square(5));
assert_eq!(result, 5 * 5)
}
{
let some_struct = SomeStruct { x: 42 };
let (result, _duration) = meas_dur!(some_struct.add_to(4));
assert_eq!(result, 42 + 4);
}
{
let (result, _duration) = meas_dur!({ 1 + 2 });
assert_eq!(result, 3);
}
}
}