 Chromium Code Reviews
 Chromium Code Reviews Issue 2698003004:
  Add a function that computes contribution of selected events to EQT.  (Closed)
    
  
    Issue 2698003004:
  Add a function that computes contribution of selected events to EQT.  (Closed) 
  | Index: tracing/tracing/metrics/system_health/estimated_input_latency_metric.html | 
| diff --git a/tracing/tracing/metrics/system_health/estimated_input_latency_metric.html b/tracing/tracing/metrics/system_health/estimated_input_latency_metric.html | 
| index 64c7d100b55bd492fd80691f937f1323680cd9e2..a88b16468caf43caf6d5f47f9ed85b1d271a4030 100644 | 
| --- a/tracing/tracing/metrics/system_health/estimated_input_latency_metric.html | 
| +++ b/tracing/tracing/metrics/system_health/estimated_input_latency_metric.html | 
| @@ -63,11 +63,15 @@ tr.exportTo('tr.metrics.sh', function() { | 
| } | 
| /** | 
| - * Adds the input latency estimated as the maximum expected queueing time | 
| - * in the sliding time window of size WINDOW_SIZE_MS. | 
| - * The result histogram contains value per renderer. | 
| + * Computes the maximum expected queueing time in the sliding time window | 
| + * of size 500ms (WINDOW_SIZE_MS). The function produces two histogram values: | 
| + * - total:500ms_window:renderer_eqt, | 
| + * - interactive:500ms_window:renderer_eqt. | 
| + * The former is the metric computed for the whole trace. The latter is | 
| + * the metric computed for the tme while the page is interactive. | 
| + * Each renderer process adds one sample to the histograms. | 
| */ | 
| - function estimatedInputLatency(values, model) { | 
| + function expectedQueueingTimeMetric(values, model) { | 
| let chromeHelper = model.getOrCreateHelper( | 
| tr.model.helpers.ChromeModelHelper); | 
| let totalHistogram = createHistogramForEQT_( | 
| @@ -109,10 +113,95 @@ tr.exportTo('tr.metrics.sh', function() { | 
| values.addHistogram(interactiveHistogram); | 
| } | 
| - tr.metrics.MetricRegistry.register(estimatedInputLatency); | 
| + /** | 
| + * Returns the total duration of topmost subslices of the given slice | 
| + * that satisfy the given predicate. | 
| 
tdresser
2017/02/21 15:12:58
Based on https://github.com/catapult-project/catap
 
ulan
2017/02/21 16:29:49
Done.
 | 
| + */ | 
| + function durationOfTopmostSubSlices(slice, predicate) { | 
| + let duration = 0; | 
| + for (let sub of slice.findTopmostSlicesRelativeToThisSlice(predicate)) { | 
| + duration += sub.duration; | 
| + } | 
| + return duration; | 
| + } | 
| + | 
| + /** | 
| + * Computes the contribution of the selected events to the expected queueing | 
| + * time. We define the contribution as the maximum expected queueing time in | 
| + * the sliding time window of size 500ms (WINDOW_SIZE_MS) for the trace that | 
| + * is modified as follows: | 
| + * - from each top-level task remove all subevents except the selected events. | 
| + * - removing subevents shrinks a task by shifting its end time closer to | 
| + * the start time. The start time does not change. | 
| + * | 
| + * Similar to the expectedQueueingTime this function adds two histograms: | 
| + * total and interactive. For example: | 
| + * - total:500ms_window:renderer_eqt:v8, | 
| + * - interactive:500ms_window:renderer_eqt:v8. | 
| + * Each renderer process adds one sample to the histograms. | 
| + * | 
| + * @param eventPredicate the predicate for selecting events. | 
| + * @param eventName the name describing the selected events. This name will be | 
| + * added to metric names. | 
| + */ | 
| + function contributionToExpectedQueueingTime( | 
| + eventPredicate, eventName, values, model) { | 
| + let chromeHelper = model.getOrCreateHelper( | 
| + tr.model.helpers.ChromeModelHelper); | 
| + let totalHistogram = createHistogramForEQT_( | 
| + `total:${WINDOW_SIZE_MS}ms_window:renderer_eqt:${eventName}`, | 
| + `Contribution to the expected queueing time by ${eventName}` + | 
| + ' for a given renderer. It is computed as the maximum EQT in' + | 
| + ` a ${WINDOW_SIZE_MS}ms sliding window after shrinking top-level` + | 
| + ` tasks to contain only ${eventName} subevents`); | 
| + let interactiveHistogram = createHistogramForEQT_( | 
| + `interactive:${WINDOW_SIZE_MS}ms_window:renderer_eqt:${eventName}`, | 
| + `Contribution to the expected queueing time by ${eventName}` + | 
| + ' for a given renderer while the page is interactive. It is computed' + | 
| + ` as the maximum EQT in a ${WINDOW_SIZE_MS}ms sliding window after` + | 
| + ` shrinking top-level tasks to contain only ${eventName} subevents`); | 
| + let rendererHelpers = tr.b.dictionaryValues(chromeHelper.rendererHelpers); | 
| + for (let rendererHelper of rendererHelpers) { | 
| + if (rendererHelper.isChromeTracingUI) continue; | 
| + let tasks = rendererHelper.mainThread.sliceGroup.topLevelSlices | 
| + .filter(slice => slice.duration > 0 && !containsForcedGC_(slice)) | 
| + .map(slice => { | 
| + return { | 
| + start: slice.start, | 
| + end: slice.start + | 
| + durationOfTopmostSubSlices(slice, eventPredicate) | 
| + }; | 
| + }); | 
| + totalHistogram.addSample( | 
| + tr.e.chrome.maxExpectedQueueingTimeInSlidingWindow( | 
| + rendererHelper.mainThread.bounds.min, | 
| + rendererHelper.mainThread.bounds.max, | 
| + WINDOW_SIZE_MS, tasks)); | 
| + let interactiveTimestamps = | 
| + tr.e.chrome.getInteractiveTimestamps(model).get(rendererHelper.pid); | 
| + if (interactiveTimestamps.length === 0) continue; | 
| + if (interactiveTimestamps.length > 1) { | 
| + // TODO(ulan): Support multiple interactive time windows when | 
| + // https://crbug.com/692112 is fixed. | 
| + continue; | 
| + } | 
| + let interactiveWindow = | 
| + tr.b.Range.fromExplicitRange(interactiveTimestamps[0], Infinity) | 
| + .findIntersection(rendererHelper.mainThread.bounds); | 
| + interactiveHistogram.addSample( | 
| + tr.e.chrome.maxExpectedQueueingTimeInSlidingWindow( | 
| + interactiveWindow.min, interactiveWindow.max, | 
| + WINDOW_SIZE_MS, tasks)); | 
| + } | 
| + values.addHistogram(totalHistogram); | 
| + values.addHistogram(interactiveHistogram); | 
| + } | 
| + | 
| + tr.metrics.MetricRegistry.register(expectedQueueingTimeMetric); | 
| return { | 
| - estimatedInputLatency, | 
| + expectedQueueingTimeMetric, | 
| + contributionToExpectedQueueingTime, | 
| }; | 
| }); | 
| </script> |