diff options
author | 2012-08-15 17:31:46 +0000 | |
---|---|---|
committer | 2012-08-15 17:31:46 +0000 | |
commit | 8734816c3fadd3c9f270104b2c1a75cacdafb8b5 (patch) | |
tree | ad60ed974523372a69b47a81d3398625bb9d8869 | |
parent | 63258865c43612de7102e3418074259e13f30d6b (diff) |
adds flag for choosing bench representative algorithm.
git-svn-id: http://skia.googlecode.com/svn/trunk@5113 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | bench/bench_graph_svg.py | 17 | ||||
-rw-r--r-- | bench/bench_util.py | 23 |
2 files changed, 32 insertions, 8 deletions
diff --git a/bench/bench_graph_svg.py b/bench/bench_graph_svg.py index 8165c98101..04c7bef023 100644 --- a/bench/bench_graph_svg.py +++ b/bench/bench_graph_svg.py @@ -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! diff --git a/bench/bench_util.py b/bench/bench_util.py index 22ded9dd70..62b1e291b5 100644 --- a/bench/bench_util.py +++ b/bench/bench_util.py @@ -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 |