# Copyright 2012 Google Inc. All Rights Reserved. """This script generates a crosperf overhead-testing experiment file for MoreJS. Use: experiment_gen.py --crosperf=/home/mrdmnd/depot2/crosperf --chromeos_root= /home/mrdmnd/chromiumos --remote-host=chromeos-zgb3.mtv --board=x86-zgb --event= cycles -F 10 -F 20 -c 10582 -c 10785211 --perf_options="-g" """ import optparse import subprocess import sys import time HEADER = """ board: %s remote: %s benchmark: baseline { iterations: %s autotest_name: desktopui_PyAutoPerfTests autotest_args: --args='--iterations=%s perf.PageCyclerTest.testMoreJSFile' }""" EXPERIMENT = """ benchmark: %s { iterations: %s autotest_name: desktopui_PyAutoPerfTests autotest_args: --args='--iterations=%s perf.PageCyclerTest.testMoreJSFile' --profiler=custom_perf --profiler_args='perf_options="record -a %s %s -e %s"' \n}""" # pylint: disable-msg=C6310 DEFAULT_IMAGE = """ default { chromeos_image: %s/src/build/images/%s/latest/chromiumos_test_image.bin }""" def main(): parser = optparse.OptionParser() parser.add_option('--crosperf', dest='crosperf_root', action='store', default='/home/mrdmnd/depot2/crosperf', help='Crosperf root directory.') parser.add_option('--chromeos_root', dest='chromeos_root', action='store', default='/home/mrdmnd/chromiumos', help='ChromiumOS root directory.') parser.add_option('--remote', dest='remote', action='store', help='Host to run test on. Required.') parser.add_option('--board', dest='board', action='store', help='Board architecture to run on. Required.') parser.add_option('--event', dest='event', action='store', help='Event to profile. Required.') parser.add_option('-F', dest='sampling_frequencies', action='append', help='A target frequency to sample at.') parser.add_option('-c', dest='sampling_periods', action='append', help='A target period to sample at. Event specific.') parser.add_option('--benchmark-iterations', dest='benchmark_iterations', action='store', default=4, help='Number of benchmark iters') parser.add_option('--test-iterations', dest='test_iterations', action='store', default=10, help='Number of test iters') parser.add_option('-p', dest='print_only', action='store_true', help='If enabled, will print experiment file and exit.') parser.add_option('--perf_options', dest='perf_options', action='store', help='Arbitrary flags to perf. Surround with dblquotes.') options = parser.parse_args()[0] if options.remote is None: print '%s requires a remote hostname.' % sys.argv[0] return 1 elif options.board is None: print '%s requires a target board.' % sys.argv[0] return 1 elif options.event is None: print '%s requires an event to profile.' % sys.argv[0] return 1 else: crosperf_root = options.crosperf_root chromeos_root = options.chromeos_root remote = options.remote board = options.board event = options.event bench_iters = options.benchmark_iterations test_iters = options.test_iterations perf_opts = options.perf_options # Set up baseline test. experiment_file = HEADER % (board, remote, bench_iters, test_iters) # Set up experimental tests. if options.sampling_frequencies: for freq in options.sampling_frequencies: test_string = str(freq) + 'Freq' experiment_file += EXPERIMENT % (test_string, bench_iters, test_iters, '-F %s' % freq, '' if perf_opts is None else perf_opts, event) if options.sampling_periods: for period in options.sampling_periods: test_string = str(period) + 'Period' experiment_file += EXPERIMENT % ( test_string, bench_iters, test_iters, '-c %s' % period, '' if perf_opts is None else perf_opts, event) # Point to the target image. experiment_file += DEFAULT_IMAGE % (chromeos_root, board) if options.print_only: print experiment_file else: current_time = int(round(time.time() * 1000)) file_name = 'perf_overhead_%s' % str(current_time) with open(file_name, 'w') as f: f.write(experiment_file) try: process = subprocess.Popen(['%s/crosperf' % crosperf_root, file_name]) process.communicate() except OSError: print 'Could not find crosperf, make sure --crosperf flag is set right.' return 1 return 0 if __name__ == '__main__': exit(main())