# 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())