1
- use std:: collections:: HashMap ;
1
+ use std:: collections:: { HashMap , HashSet } ;
2
2
use std:: io:: Read ;
3
3
use std:: sync:: Arc ;
4
4
use std:: time:: { Duration , Instant } ;
@@ -190,6 +190,42 @@ fn get_self_profile_data(
190
190
Ok ( profile)
191
191
}
192
192
193
+ // Add query data entries to `profile` for any queries in `base_profile` which are not present in
194
+ // `profile` (i.e. queries not invoked during the compilation that generated `profile`). This is
195
+ // bit of a hack to enable showing rows for these queries in the table on the self-profile page.
196
+ fn add_uninvoked_base_profile_queries (
197
+ profile : & mut self_profile:: SelfProfile ,
198
+ base_profile : & Option < self_profile:: SelfProfile > ,
199
+ ) {
200
+ let base_profile = match base_profile. as_ref ( ) {
201
+ Some ( bp) => bp,
202
+ None => return ,
203
+ } ;
204
+
205
+ let profile_queries: HashSet < _ > = profile
206
+ . query_data
207
+ . iter ( )
208
+ . map ( |qd| qd. label . as_str ( ) )
209
+ . collect ( ) ;
210
+
211
+ for qd in & base_profile. query_data {
212
+ if !profile_queries. contains ( qd. label . as_str ( ) ) {
213
+ let uninvoked_query_data = self_profile:: QueryData {
214
+ label : qd. label ,
215
+ self_time : 0 ,
216
+ percent_total_time : 0.0 ,
217
+ number_of_cache_misses : 0 ,
218
+ number_of_cache_hits : 0 ,
219
+ invocation_count : 0 ,
220
+ blocked_time : 0 ,
221
+ incremental_load_time : 0 ,
222
+ } ;
223
+
224
+ profile. query_data . push ( uninvoked_query_data) ;
225
+ }
226
+ }
227
+ }
228
+
193
229
fn get_self_profile_delta (
194
230
profile : & self_profile:: SelfProfile ,
195
231
base_profile : & Option < self_profile:: SelfProfile > ,
@@ -223,10 +259,16 @@ fn get_self_profile_delta(
223
259
- base_qd. incremental_load_time as i64 ,
224
260
} ;
225
261
226
- query_data. push ( Some ( delta) ) ;
262
+ query_data. push ( delta) ;
227
263
}
228
264
None => {
229
- query_data. push ( None ) ;
265
+ let delta = self_profile:: QueryDataDelta {
266
+ self_time : qd. self_time as i64 ,
267
+ invocation_count : qd. invocation_count as i32 ,
268
+ incremental_load_time : qd. incremental_load_time as i64 ,
269
+ } ;
270
+
271
+ query_data. push ( delta) ;
230
272
}
231
273
}
232
274
}
@@ -239,60 +281,58 @@ fn sort_self_profile(
239
281
base_profile_delta : & mut Option < self_profile:: SelfProfileDelta > ,
240
282
sort_idx : i32 ,
241
283
) {
242
- let queries = std:: mem:: take ( & mut profile. query_data ) ;
243
-
244
- let deltas = match base_profile_delta. as_mut ( ) {
245
- Some ( bpd) => std:: mem:: take ( & mut bpd. query_data ) ,
246
- None => vec ! [ None ; queries. len( ) ] ,
247
- } ;
248
-
249
- let mut query_data: Vec < _ > = queries. into_iter ( ) . zip ( deltas) . collect ( ) ;
250
-
251
- loop {
252
- match sort_idx. abs ( ) {
253
- 1 => query_data. sort_by_key ( |qd| qd. 0 . label . clone ( ) ) ,
254
- 2 => query_data. sort_by_key ( |qd| qd. 0 . self_time ) ,
255
- 3 => query_data. sort_by_key ( |qd| qd. 0 . number_of_cache_misses ) ,
256
- 4 => query_data. sort_by_key ( |qd| qd. 0 . number_of_cache_hits ) ,
257
- 5 => query_data. sort_by_key ( |qd| qd. 0 . invocation_count ) ,
258
- 6 => query_data. sort_by_key ( |qd| qd. 0 . blocked_time ) ,
259
- 7 => query_data. sort_by_key ( |qd| qd. 0 . incremental_load_time ) ,
260
- 9 => query_data. sort_by_key ( |qd| {
261
- // convert to displayed percentage
262
- ( ( qd. 0 . number_of_cache_hits as f64 / qd. 0 . invocation_count as f64 ) * 10_000.0 )
263
- as u64
264
- } ) ,
265
- 10 => query_data. sort_by ( |a, b| {
266
- a. 0 . percent_total_time
267
- . partial_cmp ( & b. 0 . percent_total_time )
268
- . unwrap ( )
269
- } ) ,
270
- 11 if base_profile_delta. is_some ( ) => {
271
- query_data. sort_by_key ( |qd| qd. 1 . as_ref ( ) . map ( |delta| delta. self_time ) ) ;
284
+ let qd = & mut profile. query_data ;
285
+ let qd_deltas = base_profile_delta. as_mut ( ) . map ( |bpd| & mut bpd. query_data ) ;
286
+ let mut indices: Vec < _ > = ( 0 ..qd. len ( ) ) . collect ( ) ;
287
+
288
+ match sort_idx. abs ( ) {
289
+ 1 => indices. sort_by_key ( |& i| qd[ i] . label . clone ( ) ) ,
290
+ 2 => indices. sort_by_key ( |& i| qd[ i] . self_time ) ,
291
+ 3 => indices. sort_by_key ( |& i| qd[ i] . number_of_cache_misses ) ,
292
+ 4 => indices. sort_by_key ( |& i| qd[ i] . number_of_cache_hits ) ,
293
+ 5 => indices. sort_by_key ( |& i| qd[ i] . invocation_count ) ,
294
+ 6 => indices. sort_by_key ( |& i| qd[ i] . blocked_time ) ,
295
+ 7 => indices. sort_by_key ( |& i| qd[ i] . incremental_load_time ) ,
296
+ 9 => indices. sort_by_key ( |& i| {
297
+ // convert to displayed percentage
298
+ ( ( qd[ i] . number_of_cache_hits as f64 / qd[ i] . invocation_count as f64 ) * 10_000.0 ) as u64
299
+ } ) ,
300
+ 10 => indices. sort_by ( |& a, & b| {
301
+ qd[ a]
302
+ . percent_total_time
303
+ . partial_cmp ( & qd[ b] . percent_total_time )
304
+ . unwrap ( )
305
+ } ) ,
306
+ 11 => {
307
+ if let Some ( ref deltas) = qd_deltas {
308
+ indices. sort_by_key ( |& i| deltas[ i] . self_time ) ;
272
309
}
273
- 12 if base_profile_delta. is_some ( ) => {
274
- query_data. sort_by_key ( |qd| qd. 1 . as_ref ( ) . map ( |delta| delta. invocation_count ) ) ;
275
- }
276
- 13 if base_profile_delta. is_some ( ) => {
277
- query_data. sort_by_key ( |qd| qd. 1 . as_ref ( ) . map ( |delta| delta. incremental_load_time ) ) ;
310
+ }
311
+ 12 => {
312
+ if let Some ( ref deltas) = qd_deltas {
313
+ indices. sort_by_key ( |& i| deltas[ i] . invocation_count ) ;
278
314
}
279
- _ => break ,
280
315
}
281
-
282
- // Only apply this if at least one of the conditions above was met
283
- if sort_idx < 0 {
284
- query_data . reverse ( ) ;
316
+ 13 => {
317
+ if let Some ( ref deltas ) = qd_deltas {
318
+ indices . sort_by_key ( | & i| deltas [ i ] . incremental_load_time ) ;
319
+ }
285
320
}
286
-
287
- break ;
321
+ _ => return ,
288
322
}
289
323
290
- let ( queries, deltas) = query_data. into_iter ( ) . unzip ( ) ;
291
-
292
- profile. query_data = queries;
324
+ profile. query_data = if sort_idx < 0 {
325
+ indices. iter ( ) . map ( |& i| qd[ i] . clone ( ) ) . rev ( ) . collect ( )
326
+ } else {
327
+ indices. iter ( ) . map ( |& i| qd[ i] . clone ( ) ) . collect ( )
328
+ } ;
293
329
294
- if let Some ( bpd) = base_profile_delta {
295
- bpd. query_data = deltas;
330
+ if let Some ( deltas) = qd_deltas {
331
+ base_profile_delta. as_mut ( ) . unwrap ( ) . query_data = if sort_idx < 0 {
332
+ indices. iter ( ) . map ( |& i| deltas[ i] . clone ( ) ) . rev ( ) . collect ( )
333
+ } else {
334
+ indices. iter ( ) . map ( |& i| deltas[ i] . clone ( ) ) . collect ( )
335
+ } ;
296
336
}
297
337
}
298
338
@@ -681,6 +721,7 @@ pub async fn handle_self_profile(
681
721
None
682
722
} ;
683
723
724
+ add_uninvoked_base_profile_queries ( & mut profile, & base_profile) ;
684
725
let mut base_profile_delta = get_self_profile_delta ( & profile, & base_profile) ;
685
726
sort_self_profile ( & mut profile, & mut base_profile_delta, sort_idx) ;
686
727
0 commit comments