| Index: tools/telemetry/telemetry/web_perf/metrics/layout.py
|
| diff --git a/tools/telemetry/telemetry/web_perf/metrics/layout.py b/tools/telemetry/telemetry/web_perf/metrics/layout.py
|
| index baa5295a7aa2a35b73531b03dd292c87b8b76074..558a9744d0bcbc3a898208820c68398eec5e623b 100644
|
| --- a/tools/telemetry/telemetry/web_perf/metrics/layout.py
|
| +++ b/tools/telemetry/telemetry/web_perf/metrics/layout.py
|
| @@ -3,55 +3,41 @@
|
| # found in the LICENSE file.
|
|
|
| import math
|
| -from telemetry.value import scalar
|
| +from telemetry.value import list_of_scalar_values
|
| from telemetry.web_perf.metrics import timeline_based_metric
|
|
|
|
|
| class LayoutMetric(timeline_based_metric.TimelineBasedMetric):
|
| - """Computes metrics that measure layout performance, specifically,
|
| - avg and stddev of CPU time of layout-related trace events:
|
| + """Reports directly durations of FrameView::performLayout events.
|
|
|
| - layout_total_{avg,stddev}: FrameView::layout
|
| - layout_{avg,stddev}: FrameView::performLayout
|
| - pre_layout_{avg,stddev}: FrameView::performPreLayoutTasks
|
| - post_layout_{avg,stddev}: FrameView::performPostLayoutTasks
|
| - layer_positions_{avg,stddev}: RenderLayer::updateLayerPositionsAfterLayout
|
| + layout: Durations of FrameView::performLayout events that were caused by and
|
| + start during user interaction.
|
|
|
| Layout happens no more than once per frame, so per-frame-ness is implied.
|
| - Not all pages have interactions, so interaction records are not required.
|
| """
|
| - EVENTS = {
|
| - 'FrameView::layout': 'layout_total',
|
| - 'FrameView::performLayout': 'layout',
|
| - 'FrameView::performPreLayoutTasks': 'pre_layout',
|
| - 'FrameView::performPostLayoutTasks': 'post_layout',
|
| - 'RenderLayer::updateLayerPositionsAfterLayout': 'layer_positions',
|
| - }
|
| + EVENT_NAME = 'FrameView::performLayout'
|
|
|
| def __init__(self):
|
| super(LayoutMetric, self).__init__()
|
|
|
| - def AddResults(self, _model, renderer_thread, _interaction_records, results):
|
| - self._AddResults(renderer_thread.parent.IterAllSlices(), results)
|
| -
|
| - def _AddResults(self, events, results):
|
| - metrics = dict((long_name, (short_name, [])) for long_name, short_name in
|
| - self.EVENTS.iteritems())
|
| + def AddResults(self, _model, renderer_thread, interactions, results):
|
| + assert interactions
|
| + self._AddResultsInternal(renderer_thread.parent.IterAllSlices(),
|
| + interactions, results)
|
|
|
| + def _AddResultsInternal(self, events, interactions, results):
|
| + layouts = []
|
| for event in events:
|
| - if event.name in metrics:
|
| - metrics[event.name][1].append(event.end - event.start)
|
| -
|
| - for long_name, (short_name, durations) in metrics.iteritems():
|
| - count = len(durations)
|
| - avg = 0.0
|
| - stddev = 0.0
|
| - if count:
|
| - avg = sum(durations) / count
|
| - stddev = math.sqrt(sum((d - avg) ** 2 for d in durations) / count)
|
| - results.AddValue(scalar.ScalarValue(results.current_page,
|
| - short_name + '_avg', 'ms', avg,
|
| - description='Average duration of %s events' % long_name))
|
| - results.AddValue(scalar.ScalarValue(results.current_page,
|
| - short_name + '_stddev', 'ms', stddev,
|
| - description='stddev of duration of %s events' % long_name))
|
| + if (event.name == self.EVENT_NAME) and any(
|
| + interaction.start <= event.start <= interaction.end
|
| + for interaction in interactions):
|
| + layouts.append(event.end - event.start)
|
| + if not layouts:
|
| + return
|
| + results.AddValue(list_of_scalar_values.ListOfScalarValues(
|
| + page=results.current_page,
|
| + name='layout',
|
| + units='ms',
|
| + values=layouts,
|
| + description=('List of durations of layouts that were caused by and '
|
| + 'start during interactions')))
|
|
|