1
+ use std:: borrow:: Cow ;
1
2
use std:: collections:: HashMap ;
2
3
use std:: time:: Duration ;
3
4
use measureme:: { ProfilingData , TimestampKind , Event } ;
@@ -32,6 +33,16 @@ pub fn perform_analysis(data: ProfilingData) -> Results {
32
33
let mut threads = HashMap :: < _ , Vec < Event > > :: new ( ) ;
33
34
let mut total_time = Duration :: from_nanos ( 0 ) ;
34
35
36
+ let mut record_event_data = |label : & Cow < ' _ , str > , f : & Fn ( & mut QueryData ) | {
37
+ if let Some ( data) = query_data. get_mut ( & label[ ..] ) {
38
+ f ( data) ;
39
+ } else {
40
+ let mut data = QueryData :: new ( label. clone ( ) . into_owned ( ) ) ;
41
+ f ( & mut data) ;
42
+ query_data. insert ( label. clone ( ) . into_owned ( ) , data) ;
43
+ }
44
+ } ;
45
+
35
46
for event in data. iter ( ) {
36
47
match event. timestamp_kind {
37
48
TimestampKind :: Start => {
@@ -44,13 +55,9 @@ pub fn perform_analysis(data: ProfilingData) -> Results {
44
55
event. timestamp . duration_since ( prev_event. timestamp )
45
56
. unwrap_or ( Duration :: from_nanos ( 0 ) ) ;
46
57
47
- if let Some ( data ) = query_data . get_mut ( & prev_event. label [ .. ] ) {
58
+ record_event_data ( & prev_event. label , & |data| {
48
59
data. self_time += duration;
49
- } else {
50
- let mut data = QueryData :: new ( prev_event. label . clone ( ) . into_owned ( ) ) ;
51
- data. self_time = duration;
52
- query_data. insert ( prev_event. label . clone ( ) . into_owned ( ) , data) ;
53
- }
60
+ } ) ;
54
61
55
62
//record the total time
56
63
total_time += duration;
@@ -64,13 +71,9 @@ pub fn perform_analysis(data: ProfilingData) -> Results {
64
71
} ,
65
72
TimestampKind :: Instant => {
66
73
if & event. event_kind [ ..] == "QueryCacheHit" {
67
- if let Some ( data ) = query_data . get_mut ( & event. label [ .. ] ) {
74
+ record_event_data ( & event. label , & |data| {
68
75
data. number_of_cache_hits += 1 ;
69
- } else {
70
- let mut data = QueryData :: new ( event. label . clone ( ) . into_owned ( ) ) ;
71
- data. number_of_cache_hits = 1 ;
72
- query_data. insert ( event. label . clone ( ) . into_owned ( ) , data) ;
73
- }
76
+ } ) ;
74
77
}
75
78
} ,
76
79
TimestampKind :: End => {
@@ -88,15 +91,10 @@ pub fn perform_analysis(data: ProfilingData) -> Results {
88
91
. unwrap_or ( Duration :: from_nanos ( 0 ) ) ;
89
92
90
93
if & event. event_kind [ ..] == "Query" || & event. event_kind [ ..] == "GenericActivity" {
91
- if let Some ( data ) = query_data . get_mut ( & start_event . label [ .. ] ) {
94
+ record_event_data ( & event . label , & |data| {
92
95
data. self_time += duration;
93
96
data. number_of_cache_misses += 1 ;
94
- } else {
95
- let mut data = QueryData :: new ( start_event. label . clone ( ) . into_owned ( ) ) ;
96
- data. self_time = duration;
97
- data. number_of_cache_misses = 1 ;
98
- query_data. insert ( start_event. label . clone ( ) . into_owned ( ) , data) ;
99
- }
97
+ } ) ;
100
98
101
99
//now adjust the previous event's start time so that it "started" right now
102
100
if let Some ( previous_event) = thread_stack. last_mut ( ) {
@@ -107,13 +105,9 @@ pub fn perform_analysis(data: ProfilingData) -> Results {
107
105
//record the total time
108
106
total_time += duration;
109
107
} else if & event. event_kind [ ..] == "QueryBlocked" {
110
- if let Some ( data ) = query_data . get_mut ( & start_event . label [ .. ] ) {
108
+ record_event_data ( & event . label , & |data| {
111
109
data. blocked_time += duration;
112
- } else {
113
- let mut data = QueryData :: new ( start_event. label . clone ( ) . into_owned ( ) ) ;
114
- data. blocked_time = duration;
115
- query_data. insert ( start_event. label . clone ( ) . into_owned ( ) , data) ;
116
- }
110
+ } ) ;
117
111
}
118
112
}
119
113
}
0 commit comments