| Index: tools/perf/metrics/timeline.py
|
| diff --git a/tools/perf/metrics/timeline.py b/tools/perf/metrics/timeline.py
|
| index 01cd130c46c9c914b2e0082a60575db8bdb6054c..3442cab15b01b00604f22a2541f4df74825a0c7f 100644
|
| --- a/tools/perf/metrics/timeline.py
|
| +++ b/tools/perf/metrics/timeline.py
|
| @@ -11,11 +11,13 @@ from telemetry.page import page_measurement
|
| TRACING_MODE = 'tracing-mode'
|
| TIMELINE_MODE = 'timeline-mode'
|
|
|
| +
|
| class MissingFramesError(page_measurement.MeasurementFailure):
|
| def __init__(self):
|
| super(MissingFramesError, self).__init__(
|
| 'No frames found in trace. Unable to normalize results.')
|
|
|
| +
|
| class TimelineMetric(Metric):
|
| def __init__(self, mode):
|
| """ Initializes a TimelineMetric object.
|
| @@ -79,6 +81,7 @@ class TimelineMetric(Metric):
|
| def AddResults(self, tab, results):
|
| return
|
|
|
| +
|
| class LoadTimesTimelineMetric(TimelineMetric):
|
| def __init__(self, mode):
|
| super(LoadTimesTimelineMetric, self).__init__(mode)
|
| @@ -140,8 +143,8 @@ TimelineThreadCategories = {
|
| "Chrome_InProcGpuThread": "GPU",
|
| "CrGpuMain" : "GPU",
|
| "AsyncTransferThread" : "GPU_transfer",
|
| - "CrBrowserMain" : "browser_main",
|
| - "Browser Compositor" : "browser_compositor",
|
| + "CrBrowserMain" : "browser",
|
| + "Browser Compositor" : "browser",
|
| "CrRendererMain" : "renderer_main",
|
| "Compositor" : "renderer_compositor",
|
| "IOThread" : "IO",
|
| @@ -151,29 +154,44 @@ TimelineThreadCategories = {
|
| "DummyThreadName3" : "total_all"
|
| }
|
|
|
| -MatchBySubString = ["IOThread", "CompositorRasterWorker"]
|
| +_MatchBySubString = ["IOThread", "CompositorRasterWorker"]
|
|
|
| AllThreads = TimelineThreadCategories.values()
|
| NoThreads = []
|
| -FastPathThreads = ["GPU",
|
| - "browser_main",
|
| - "browser_compositor",
|
| - "renderer_compositor",
|
| - "IO"]
|
| -MainThread = ["renderer_main"]
|
| -FastPathResults = AllThreads
|
| -FastPathDetails = NoThreads
|
| -SilkResults = ["renderer_main", "total_all"]
|
| -SilkDetails = MainThread
|
| +FastPathThreads = ["GPU", "renderer_compositor", "browser", "IO"]
|
| +
|
| +ReportMainThreadOnly = ["renderer_main"]
|
| +ReportFastPathResults = AllThreads
|
| +ReportFastPathDetails = NoThreads
|
| +ReportSilkResults = ["renderer_main", "total_all"]
|
| +ReportSilkDetails = ["renderer_main"]
|
|
|
| # TODO(epenner): Thread names above are likely fairly stable but trace names
|
| -# could change. We should formalize this trace to keep this robust.
|
| -CompositorFrameTraceName = "::SwapBuffers"
|
| +# could change. We should formalize these traces to keep this robust.
|
| +OverheadTraceCategory = "trace_event_overhead"
|
| +OverheadTraceName = "overhead"
|
| +FrameTraceName = "::SwapBuffers"
|
| +FrameTraceThreadName = "renderer_compositor"
|
| +
|
| +
|
| +def ClockOverheadForEvent(event):
|
| + if (event.category == OverheadTraceCategory and
|
| + event.name == OverheadTraceName):
|
| + return event.duration
|
| + else:
|
| + return 0
|
| +
|
| +def CpuOverheadForEvent(event):
|
| + if (event.category == OverheadTraceCategory and
|
| + event.thread_duration):
|
| + return event.thread_duration
|
| + else:
|
| + return 0
|
|
|
| def ThreadCategoryName(thread_name):
|
| thread_category = "other"
|
| for substring, category in TimelineThreadCategories.iteritems():
|
| - if substring in MatchBySubString and substring in thread_name:
|
| + if substring in _MatchBySubString and substring in thread_name:
|
| thread_category = category
|
| if thread_name in TimelineThreadCategories:
|
| thread_category = TimelineThreadCategories[thread_name]
|
| @@ -188,6 +206,7 @@ def ThreadCpuTimeResultName(thread_category):
|
| def ThreadDetailResultName(thread_category, detail):
|
| return "thread_" + thread_category + "|" + detail
|
|
|
| +
|
| class ResultsForThread(object):
|
| def __init__(self, model, action_ranges, name):
|
| self.model = model
|
| @@ -198,11 +217,14 @@ class ResultsForThread(object):
|
|
|
| @property
|
| def clock_time(self):
|
| - return sum([x.duration for x in self.toplevel_slices])
|
| + clock_duration = sum([x.duration for x in self.toplevel_slices])
|
| + clock_overhead = sum([ClockOverheadForEvent(x) for x in self.all_slices])
|
| + return clock_duration - clock_overhead
|
|
|
| @property
|
| def cpu_time(self):
|
| - res = 0
|
| + cpu_duration = 0
|
| + cpu_overhead = sum([CpuOverheadForEvent(x) for x in self.all_slices])
|
| for x in self.toplevel_slices:
|
| # Only report thread-duration if we have it for all events.
|
| #
|
| @@ -213,10 +235,10 @@ class ResultsForThread(object):
|
| else:
|
| return 0
|
| else:
|
| - res += x.thread_duration
|
| - return res
|
| + cpu_duration += x.thread_duration
|
| + return cpu_duration - cpu_overhead
|
|
|
| - def ActionSlices(self, slices):
|
| + def SlicesInActions(self, slices):
|
| slices_in_actions = []
|
| for event in slices:
|
| for action_range in self.action_ranges:
|
| @@ -226,8 +248,8 @@ class ResultsForThread(object):
|
| return slices_in_actions
|
|
|
| def AppendThreadSlices(self, thread):
|
| - self.all_slices.extend(self.ActionSlices(thread.all_slices))
|
| - self.toplevel_slices.extend(self.ActionSlices(thread.toplevel_slices))
|
| + self.all_slices.extend(self.SlicesInActions(thread.all_slices))
|
| + self.toplevel_slices.extend(self.SlicesInActions(thread.toplevel_slices))
|
|
|
| def AddResults(self, num_frames, results):
|
| clock_report_name = ThreadTimeResultName(self.name)
|
| @@ -255,6 +277,7 @@ class ResultsForThread(object):
|
| results.Add(ThreadDetailResultName(self.name, "idle"),
|
| 'ms', idle_time_result)
|
|
|
| +
|
| class ThreadTimesTimelineMetric(TimelineMetric):
|
| def __init__(self):
|
| super(ThreadTimesTimelineMetric, self).__init__(TRACING_MODE)
|
| @@ -293,9 +316,9 @@ class ThreadTimesTimelineMetric(TimelineMetric):
|
| if ThreadCategoryName(thread.name) in FastPathThreads:
|
| thread_category_results['total_fast_path'].AppendThreadSlices(thread)
|
|
|
| - # Calculate the number of frames from the CC thread.
|
| - cc_slices = thread_category_results['renderer_compositor'].all_slices
|
| - num_frames = self.CountSlices(cc_slices, CompositorFrameTraceName)
|
| + # Calculate the number of frames.
|
| + frame_slices = thread_category_results[FrameTraceThreadName].all_slices
|
| + num_frames = self.CountSlices(frame_slices, FrameTraceName)
|
|
|
| # Report the desired results and details.
|
| for thread_results in thread_category_results.values():
|
|
|