# Copyright 2016 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. """Utility script to run the benchmarks during the profiling step of a PGO build. """ import json import optparse import os import subprocess import sys # Make sure that we're running as admin, this is required to run the Telemetry # benchmarks. from win32com.shell import shell if not shell.IsUserAnAdmin(): raise Exception('This script has to be run as admin.') _SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) _CHROME_BUILD_DIR = os.path.dirname(_SCRIPT_DIR) _CHROME_SRC_DIR = os.path.dirname(_CHROME_BUILD_DIR) # List of the benchmark that we run during the profiling step. _BENCHMARKS_TO_RUN = { 'blink_perf.bindings', 'blink_perf.canvas', 'blink_perf.css', 'blink_perf.dom', 'blink_perf.paint', 'blink_perf.svg', 'blink_style.top_25', 'dromaeo.cssqueryjquery', 'dromaeo.domcoreattr', 'dromaeo.domcoremodify', 'dromaeo.domcorequery', 'dromaeo.domcoretraverse', 'dromaeo.jslibattrprototype', 'dromaeo.jslibeventprototype', 'dromaeo.jslibmodifyprototype', 'dromaeo.jslibstyleprototype', 'dromaeo.jslibtraversejquery', 'dromaeo.jslibtraverseprototype', 'media.tough_video_cases', 'octane', 'smoothness.top_25_smooth', 'storage.indexeddb_endure_tracing', 'sunspider', } def RunBenchmarks(options): """Run the benchmarks.""" # Find the run_benchmark script. chrome_run_benchmark_script = os.path.join(_CHROME_SRC_DIR, 'tools', 'perf', 'run_benchmark') if not os.path.exists(chrome_run_benchmark_script): raise Exception('Unable to find the run_benchmark script ' '(%s doesn\'t exist) ' % chrome_run_benchmark_script) # Augment the PATH to make sure that the benchmarking script can find # pgosweep.exe and its runtime libraries. env = os.environ.copy() env['PATH'] = str(os.pathsep.join([options.build_dir, os.environ['PATH']])) env['PogoSafeMode'] = '1' # Apply a scaling factor of 0.5 to the PGO profiling buffers for the 32-bit # builds, without this the buffers will be too large and the process will # fail to start. See crbug.com/632864#c22. if options.target_cpu == 'x86': env['VCPROFILE_ALLOC_SCALE'] = '0.5' # Run all the benchmarks. # TODO(sebmarchand): Make this run in parallel. for benchmark in _BENCHMARKS_TO_RUN: try: benchmark_command = [ sys.executable, chrome_run_benchmark_script, '--browser', options.browser_type, ] # Automatically set the arguments to run this script on a local build. if options.browser_type == 'exact': benchmark_command += [ '--browser-executable', os.path.join(options.build_dir, 'chrome.exe') ] benchmark_command += [ '--profiler', 'win_pgo_profiler', benchmark ] subprocess.check_call(benchmark_command, env=env) except: print ('Error while trying to run the %s benchmark, continuing.' % benchmark) continue return 0 def main(): parser = optparse.OptionParser(usage='%prog [options]') parser.add_option( '--browser-type', help='The browser type (to be passed to Telemetry\'s ' 'benchmark runner).') # TODO(sebmarchand): Parse the args.gn file to automatically set this value. parser.add_option('--target-cpu', help='The target\'s bitness.') parser.add_option('--build-dir', help='Chrome build directory.') options, _ = parser.parse_args() if not options.target_cpu: parser.error('--target-cpu is required') if not options.build_dir: parser.error('--build-dir is required') if not options.browser_type: options.browser_type = 'exact' return RunBenchmarks(options) if __name__ == '__main__': sys.exit(main())