cli_log/time.rs
1/// print the time that executing some expression took
2/// but only when relevant according to log level.
3///
4/// The goal of this macro is to avoid doing useless
5/// `Instant::now`.
6///
7/// Arguments:
8/// - log level, optional (default is `Debug`)
9/// - a category, optional (only if name is set)
10/// - a name, optional (stringified expression is used by default)
11/// - the expression whose duration we want to log depending on the level
12///
13/// Examples:
14///
15/// ```
16/// # use log::*;
17/// # use cli_log::*;
18/// # fn do_stuff(arg: usize) -> Result<usize, String> {
19/// # Ok(arg)
20/// # }
21/// # fn main() -> Result<(), String> {
22/// let result = time!(do_stuff(4));
23/// let result = time!(Debug, do_stuff(3))?;
24/// let result = time!("World creation", do_stuff(7));
25/// let sum = time!(Debug, "summing", 2 + 2);
26/// let sum = time!(Debug, "summing", 2 + 2);
27/// let mult = time!("operations", "mult 4", 3 * 4);
28/// let mult = time!(Info, "operations", "mult 4", 3 * 4);
29/// # Ok(())
30/// # }
31/// ```
32#[macro_export]
33macro_rules! time {
34 ($timed: expr $(,)?) => {{
35 use cli_log::{
36 Level::*,
37 *,
38 };
39 if log_enabled!(Debug) {
40 let start = std::time::Instant::now();
41 match $timed {
42 value => {
43 log!(Debug, "{} took {:?}", stringify!($timed), start.elapsed());
44 value
45 }
46 }
47 } else {
48 $timed
49 }
50 }};
51 ($level: ident, $timed: expr $(,)?) => {{
52 use cli_log::{
53 Level::*,
54 *,
55 };
56 if log_enabled!($level) {
57 let start = std::time::Instant::now();
58 match $timed {
59 value => {
60 log!($level, "{} took {:?}", stringify!($timed), start.elapsed());
61 value
62 }
63 }
64 } else {
65 $timed
66 }
67 }};
68 ($name: expr, $timed: expr $(,)?) => {{
69 use cli_log::{
70 Level::*,
71 *,
72 };
73 if log_enabled!(Debug) {
74 let start = std::time::Instant::now();
75 match $timed {
76 value => {
77 log!(Debug, "{} took {:?}", $name, start.elapsed());
78 value
79 }
80 }
81 } else {
82 $timed
83 }
84 }};
85 ($level: ident, $name: expr, $timed: expr $(,)?) => {{
86 use cli_log::{
87 Level::*,
88 *,
89 };
90 if log_enabled!($level) {
91 let start = std::time::Instant::now();
92 match $timed {
93 value => {
94 log!($level, "{} took {:?}", $name, start.elapsed());
95 value
96 }
97 }
98 } else {
99 $timed
100 }
101 }};
102 ($cat: expr, $name :expr, $timed: expr $(,)?) => {{
103 use cli_log::{
104 Level::*,
105 *,
106 };
107 if log_enabled!(Debug) {
108 let start = std::time::Instant::now();
109 match $timed {
110 value => {
111 log!(Debug, "{} on {:?} took {:?}", $cat, $name, start.elapsed());
112 value
113 }
114 }
115 } else {
116 $timed
117 }
118 }};
119 ($level: ident, $cat: expr, $name :expr, $timed: expr $(,)?) => {{
120 use cli_log::{
121 Level::*,
122 *,
123 };
124 if log_enabled!($level) {
125 let start = std::time::Instant::now();
126 match $timed {
127 value => {
128 log!($level, "{} on {:?} took {:?}", $cat, $name, start.elapsed());
129 value
130 }
131 }
132 } else {
133 $timed
134 }
135 }};
136}