Index: tools/gc-nvp-trace-processor.py |
diff --git a/tools/gc-nvp-trace-processor.py b/tools/gc-nvp-trace-processor.py |
old mode 100644 |
new mode 100755 |
index 3721b01823d67b6df0b38d7714ff45feab5c7a40..44aa0a25fc2371fd45c6143f8789377b0cbc63b2 |
--- a/tools/gc-nvp-trace-processor.py |
+++ b/tools/gc-nvp-trace-processor.py |
@@ -47,8 +47,12 @@ def flatten(l): |
def split_nvp(s): |
t = {} |
- for m in re.finditer(r"(\w+)=(-?\d+)", s): |
- t[m.group(1)] = int(m.group(2)) |
+ for (name, value) in re.findall(r"(\w+)=([-\w]+)", s): |
+ try: |
+ t[name] = int(value) |
+ except ValueError: |
+ t[name] = value |
+ |
return t |
def parse_gc_trace(input): |
@@ -211,6 +215,9 @@ def plot_all(plots, trace, prefix): |
def reclaimed_bytes(row): |
return row['total_size_before'] - row['total_size_after'] |
+def other_scope(r): |
+ return r['pause'] - r['mark'] - r['sweep'] - r['compact'] - r['flushcode'] |
+ |
plots = [ |
[ |
Set('style fill solid 0.5 noborder'), |
@@ -219,9 +226,8 @@ plots = [ |
Plot(Item('Marking', 'mark', lc = 'purple'), |
Item('Sweep', 'sweep', lc = 'blue'), |
Item('Compaction', 'compact', lc = 'red'), |
- Item('Other', |
- lambda r: r['pause'] - r['mark'] - r['sweep'] - r['compact'], |
- lc = 'grey')) |
+ Item('Flush Code', 'flushcode', lc = 'yellow'), |
+ Item('Other', other_scope, lc = 'grey')) |
], |
[ |
Set('style histogram rowstacked'), |
@@ -256,19 +262,48 @@ plots = [ |
], |
] |
+def calc_total(trace, field): |
+ return reduce(lambda t,r: t + r[field], trace, 0) |
+ |
+def calc_max(trace, field): |
+ return reduce(lambda t,r: max(t, r[field]), trace, 0) |
+ |
def process_trace(filename): |
trace = parse_gc_trace(filename) |
- total_gc = reduce(lambda t,r: t + r['pause'], trace, 0) |
- max_gc = reduce(lambda t,r: max(t, r['pause']), trace, 0) |
+ total_gc = calc_total(trace, 'pause') |
+ max_gc = calc_max(trace, 'pause') |
avg_gc = total_gc / len(trace) |
+ total_sweep = calc_total(trace, 'sweep') |
+ max_sweep = calc_max(trace, 'sweep') |
+ |
+ total_mark = calc_total(trace, 'mark') |
+ max_mark = calc_max(trace, 'mark') |
+ |
+ scavenges = filter(lambda r: r['gc'] == 's', trace) |
+ total_scavenge = calc_total(scavenges, 'pause') |
+ max_scavenge = calc_max(scavenges, 'pause') |
+ avg_scavenge = total_scavenge / len(scavenges) |
+ |
charts = plot_all(plots, trace, filename) |
with open(filename + '.html', 'w') as out: |
out.write('<html><body>') |
+ out.write('<table><tr><td>') |
out.write('Total in GC: <b>%d</b><br/>' % total_gc) |
out.write('Max in GC: <b>%d</b><br/>' % max_gc) |
out.write('Avg in GC: <b>%d</b><br/>' % avg_gc) |
+ out.write('</td><td>') |
+ out.write('Total in Scavenge: <b>%d</b><br/>' % total_scavenge) |
+ out.write('Max in Scavenge: <b>%d</b><br/>' % max_scavenge) |
+ out.write('Avg in Scavenge: <b>%d</b><br/>' % avg_scavenge) |
+ out.write('</td><td>') |
+ out.write('Total in Sweep: <b>%d</b><br/>' % total_sweep) |
+ out.write('Max in Sweep: <b>%d</b><br/>' % max_sweep) |
+ out.write('</td><td>') |
+ out.write('Total in Mark: <b>%d</b><br/>' % total_mark) |
+ out.write('Max in Mark: <b>%d</b><br/>' % max_mark) |
+ out.write('</td></tr></table>') |
for chart in charts: |
out.write('<img src="%s">' % chart) |
out.write('</body></html>') |