You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
4.6 KiB
144 lines
4.6 KiB
#!/usr/bin/env python |
|
|
|
''' |
|
Run autotest repeatedly at different speedups to help find best default speedup |
|
|
|
AP_FLAKE8_CLEAN |
|
''' |
|
|
|
import optparse |
|
import os |
|
import re |
|
import subprocess |
|
import time |
|
|
|
|
|
class CheckAutoTestSpeedup(object): |
|
def __init__( |
|
self, |
|
build_target="build.Plane", |
|
test_target="test.QuadPlane", |
|
min_speedup=1, |
|
max_speedup=50, |
|
gdb=False, |
|
debug=False |
|
): |
|
self.build_target = build_target |
|
self.test_target = test_target |
|
self.min_speedup = min_speedup |
|
self.max_speedup = max_speedup |
|
self.gdb = gdb |
|
self.debug = debug |
|
|
|
def progress(self, message): |
|
print("PROGRESS: %s" % (message,)) |
|
|
|
def run_program(self, prefix, cmd_list): |
|
'''copied in from build_binaries.py''' |
|
'''run cmd_list, spewing and setting output in self''' |
|
self.progress("Running (%s)" % " ".join(cmd_list)) |
|
p = subprocess.Popen(cmd_list, |
|
bufsize=1, |
|
stdin=None, |
|
close_fds=True, |
|
stdout=subprocess.PIPE, |
|
stderr=subprocess.STDOUT) |
|
self.program_output = "" |
|
while True: |
|
x = p.stdout.readline() |
|
if len(x) == 0: |
|
returncode = os.waitpid(p.pid, 0) |
|
if returncode: |
|
break |
|
# select not available on Windows... probably... |
|
time.sleep(0.1) |
|
continue |
|
if type(x) == bytes: |
|
x = x.decode('utf-8') |
|
self.program_output += x |
|
x = x.rstrip() |
|
print("%s: %s" % (prefix, x)) |
|
(_, status) = returncode |
|
if status != 0: |
|
self.progress("Process failed (%s)" % |
|
str(returncode)) |
|
raise subprocess.CalledProcessError( |
|
returncode, cmd_list) |
|
|
|
def run(self): |
|
build_args = [ |
|
"./Tools/autotest/autotest.py", |
|
self.build_target |
|
] |
|
if opts.debug: |
|
build_args.append("--debug") |
|
self.run_program("BUILD", build_args) |
|
results = { |
|
} |
|
f = open(os.path.join("/tmp/speedup.txt"), "w") |
|
for i in range(self.max_speedup, self.min_speedup-1, -1): |
|
self.progress("Checking speedup %u" % i) |
|
run_args = [ |
|
"./Tools/autotest/autotest.py", |
|
"--speedup", str(i), |
|
"--show-test-timings", |
|
self.test_target, |
|
] |
|
if opts.gdb: |
|
run_args.append("--gdb") |
|
self.run_program("SPEEDUP-%03u" % i, run_args) |
|
for line in self.program_output.split("\n"): |
|
match = re.match(".*tests_total_time.*?([0-9.]+)s.*", line) |
|
if match is not None: |
|
break |
|
results[i] = float(match.group(1)) |
|
prog = "%u %f" % (i, results[i]) |
|
self.progress(prog) |
|
print(prog, file=f) |
|
f.flush() |
|
|
|
for (speedup, t) in results.items(): |
|
print("%u %f" % (speedup, t)) |
|
|
|
|
|
if __name__ == '__main__': |
|
parser = optparse.OptionParser( |
|
"check_autotest_speedup.py", |
|
epilog="" |
|
"e.g. ./Tools/autotest/check_autotest_speedup.py --max-speedup=40 --build-target=build.Sub --test-target=test.Sub" |
|
) |
|
parser.add_option("--debug", |
|
default=False, |
|
help='compile with debugging') |
|
parser.add_option("--gdb", |
|
default=False, |
|
help='run under gdb') |
|
parser.add_option("--max-speedup", |
|
type=int, |
|
default=50, |
|
help='max speedup to test') |
|
parser.add_option("--min-speedup", |
|
type=int, |
|
default=1, |
|
help='min speedup to test') |
|
parser.add_option("--build-target", |
|
type='string', |
|
default='build.Plane', |
|
help='build target (e.g. build.Plane)') |
|
parser.add_option("--test-target", |
|
type='string', |
|
default='test.QuadPlane', |
|
help='test target (e.g. test.QuadPlane)') |
|
|
|
opts, args = parser.parse_args() |
|
|
|
checker = CheckAutoTestSpeedup( |
|
gdb=opts.gdb, |
|
debug=opts.debug, |
|
max_speedup=opts.max_speedup, |
|
min_speedup=opts.min_speedup, |
|
build_target=opts.build_target, |
|
test_target=opts.test_target |
|
) |
|
|
|
checker.run()
|
|
|