Chromium Code Reviews| Index: tools/telemetry/telemetry/web_perf/metrics/blob_timeline.py |
| diff --git a/tools/telemetry/telemetry/web_perf/metrics/blob_timeline.py b/tools/telemetry/telemetry/web_perf/metrics/blob_timeline.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..0b82c0307f0b2d1176d3551ad322fcad0668e41b |
| --- /dev/null |
| +++ b/tools/telemetry/telemetry/web_perf/metrics/blob_timeline.py |
| @@ -0,0 +1,62 @@ |
| +# Copyright 2015 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +from telemetry.value import list_of_scalar_values |
| +from telemetry.web_perf.metrics import timeline_based_metric |
| + |
| +class BlobTimelineMetric(timeline_based_metric.TimelineBasedMetric): |
| + """Reports directly durations of FrameView::performLayout events. |
| + |
| + 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. |
| + """ |
| + WRITE_EVENT_NAME = 'Registry::RegisterBlob' |
| + READ_EVENT_NAME = 'BlobRequest' |
| + |
| + def __init__(self): |
| + super(BlobTimelineMetric, self).__init__() |
| + |
| + def AddResults(self, model, renderer_thread, interactions, results): |
|
nednguyen
2015/05/18 22:55:54
Can you add unittest for this? You can look at tel
dmurph
2015/05/21 00:21:36
Done.
|
| + assert interactions |
| + def EventPredicate(event): |
| + return (event.name == self.READ_EVENT_NAME or |
| + event.name == self.WRITE_EVENT_NAME) |
| + events = renderer_thread.parent.IterAllEvents( |
| + event_predicate=EventPredicate) |
| + self._AddResultsInternal(events, interactions, results) |
| + # Now use the browser process events |
| + browser_process = \ |
| + [p for p in model.GetAllProcesses() if p.name == "Browser"][0] |
| + events = browser_process.parent.IterAllEvents( |
| + event_predicate=EventPredicate) |
| + self._AddResultsInternal(events, interactions, results) |
|
nednguyen
2015/05/18 22:55:54
If you don't add the assertion that there is only
nednguyen
2015/05/19 00:34:15
Err, silly. This isn't true. Please ignore this co
|
| + |
| + def _AddResultsInternal(self, events, interactions, results): |
| + reads = [] |
| + writes = [] |
| + for event in events: |
| + if any(interaction.start <= event.start <= interaction.end |
| + for interaction in interactions): |
| + if (event.name == self.WRITE_EVENT_NAME): |
| + writes.append(event.end - event.start) |
| + elif (event.name == self.READ_EVENT_NAME): |
| + reads.append(event.end - event.start) |
| + page = results.current_page |
| + if reads: |
| + results.AddValue(list_of_scalar_values.ListOfScalarValues( |
| + page=results.current_page, |
| + name='blob_reads_' + page.write_method + '_' + page.read_method, |
|
nednguyen
2015/05/19 00:34:15
No, you would want the name to be static. And time
dmurph
2015/05/21 00:21:36
Done.
|
| + units='ms', |
| + values=reads, |
| + description=('List of durations of blob part reads (not whole blob)'))) |
| + if writes: |
| + results.AddValue(list_of_scalar_values.ListOfScalarValues( |
| + page=results.current_page, |
| + name='blob_writes_' + page.write_method + |
| + '_' + page.read_method + '-read', |
| + units='ms', |
| + values=writes, |
| + description=('List of durations of blob writes.'))) |