Skip to content

Commit d940e77

Browse files
authored
Adds meas_dur!() macro (solana-labs#3043)
1 parent 4ac0d57 commit d940e77

File tree

1 file changed

+55
-5
lines changed

1 file changed

+55
-5
lines changed

measure/src/macros.rs

+55-5
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,29 @@
66
///
77
/// Use `measure_us!()` when you want to measure an expression in microseconds.
88
///
9+
/// Use `meas_dur!()` when you want to measure an expression and get the Duration.
10+
///
911
/// [`Measure`]: crate::measure::Measure
1012
///
1113
/// # Examples
1214
///
1315
/// ```
1416
/// // Measure functions
15-
/// # use solana_measure::{measure_time, measure_us};
17+
/// # use solana_measure::{measure_time, measure_us, meas_dur};
1618
/// # fn foo() {}
1719
/// # fn bar(x: i32) {}
1820
/// # fn add(x: i32, y: i32) -> i32 {x + y}
1921
/// let (result, measure) = measure_time!(foo(), "foo takes no parameters");
2022
/// let (result, measure) = measure_time!(bar(42), "bar takes one parameter");
2123
/// let (result, measure) = measure_time!(add(1, 2), "add takes two parameters and returns a value");
2224
/// let (result, measure_us) = measure_us!(add(1, 2));
25+
/// let (result, duration) = meas_dur!(add(1, 2));
2326
/// # assert_eq!(result, 1 + 2);
2427
/// ```
2528
///
2629
/// ```
2730
/// // Measure methods
28-
/// # use solana_measure::{measure_time, measure_us};
31+
/// # use solana_measure::{measure_time, measure_us, meas_dur};
2932
/// # struct Foo {
3033
/// # f: i32,
3134
/// # }
@@ -37,6 +40,7 @@
3740
/// let foo = Foo { f: 42 };
3841
/// let (result, measure) = measure_time!(foo.frobnicate(2), "measure methods");
3942
/// let (result, measure_us) = measure_us!(foo.frobnicate(2));
43+
/// let (result, duration) = meas_dur!(foo.frobnicate(2));
4044
/// # assert_eq!(result, 42 * 2);
4145
/// ```
4246
///
@@ -82,10 +86,31 @@ macro_rules! measure_time {
8286

8387
#[macro_export]
8488
macro_rules! measure_us {
85-
($val:expr) => {{
89+
($expr:expr) => {{
90+
let (result, duration) = $crate::meas_dur!($expr);
91+
(result, duration.as_micros() as u64)
92+
}};
93+
}
94+
95+
/// Measures how long it takes to execute an expression, and returns a Duration
96+
///
97+
/// # Examples
98+
///
99+
/// ```
100+
/// # use solana_measure::meas_dur;
101+
/// # fn meow(x: i32, y: i32) -> i32 {x + y}
102+
/// let (result, duration) = meas_dur!(meow(1, 2) + 3);
103+
/// # assert_eq!(result, 1 + 2 + 3);
104+
/// ```
105+
//
106+
// The macro name, `meas_dur`, is "measure" + "duration".
107+
// When said aloud, the pronunciation is close to "measure".
108+
#[macro_export]
109+
macro_rules! meas_dur {
110+
($expr:expr) => {{
86111
let start = std::time::Instant::now();
87-
let result = $val;
88-
(result, start.elapsed().as_micros() as u64)
112+
let result = $expr;
113+
(result, start.elapsed())
89114
}};
90115
}
91116

@@ -185,4 +210,29 @@ mod tests {
185210
assert_eq!(result, 3);
186211
}
187212
}
213+
214+
#[test]
215+
fn test_meas_dur_macro() {
216+
// Ensure that the macro can be called with functions
217+
{
218+
let (result, _duration) = meas_dur!(my_multiply(3, 4));
219+
assert_eq!(result, 3 * 4);
220+
221+
let (result, _duration) = meas_dur!(square(5));
222+
assert_eq!(result, 5 * 5)
223+
}
224+
225+
// Ensure that the macro can be called with methods
226+
{
227+
let some_struct = SomeStruct { x: 42 };
228+
let (result, _duration) = meas_dur!(some_struct.add_to(4));
229+
assert_eq!(result, 42 + 4);
230+
}
231+
232+
// Ensure that the macro can be called with blocks
233+
{
234+
let (result, _duration) = meas_dur!({ 1 + 2 });
235+
assert_eq!(result, 3);
236+
}
237+
}
188238
}

0 commit comments

Comments
 (0)