Chromium Code Reviews| 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> |