Index: tools/eval_gc_nvp.py |
diff --git a/tools/eval_gc_nvp.py b/tools/eval_gc_nvp.py |
index 047a6dfae751108c874b2eab1410c3fcdb9d6da0..8a9b8e70728cc58c53970cc4f8184d18a486a543 100755 |
--- a/tools/eval_gc_nvp.py |
+++ b/tools/eval_gc_nvp.py |
@@ -10,17 +10,47 @@ |
from argparse import ArgumentParser |
from copy import deepcopy |
from gc_nvp_common import split_nvp |
+from math import log |
from sys import stdin |
-class Histogram: |
- def __init__(self, granularity, fill_empty): |
+class LinearBucket: |
+ def __init__(self, granularity): |
self.granularity = granularity |
+ |
+ def value_to_bucket(self, value): |
+ return int(value / self.granularity) |
+ |
+ def bucket_to_range(self, bucket): |
+ return (bucket * self.granularity, (bucket + 1) * self.granularity) |
+ |
+ |
+class Log2Bucket: |
+ def __init__(self, start): |
+ self.start = int(log(start, 2)) - 1 |
+ |
+ def value_to_bucket(self, value): |
+ index = int(log(value, 2)) |
+ index -= self.start |
+ if index < 0: |
+ index = 0 |
+ return index |
+ |
+ def bucket_to_range(self, bucket): |
+ if bucket == 0: |
+ return (0, 2 ** (self.start + 1)) |
+ bucket += self.start |
+ return (2 ** bucket, 2 ** (bucket + 1)) |
+ |
+ |
+class Histogram: |
+ def __init__(self, bucket_trait, fill_empty): |
self.histogram = {} |
self.fill_empty = fill_empty |
+ self.bucket_trait = bucket_trait |
def add(self, key): |
- index = int(key / self.granularity) |
+ index = self.bucket_trait.value_to_bucket(key) |
if index not in self.histogram: |
self.histogram[index] = 0 |
self.histogram[index] += 1 |
@@ -29,20 +59,17 @@ class Histogram: |
ret = [] |
keys = self.histogram.keys() |
keys.sort() |
- last = -self.granularity |
- for key in keys: |
- min_value = key * self.granularity |
- max_value = min_value + self.granularity |
- |
- if self.fill_empty: |
- while (last + self.granularity) != min_value: |
- last += self.granularity |
+ last = keys[len(keys) - 1] |
+ for i in range(0, last + 1): |
+ (min_value, max_value) = self.bucket_trait.bucket_to_range(i) |
+ if i == keys[0]: |
+ keys.pop(0) |
+ ret.append(" [{0},{1}[: {2}".format( |
+ str(min_value), str(max_value), self.histogram[i])) |
+ else: |
+ if self.fill_empty: |
ret.append(" [{0},{1}[: {2}".format( |
- str(last), str(last + self.granularity), 0)) |
- |
- ret.append(" [{0},{1}[: {2}".format( |
- str(min_value), str(max_value), self.histogram[key])) |
- last = min_value |
+ str(min_value), str(max_value), 0)) |
return "\n".join(ret) |
@@ -73,27 +100,37 @@ class Category: |
def main(): |
parser = ArgumentParser(description="Process GCTracer's NVP output") |
parser.add_argument('keys', metavar='KEY', type=str, nargs='+', |
- help='the keys (names) to process') |
- parser.add_argument('--histogram-granularity', metavar='GRANULARITY', |
- type=int, nargs='?', default=5, |
- help='histogram granularity (default: 5)') |
- parser.add_argument('--no-histogram-print-empty', dest='histogram_print_empty', |
- action='store_false', |
- help='print empty histogram buckets') |
- feature_parser = parser.add_mutually_exclusive_group(required=False) |
- feature_parser.add_argument('--histogram', dest='histogram', |
- action='store_true', |
- help='print histogram') |
- feature_parser.add_argument('--no-histogram', dest='histogram', |
- action='store_false', |
- help='do not print histogram') |
+ help='the keys of NVPs to process') |
+ parser.add_argument('--histogram-type', metavar='<linear|log2>', |
+ type=str, nargs='?', default="linear", |
+ help='histogram type to use (default: linear)') |
+ linear_group = parser.add_argument_group('linear histogram specific') |
+ linear_group.add_argument('--linear-histogram-granularity', |
+ metavar='GRANULARITY', type=int, nargs='?', |
+ default=5, |
+ help='histogram granularity (default: 5)') |
+ log2_group = parser.add_argument_group('log2 histogram specific') |
+ log2_group.add_argument('--log2-histogram-init-bucket', metavar='START', |
+ type=int, nargs='?', default=64, |
+ help='initial buck size (default: 64)') |
+ parser.add_argument('--histogram-omit-empty-buckets', |
+ dest='histogram_omit_empty', |
+ action='store_true', |
+ help='omit empty histogram buckets') |
+ parser.add_argument('--no-histogram', dest='histogram', |
+ action='store_false', help='do not print histogram') |
parser.set_defaults(histogram=True) |
- parser.set_defaults(histogram_print_empty=True) |
+ parser.set_defaults(histogram_omit_empty=False) |
args = parser.parse_args() |
histogram = None |
if args.histogram: |
- histogram = Histogram(args.histogram_granularity, args.histogram_print_empty) |
+ bucket_trait = None |
+ if args.histogram_type == "log2": |
+ bucket_trait = Log2Bucket(args.log2_histogram_init_bucket) |
+ else: |
+ bucket_trait = LinearBucket(args.linear_histogram_granularity) |
+ histogram = Histogram(bucket_trait, not args.histogram_omit_empty) |
categories = [ Category(key, deepcopy(histogram)) |
for key in args.keys ] |