Index: tools/eval_gc_nvp.py |
diff --git a/tools/eval_gc_nvp.py b/tools/eval_gc_nvp.py |
index 5c7904e517caca251eb46ca3bea6f929f54c74b5..047a6dfae751108c874b2eab1410c3fcdb9d6da0 100755 |
--- a/tools/eval_gc_nvp.py |
+++ b/tools/eval_gc_nvp.py |
@@ -6,39 +6,57 @@ |
"""This script is used to analyze GCTracer's NVP output.""" |
+ |
from argparse import ArgumentParser |
+from copy import deepcopy |
from gc_nvp_common import split_nvp |
from sys import stdin |
+ |
class Histogram: |
- def __init__(self, values, granularity): |
- self.values = list(values) # copy over values |
+ def __init__(self, granularity, fill_empty): |
self.granularity = granularity |
+ self.histogram = {} |
+ self.fill_empty = fill_empty |
+ |
+ def add(self, key): |
+ index = int(key / self.granularity) |
+ if index not in self.histogram: |
+ self.histogram[index] = 0 |
+ self.histogram[index] += 1 |
def __str__(self): |
ret = [] |
- values = list(self.values) # copy over values |
- min_value = 0 |
- while len(values) > 0: |
- max_value = min_value + self.granularity |
- sub = [x for x in self.values if x >= min_value and x < max_value] |
+ 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 |
+ 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),len(sub))) |
- min_value += self.granularity |
- values = [x for x in values if x not in sub] |
+ str(min_value), str(max_value), self.histogram[key])) |
+ last = min_value |
return "\n".join(ret) |
class Category: |
- def __init__(self, key, histogram, granularity): |
+ def __init__(self, key, histogram): |
self.key = key |
self.values = [] |
self.histogram = histogram |
- self.granularity = granularity |
def process_entry(self, entry): |
if self.key in entry: |
self.values.append(float(entry[self.key])) |
+ if self.histogram: |
+ self.histogram.add(float(entry[self.key])) |
def __str__(self): |
ret = [self.key] |
@@ -48,7 +66,7 @@ class Category: |
ret.append(" max: {0}".format(max(self.values))) |
ret.append(" avg: {0}".format(sum(self.values) / len(self.values))) |
if self.histogram: |
- ret.append(str(Histogram(self.values, self.granularity))) |
+ ret.append(str(self.histogram)) |
return "\n".join(ret) |
@@ -59,6 +77,9 @@ def main(): |
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', |
@@ -67,9 +88,14 @@ def main(): |
action='store_false', |
help='do not print histogram') |
parser.set_defaults(histogram=True) |
+ parser.set_defaults(histogram_print_empty=True) |
args = parser.parse_args() |
- categories = [ Category(key, args.histogram, args.histogram_granularity) |
+ histogram = None |
+ if args.histogram: |
+ histogram = Histogram(args.histogram_granularity, args.histogram_print_empty) |
+ |
+ categories = [ Category(key, deepcopy(histogram)) |
for key in args.keys ] |
while True: |