| Index: tools/eval_gc_nvp.py | 
| diff --git a/tools/eval_gc_nvp.py b/tools/eval_gc_nvp.py | 
| index fcb6d8b9a2232ff24b04709d9520df0bd0b61755..25afe8e4f0a74a6aed84524e85ec6c66f0bfeb91 100755 | 
| --- a/tools/eval_gc_nvp.py | 
| +++ b/tools/eval_gc_nvp.py | 
| @@ -10,7 +10,7 @@ | 
| from argparse import ArgumentParser | 
| from copy import deepcopy | 
| from gc_nvp_common import split_nvp | 
| -from math import log | 
| +from math import ceil,log | 
| from sys import stdin | 
|  | 
|  | 
| @@ -74,11 +74,12 @@ class Histogram: | 
|  | 
|  | 
| class Category: | 
| -  def __init__(self, key, histogram, csv): | 
| +  def __init__(self, key, histogram, csv, percentiles): | 
| self.key = key | 
| self.values = [] | 
| self.histogram = histogram | 
| self.csv = csv | 
| +    self.percentiles = percentiles | 
|  | 
| def process_entry(self, entry): | 
| if self.key in entry: | 
| @@ -100,6 +101,16 @@ class Category: | 
| def empty(self): | 
| return len(self.values) == 0 | 
|  | 
| +  def _compute_percentiles(self): | 
| +    ret = [] | 
| +    if len(self.values) == 0: | 
| +      return ret | 
| +    sorted_values = sorted(self.values) | 
| +    for percentile in self.percentiles: | 
| +      index = int(ceil((len(self.values) - 1) * percentile / 100)) | 
| +      ret.append("  {0}%: {1}".format(percentile, sorted_values[index])) | 
| +    return ret | 
| + | 
| def __str__(self): | 
| if self.csv: | 
| ret = [self.key] | 
| @@ -118,6 +129,8 @@ class Category: | 
| ret.append("  avg: {0}".format(self.avg())) | 
| if self.histogram: | 
| ret.append(str(self.histogram)) | 
| +        if self.percentiles: | 
| +          ret.append("\n".join(self._compute_percentiles())) | 
| return "\n".join(ret) | 
|  | 
| def __repr__(self): | 
| @@ -160,6 +173,9 @@ def main(): | 
| help="rank keys by metric (default: no)") | 
| parser.add_argument('--csv', dest='csv', | 
| action='store_true', help='provide output as csv') | 
| +  parser.add_argument('--percentiles', dest='percentiles', | 
| +                      type=str, default="", | 
| +                      help='comma separated list of percentiles') | 
| args = parser.parse_args() | 
|  | 
| histogram = None | 
| @@ -171,7 +187,14 @@ def main(): | 
| bucket_trait = LinearBucket(args.linear_histogram_granularity) | 
| histogram = Histogram(bucket_trait, not args.histogram_omit_empty) | 
|  | 
| -  categories = [ Category(key, deepcopy(histogram), args.csv) | 
| +  percentiles = [] | 
| +  for percentile in args.percentiles.split(','): | 
| +    try: | 
| +      percentiles.append(float(percentile)) | 
| +    except ValueError: | 
| +      pass | 
| + | 
| +  categories = [ Category(key, deepcopy(histogram), args.csv, percentiles) | 
| for key in args.keys ] | 
|  | 
| while True: | 
|  |