OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # | 2 # |
3 # Copyright 2015 the V8 project authors. All rights reserved. | 3 # Copyright 2015 the V8 project authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 """This script is used to analyze GCTracer's NVP output.""" | 7 """This script is used to analyze GCTracer's NVP output.""" |
8 | 8 |
9 | 9 |
10 from argparse import ArgumentParser | 10 from argparse import ArgumentParser |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 ret.append(" [{0},{1}[: {2}".format( | 67 ret.append(" [{0},{1}[: {2}".format( |
68 str(min_value), str(max_value), self.histogram[i])) | 68 str(min_value), str(max_value), self.histogram[i])) |
69 else: | 69 else: |
70 if self.fill_empty: | 70 if self.fill_empty: |
71 ret.append(" [{0},{1}[: {2}".format( | 71 ret.append(" [{0},{1}[: {2}".format( |
72 str(min_value), str(max_value), 0)) | 72 str(min_value), str(max_value), 0)) |
73 return "\n".join(ret) | 73 return "\n".join(ret) |
74 | 74 |
75 | 75 |
76 class Category: | 76 class Category: |
77 def __init__(self, key, histogram): | 77 def __init__(self, key, histogram, csv): |
78 self.key = key | 78 self.key = key |
79 self.values = [] | 79 self.values = [] |
80 self.histogram = histogram | 80 self.histogram = histogram |
| 81 self.csv = csv |
81 | 82 |
82 def process_entry(self, entry): | 83 def process_entry(self, entry): |
83 if self.key in entry: | 84 if self.key in entry: |
84 self.values.append(float(entry[self.key])) | 85 self.values.append(float(entry[self.key])) |
85 if self.histogram: | 86 if self.histogram: |
86 self.histogram.add(float(entry[self.key])) | 87 self.histogram.add(float(entry[self.key])) |
87 | 88 |
88 def min(self): | 89 def min(self): |
89 return min(self.values) | 90 return min(self.values) |
90 | 91 |
91 def max(self): | 92 def max(self): |
92 return max(self.values) | 93 return max(self.values) |
93 | 94 |
94 def avg(self): | 95 def avg(self): |
| 96 if len(self.values) == 0: |
| 97 return 0.0 |
95 return sum(self.values) / len(self.values) | 98 return sum(self.values) / len(self.values) |
96 | 99 |
97 def __str__(self): | 100 def __str__(self): |
98 ret = [self.key] | 101 if self.csv: |
99 ret.append(" len: {0}".format(len(self.values))) | 102 ret = [self.key] |
100 if len(self.values) > 0: | 103 ret.append(len(self.values)) |
101 ret.append(" min: {0}".format(min(self.values))) | 104 ret.append(self.min()) |
102 ret.append(" max: {0}".format(max(self.values))) | 105 ret.append(self.max()) |
103 ret.append(" avg: {0}".format(sum(self.values) / len(self.values))) | 106 ret.append(self.avg()) |
104 if self.histogram: | 107 ret = [str(x) for x in ret] |
105 ret.append(str(self.histogram)) | 108 return ",".join(ret) |
106 return "\n".join(ret) | 109 else: |
| 110 ret = [self.key] |
| 111 ret.append(" len: {0}".format(len(self.values))) |
| 112 if len(self.values) > 0: |
| 113 ret.append(" min: {0}".format(self.min())) |
| 114 ret.append(" max: {0}".format(self.max())) |
| 115 ret.append(" avg: {0}".format(self.avg())) |
| 116 if self.histogram: |
| 117 ret.append(str(self.histogram)) |
| 118 return "\n".join(ret) |
107 | 119 |
108 def __repr__(self): | 120 def __repr__(self): |
109 return "<Category: {0}>".format(self.key) | 121 return "<Category: {0}>".format(self.key) |
110 | 122 |
111 | 123 |
112 def make_key_func(cmp_metric): | 124 def make_key_func(cmp_metric): |
113 def key_func(a): | 125 def key_func(a): |
114 return getattr(a, cmp_metric)() | 126 return getattr(a, cmp_metric)() |
115 return key_func | 127 return key_func |
116 | 128 |
(...skipping 19 matching lines...) Expand all Loading... |
136 action='store_true', | 148 action='store_true', |
137 help='omit empty histogram buckets') | 149 help='omit empty histogram buckets') |
138 parser.add_argument('--no-histogram', dest='histogram', | 150 parser.add_argument('--no-histogram', dest='histogram', |
139 action='store_false', help='do not print histogram') | 151 action='store_false', help='do not print histogram') |
140 parser.set_defaults(histogram=True) | 152 parser.set_defaults(histogram=True) |
141 parser.set_defaults(histogram_omit_empty=False) | 153 parser.set_defaults(histogram_omit_empty=False) |
142 parser.add_argument('--rank', metavar='<no|min|max|avg>', | 154 parser.add_argument('--rank', metavar='<no|min|max|avg>', |
143 type=str, nargs='?', | 155 type=str, nargs='?', |
144 default="no", | 156 default="no", |
145 help="rank keys by metric (default: no)") | 157 help="rank keys by metric (default: no)") |
| 158 parser.add_argument('--csv', dest='csv', |
| 159 action='store_true', help='provide output as csv') |
146 args = parser.parse_args() | 160 args = parser.parse_args() |
147 | 161 |
148 histogram = None | 162 histogram = None |
149 if args.histogram: | 163 if args.histogram: |
150 bucket_trait = None | 164 bucket_trait = None |
151 if args.histogram_type == "log2": | 165 if args.histogram_type == "log2": |
152 bucket_trait = Log2Bucket(args.log2_histogram_init_bucket) | 166 bucket_trait = Log2Bucket(args.log2_histogram_init_bucket) |
153 else: | 167 else: |
154 bucket_trait = LinearBucket(args.linear_histogram_granularity) | 168 bucket_trait = LinearBucket(args.linear_histogram_granularity) |
155 histogram = Histogram(bucket_trait, not args.histogram_omit_empty) | 169 histogram = Histogram(bucket_trait, not args.histogram_omit_empty) |
156 | 170 |
157 categories = [ Category(key, deepcopy(histogram)) | 171 categories = [ Category(key, deepcopy(histogram), args.csv) |
158 for key in args.keys ] | 172 for key in args.keys ] |
159 | 173 |
160 while True: | 174 while True: |
161 line = stdin.readline() | 175 line = stdin.readline() |
162 if not line: | 176 if not line: |
163 break | 177 break |
164 obj = split_nvp(line) | 178 obj = split_nvp(line) |
165 for category in categories: | 179 for category in categories: |
166 category.process_entry(obj) | 180 category.process_entry(obj) |
167 | 181 |
168 if args.rank != "no": | 182 if args.rank != "no": |
169 categories = sorted(categories, key=make_key_func(args.rank), reverse=True) | 183 categories = sorted(categories, key=make_key_func(args.rank), reverse=True) |
170 | 184 |
171 for category in categories: | 185 for category in categories: |
172 print(category) | 186 print(category) |
173 | 187 |
174 | 188 |
175 if __name__ == '__main__': | 189 if __name__ == '__main__': |
176 main() | 190 main() |
OLD | NEW |