|
6 | 6 | ///
|
7 | 7 | /// Use `measure_us!()` when you want to measure an expression in microseconds.
|
8 | 8 | ///
|
| 9 | +/// Use `meas_dur!()` when you want to measure an expression and get the Duration. |
| 10 | +/// |
9 | 11 | /// [`Measure`]: crate::measure::Measure
|
10 | 12 | ///
|
11 | 13 | /// # Examples
|
12 | 14 | ///
|
13 | 15 | /// ```
|
14 | 16 | /// // Measure functions
|
15 |
| -/// # use solana_measure::{measure_time, measure_us}; |
| 17 | +/// # use solana_measure::{measure_time, measure_us, meas_dur}; |
16 | 18 | /// # fn foo() {}
|
17 | 19 | /// # fn bar(x: i32) {}
|
18 | 20 | /// # fn add(x: i32, y: i32) -> i32 {x + y}
|
19 | 21 | /// let (result, measure) = measure_time!(foo(), "foo takes no parameters");
|
20 | 22 | /// let (result, measure) = measure_time!(bar(42), "bar takes one parameter");
|
21 | 23 | /// let (result, measure) = measure_time!(add(1, 2), "add takes two parameters and returns a value");
|
22 | 24 | /// let (result, measure_us) = measure_us!(add(1, 2));
|
| 25 | +/// let (result, duration) = meas_dur!(add(1, 2)); |
23 | 26 | /// # assert_eq!(result, 1 + 2);
|
24 | 27 | /// ```
|
25 | 28 | ///
|
26 | 29 | /// ```
|
27 | 30 | /// // Measure methods
|
28 |
| -/// # use solana_measure::{measure_time, measure_us}; |
| 31 | +/// # use solana_measure::{measure_time, measure_us, meas_dur}; |
29 | 32 | /// # struct Foo {
|
30 | 33 | /// # f: i32,
|
31 | 34 | /// # }
|
|
37 | 40 | /// let foo = Foo { f: 42 };
|
38 | 41 | /// let (result, measure) = measure_time!(foo.frobnicate(2), "measure methods");
|
39 | 42 | /// let (result, measure_us) = measure_us!(foo.frobnicate(2));
|
| 43 | +/// let (result, duration) = meas_dur!(foo.frobnicate(2)); |
40 | 44 | /// # assert_eq!(result, 42 * 2);
|
41 | 45 | /// ```
|
42 | 46 | ///
|
@@ -82,10 +86,31 @@ macro_rules! measure_time {
|
82 | 86 |
|
83 | 87 | #[macro_export]
|
84 | 88 | 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) => {{ |
86 | 111 | 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()) |
89 | 114 | }};
|
90 | 115 | }
|
91 | 116 |
|
@@ -185,4 +210,29 @@ mod tests {
|
185 | 210 | assert_eq!(result, 3);
|
186 | 211 | }
|
187 | 212 | }
|
| 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 | + } |
188 | 238 | }
|
0 commit comments