From 584081af4a386e9ef2e03684f1f3f1466b3996d1 Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Tue, 5 Feb 2019 18:35:41 +0100 Subject: [PATCH] Calculate self-times not total times --- src/librustc/util/profiling.rs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/librustc/util/profiling.rs b/src/librustc/util/profiling.rs index 92a952f85bb..f8fa01b6395 100644 --- a/src/librustc/util/profiling.rs +++ b/src/librustc/util/profiling.rs @@ -243,19 +243,20 @@ fn calculate_thread_results(events: &Vec) -> CalculatedResults { let mut results = CalculatedResults::new(); + //(event, child time to subtract) let mut query_stack = Vec::new(); for event in events { match event { QueryStart { .. } | GenericActivityStart { .. } => { - query_stack.push(event); + query_stack.push((event, 0)); }, QueryEnd { query_name, category, time: end_time } => { let previous_query = query_stack.pop(); - if let Some(QueryStart { + if let Some((QueryStart { query_name: p_query_name, time: start_time, - category: _ }) = previous_query { + category: _ }, child_time_to_subtract)) = previous_query { assert_eq!( p_query_name, query_name, @@ -263,18 +264,23 @@ fn calculate_thread_results(events: &Vec) -> CalculatedResults { ); let time_ns = time_between_ns(*start_time, *end_time); + let self_time_ns = time_ns - child_time_to_subtract; let result_data = results.categories.entry(*category).or_default(); - *result_data.query_times.entry(query_name).or_default() += time_ns; + *result_data.query_times.entry(query_name).or_default() += self_time_ns; + + if let Some((_, child_time_to_subtract)) = query_stack.last_mut() { + *child_time_to_subtract += time_ns; + } } else { bug!("Saw a query end but the previous event wasn't a query start"); } } GenericActivityEnd { category, time: end_time } => { let previous_event = query_stack.pop(); - if let Some(GenericActivityStart { + if let Some((GenericActivityStart { category: previous_category, - time: start_time }) = previous_event { + time: start_time }, child_time_to_subtract)) = previous_event { assert_eq!( previous_category, category, @@ -282,11 +288,16 @@ fn calculate_thread_results(events: &Vec) -> CalculatedResults { ); let time_ns = time_between_ns(*start_time, *end_time); + let self_time_ns = time_ns - child_time_to_subtract; let result_data = results.categories.entry(*category).or_default(); *result_data.query_times .entry("{time spent not running queries}") - .or_default() += time_ns; + .or_default() += self_time_ns; + + if let Some((_, child_time_to_subtract)) = query_stack.last_mut() { + *child_time_to_subtract += time_ns; + } } else { bug!("Saw an activity end but the previous event wasn't an activity start"); } -- 2.44.0