| # Copyright 2022 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from core.perf_benchmark import PerfBenchmark |
| from telemetry.timeline.chrome_trace_config import ChromeTraceConfig |
| |
| |
| class PerfBenchmarkWithProfiling(PerfBenchmark): |
| """A convenience super class for benchmarks that need Perfetto CPU profiling. |
| |
| This class automatically enables Perfetto profiling (callstack sampling) on |
| benchmarks (when supported), and sets parameters related to such sampling |
| automatically, based on (1) which browser the benchmark is being run on, and |
| (2) any user-supplied options. |
| """ |
| |
| def __init__(self, *args, **kwargs): |
| super(PerfBenchmarkWithProfiling, self).__init__(*args, **kwargs) |
| # The browser selected for benchmarking. |
| self._browser_package = None |
| |
| # You should, if needed, override the methods below. |
| |
| def GetSamplingFrequencyHz(self): |
| """Override this to set the (int) Hz frequency for sampling callstacks.""" |
| return None |
| |
| def CustomizeSystemTraceConfig(self, system_trace_config): |
| """Override this to modify `system_trace_config` (a SystemTraceConfig).""" |
| |
| # DO NOT OVERRIDE the methods below. |
| |
| def CustomizeOptions(self, finder_options, possible_browser=None): |
| """DO NOT OVERRIDE this method in your benchmark subclass. |
| |
| Instead, override SetExtraBrowserOptions. |
| """ |
| super(PerfBenchmarkWithProfiling, |
| self).CustomizeOptions(finder_options, possible_browser) |
| |
| if finder_options is None or possible_browser is None: |
| return |
| |
| # Only Android is currently supported. |
| if not PerfBenchmark.IsAndroid(possible_browser): |
| return |
| |
| try: |
| self._browser_package = possible_browser.browser_package |
| except AttributeError: |
| # Not an Android browser. |
| pass |
| |
| def CreateCoreTimelineBasedMeasurementOptions(self): |
| """DO NOT OVERRIDE this method in your benchmark subclass. |
| |
| Instead, override CustomizeSystemTraceConfig. |
| """ |
| options = super(PerfBenchmarkWithProfiling, |
| self).CreateCoreTimelineBasedMeasurementOptions() |
| |
| # Here, we implicitly assume that CreateCoreTimelineBasedMeasurementOptions |
| # is called after CustomizeOptions. |
| if self._browser_package is not None: |
| options.config.enable_experimental_system_tracing = True |
| options.config.system_trace_config.EnableProfiling( |
| # Enable wildcard to sample all processes for the selected browser. |
| "{}*".format(self._browser_package), |
| self.GetSamplingFrequencyHz()) |
| # This adds metadata about Chrome processes to the profile. |
| options.config.system_trace_config.EnableChrome(ChromeTraceConfig()) |
| |
| self.CustomizeSystemTraceConfig(options.config.system_trace_config) |
| return options |