From b6204b1ec4e4940db94bc40d4283ee77729170d6 Mon Sep 17 00:00:00 2001 From: "bensong@google.com" Date: Thu, 16 Aug 2012 20:49:28 +0000 Subject: cleaned up algorithm codes and added 25th percentile for representation. git-svn-id: http://skia.googlecode.com/svn/trunk@5139 2bbb7eff-a529-9590-31e7-b0007b416f81 --- bench/bench_util.py | 51 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 18 deletions(-) (limited to 'bench/bench_util.py') diff --git a/bench/bench_util.py b/bench/bench_util.py index 3b150a042e..3abdee8b60 100644 --- a/bench/bench_util.py +++ b/bench/bench_util.py @@ -45,11 +45,41 @@ class _ExtremeType(object): Max = _ExtremeType(1, "Max") Min = _ExtremeType(-1, "Min") -def parse(settings, lines, representative='avg'): +class _ListAlgorithm(object): + """Algorithm for selecting the representation value from a given list. + representation is one of 'avg', 'min', 'med', '25th' (average, minimum, + median, 25th percentile)""" + def __init__(self, data, representation=None): + if not representation: + representation = 'avg' # default algorithm is average + self._data = data + self._len = len(data) + if representation == 'avg': + self._rep = sum(self._data) / self._len + else: + self._data.sort() + if representation == 'min': + self._rep = self._data[0] + else: + # for percentiles, we use the value below which x% of values are + # found, which allows for better detection of quantum behaviors. + if representation == 'med': + x = int(round(0.5 * self._len + 0.5)) + elif representation == '25th': + x = int(round(0.25 * self._len + 0.5)) + else: + raise Exception("invalid representation algorithm %s!" % + representation) + self._rep = self._data[x - 1] + + def compute(self): + return self._rep + +def parse(settings, lines, representation='avg'): """Parses bench output into a useful data structure. ({str:str}, __iter__ -> str) -> [BenchDataPoint] - representative is one of 'avg', 'min', 'med' (average, mean, median).""" + representation should match one of those defined in class _ListAlgorithm.""" benches = [] current_bench = None @@ -85,26 +115,11 @@ def parse(settings, lines, representative='avg'): current_time_type = new_time.group(1) iters = [float(i) for i in new_time.group(2).strip().split(',')] - iters.sort() - iter_len = len(iters) - if representative == 'avg': - rep = sum(iters) / iter_len - elif 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 - , rep + , _ListAlgorithm(iters, representation).compute() , settings)) return benches -- cgit v1.2.3