diff options
-rw-r--r-- | crates/ra_prof/src/lib.rs | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/crates/ra_prof/src/lib.rs b/crates/ra_prof/src/lib.rs index abddff960..1cc8e361d 100644 --- a/crates/ra_prof/src/lib.rs +++ b/crates/ra_prof/src/lib.rs | |||
@@ -9,6 +9,20 @@ use std::iter::FromIterator; | |||
9 | use std::sync::RwLock; | 9 | use std::sync::RwLock; |
10 | use lazy_static::lazy_static; | 10 | use lazy_static::lazy_static; |
11 | 11 | ||
12 | /// Set profiling filter. It specifies descriptions allowed to profile. | ||
13 | /// This is helpful when call stack has too many nested profiling scopes. | ||
14 | /// Additionally filter can specify maximum depth of profiling scopes nesting. | ||
15 | /// | ||
16 | /// #Example | ||
17 | /// ``` | ||
18 | /// use ra_prof::set_filter; | ||
19 | /// use ra_prof::Filter; | ||
20 | /// let max_depth = 2; | ||
21 | /// let allowed = vec!["profile1".to_string(), "profile2".to_string()]; | ||
22 | /// let f = Filter::new( max_depth, allowed ); | ||
23 | /// set_filter(f); | ||
24 | /// ``` | ||
25 | /// | ||
12 | pub fn set_filter(f: Filter) { | 26 | pub fn set_filter(f: Filter) { |
13 | let set = HashSet::from_iter(f.allowed.iter().cloned()); | 27 | let set = HashSet::from_iter(f.allowed.iter().cloned()); |
14 | let mut old = FILTER.write().unwrap(); | 28 | let mut old = FILTER.write().unwrap(); |
@@ -16,6 +30,37 @@ pub fn set_filter(f: Filter) { | |||
16 | *old = filter_data; | 30 | *old = filter_data; |
17 | } | 31 | } |
18 | 32 | ||
33 | /// This function starts a profiling scope in the current execution stack with a given description. | ||
34 | /// It returns a Profile structure and measure elapsed time between this method invocation and Profile structure drop. | ||
35 | /// It supports nested profiling scopes in case when this function invoked multiple times at the execution stack. In this case the profiling information will be nested at the output. | ||
36 | /// Profiling information is being printed in the stderr. | ||
37 | /// | ||
38 | /// #Example | ||
39 | /// ``` | ||
40 | /// use ra_prof::profile; | ||
41 | /// use ra_prof::set_filter; | ||
42 | /// use ra_prof::Filter; | ||
43 | /// | ||
44 | /// let allowed = vec!["profile1".to_string(), "profile2".to_string()]; | ||
45 | /// let f = Filter::new(2, allowed); | ||
46 | /// set_filter(f); | ||
47 | /// profiling_function1(); | ||
48 | /// | ||
49 | /// fn profiling_function1() { | ||
50 | /// let _p = profile("profile1"); | ||
51 | /// profiling_function2(); | ||
52 | /// } | ||
53 | /// | ||
54 | /// fn profiling_function2() { | ||
55 | /// let _p = profile("profile2"); | ||
56 | /// } | ||
57 | /// ``` | ||
58 | /// This will print in the stderr the following: | ||
59 | /// ```text | ||
60 | /// 0ms - profile | ||
61 | /// 0ms - profile2 | ||
62 | /// ``` | ||
63 | /// | ||
19 | pub fn profile(desc: &str) -> Profiler { | 64 | pub fn profile(desc: &str) -> Profiler { |
20 | PROFILE_STACK.with(|stack| { | 65 | PROFILE_STACK.with(|stack| { |
21 | let mut stack = stack.borrow_mut(); | 66 | let mut stack = stack.borrow_mut(); |
@@ -137,7 +182,7 @@ mod tests { | |||
137 | #[test] | 182 | #[test] |
138 | fn test_basic_profile() { | 183 | fn test_basic_profile() { |
139 | let s = vec!["profile1".to_string(), "profile2".to_string()]; | 184 | let s = vec!["profile1".to_string(), "profile2".to_string()]; |
140 | let f = Filter { depth: 2, allowed: s }; | 185 | let f = Filter::new(2, s); |
141 | set_filter(f); | 186 | set_filter(f); |
142 | profiling_function1(); | 187 | profiling_function1(); |
143 | } | 188 | } |