Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3020)

Unified Diff: build/win/run_pgo_profiling_benchmarks.py

Issue 2368353003: Add a script to run the PGO benchmarks. (Closed)
Patch Set: . Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/win/run_pgo_profiling_benchmarks.py
diff --git a/build/win/run_pgo_profiling_benchmarks.py b/build/win/run_pgo_profiling_benchmarks.py
new file mode 100644
index 0000000000000000000000000000000000000000..13132cd96a76adf4d26adcc457002f700563dde6
--- /dev/null
+++ b/build/win/run_pgo_profiling_benchmarks.py
@@ -0,0 +1,156 @@
+# 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',
+ 'indexeddb_perf',
+ 'media.tough_video_cases',
+ 'octane',
+ 'smoothness.top_25_smooth',
+ 'speedometer',
+ 'sunspider',
+}
+
+
+def FindPgosweep(target_cpu):
+ """Find the directory containing pgosweep.exe.
+
+ Note: |target_cpu| should be x86 or x64.
+ """
+ if target_cpu not in ('x86', 'x64'):
+ raise Exception('target_cpu should be x86 or x64.')
+ win_toolchain_json_file = os.path.join(_CHROME_BUILD_DIR,
+ 'win_toolchain.json')
+ if not os.path.exists(win_toolchain_json_file):
+ raise Exception('The toolchain JSON file (%s) is missing.' %
+ win_toolchain_json_file)
+ with open(win_toolchain_json_file) as temp_f:
+ toolchain_data = json.load(temp_f)
+ if not os.path.isdir(toolchain_data['path']):
+ raise Exception('The toolchain JSON file\'s "path" entry (%s) does not '
+ 'refer to a path.' % win_toolchain_json_file)
+
+ pgo_sweep_dir = os.path.join(toolchain_data['path'], 'VC', 'bin')
+ if target_cpu == 'x64':
+ pgo_sweep_dir = os.path.join(pgo_sweep_dir, 'amd64')
+
+ if not os.path.exists(os.path.join(pgo_sweep_dir, 'pgosweep.exe')):
+ raise Exception('pgosweep.exe is missing from %s.' % pgo_sweep_dir)
+
+ return pgo_sweep_dir
+
+
+def RunBenchmarks(options):
+ """Run the benchmarks."""
+ # Starts by finding the directory containing pgosweep.exe
+ pgo_sweep_dir = FindPgosweep(options.target_cpu)
+
+ # 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([pgo_sweep_dir, 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())
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698