adds flag for choosing bench representative algorithm.

git-svn-id: http://skia.googlecode.com/svn/trunk@5113 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
bensong@google.com 2012-08-15 17:31:46 +00:00
parent 63258865c4
commit 8734816c3f
2 changed files with 32 additions and 8 deletions

View File

@ -28,6 +28,8 @@ def usage():
print '-r <revision>[:<revision>] the revisions to show.'
print ' Negative <revision> is taken as offset from most recent revision.'
print '-s <setting>[=<value>] a setting to show (alpha, scalar, etc).'
print '-m <representative> use "avg", "min", or "med" for bench value.'
print ' They correspond to average, minimum and median of bench iters.'
print '-t <time> the time to show (w, c, g, etc).'
print '-x <int> the desired width of the svg.'
print '-y <int> the desired height of the svg.'
@ -88,7 +90,8 @@ def get_latest_revision(directory):
else:
return latest_revision_found
def parse_dir(directory, default_settings, oldest_revision, newest_revision):
def parse_dir(directory, default_settings, oldest_revision, newest_revision,
rep):
"""Parses bench data from files like bench_r<revision>_<scalar>.
(str, {str, str}, Number, Number) -> {int:[BenchDataPoints]}"""
@ -110,7 +113,7 @@ def parse_dir(directory, default_settings, oldest_revision, newest_revision):
revision_data_points[revision] = []
default_settings['scalar'] = scalar_type
revision_data_points[revision].extend(
bench_util.parse(default_settings, file_handle))
bench_util.parse(default_settings, file_handle, rep))
file_handle.close()
return revision_data_points
@ -267,7 +270,7 @@ def main():
try:
opts, _ = getopt.getopt(sys.argv[1:]
, "b:c:d:f:l:o:r:s:t:x:y:"
, "b:c:d:f:l:m:o:r:s:t:x:y:"
, "default-setting=")
except getopt.GetoptError, err:
print str(err)
@ -278,6 +281,7 @@ def main():
config_of_interest = None
bench_of_interest = None
time_of_interest = None
rep = "avg" # bench representative calculation algorithm
revision_range = '0:'
regression_range = '0:'
latest_revision = None
@ -323,6 +327,10 @@ def main():
regression_range = value
elif option == "-l":
title = value
elif option == "-m":
rep = value
if rep not in ["avg", "min", "med"]:
raise Exception("Invalid -m representative: %s" % rep)
elif option == "-o":
redirect_stdout(value)
elif option == "-r":
@ -355,7 +363,8 @@ def main():
unfiltered_revision_data_points = parse_dir(directory
, default_settings
, oldest_revision
, newest_revision)
, newest_revision
, rep)
# Filter out any data points that are utterly bogus... make sure to report
# that we did so later!

View File

@ -45,10 +45,11 @@ class _ExtremeType(object):
Max = _ExtremeType(1, "Max")
Min = _ExtremeType(-1, "Min")
def parse(settings, lines):
def parse(settings, lines, representative='avg'):
"""Parses bench output into a useful data structure.
({str:str}, __iter__ -> str) -> [BenchDataPoint]"""
({str:str}, __iter__ -> str) -> [BenchDataPoint]
representative is one of 'avg', 'min', 'med' (average, mean, median)."""
benches = []
current_bench = None
@ -84,12 +85,26 @@ def parse(settings, lines):
current_time_type = new_time.group(1)
iters = [float(i) for i in
new_time.group(2).strip().split(',')]
current_time = sum(iters) / len(iters)
iters.sort()
iter_len = len(iters)
if representative == 'avg':
rep = sum(iters) / iter_len
if representative == 'min':
rep = iters[0]
elif representative == 'med':
if iter_len % 2:
rep = (iters[iter_len / 2] +
iters[iter_len / 2 - 1]) / 2
else:
rep = iters[iter_len / 2]
else:
raise Exception("invalid representative algorithm %s!" %
representative)
benches.append(BenchDataPoint(
current_bench
, current_config
, current_time_type
, current_time
, rep
, settings))
return benches