From 626b70eb3526d848e2f1741f8b2384c518d2067b Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Fri, 9 Dec 2016 11:00:16 +0100
Subject: [PATCH] Enhance analyze_brprob script
contrib/ChangeLog:
2016-12-09 Martin Liska <mliska@suse.cz>
* analyze_brprob.py: Add new column to output and new sorting
option. Fix coding style to not exceed 80 characters.
* analyze_brprob_spec.py: Add new sorting
option. Fix coding style to not exceed 80 characters.
---
contrib/analyze_brprob.py | 39 ++++++++++++++++++++++++++++-----------
contrib/analyze_brprob_spec.py | 9 ++++++---
2 files changed, 34 insertions(+), 14 deletions(-)
@@ -69,7 +69,8 @@ import argparse
from math import *
-counter_aggregates = set(['combined', 'first match', 'DS theory', 'no prediction'])
+counter_aggregates = set(['combined', 'first match', 'DS theory',
+ 'no prediction'])
def percentage(a, b):
return 100.0 * a / b
@@ -93,12 +94,16 @@ class Summary:
def __init__(self, name):
self.name = name
self.branches = 0
+ self.successfull_branches = 0
self.count = 0
self.hits = 0
self.fits = 0
def get_hitrate(self):
- return self.hits / self.count
+ return 100.0 * self.hits / self.count
+
+ def get_branch_hitrate(self):
+ return 100.0 * self.successfull_branches / self.branches
def count_formatted(self):
v = self.count
@@ -109,10 +114,11 @@ class Summary:
return "%.1f%s" % (v, 'Y')
def print(self, branches_max, count_max):
- print('%-40s %8i %5.1f%% %6.2f%% / %6.2f%% %14i %8s %5.1f%%' %
+ print('%-40s %8i %5.1f%% %11.2f%% %7.2f%% / %6.2f%% %14i %8s %5.1f%%' %
(self.name, self.branches,
percentage(self.branches, branches_max),
- percentage(self.hits, self.count),
+ self.get_branch_hitrate(),
+ self.get_hitrate(),
percentage(self.fits, self.count),
self.count, self.count_formatted(),
percentage(self.count, count_max)))
@@ -129,11 +135,16 @@ class Profile:
s = self.heuristics[name]
s.branches += 1
+
s.count += count
if prediction < 50:
hits = count - hits
+ remaining = count - hits
+ if hits >= remaining:
+ s.successfull_branches += 1
+
s.hits += hits
- s.fits += max(hits, count - hits)
+ s.fits += max(hits, remaining)
def add_loop_niter(self, niter):
if niter > 0:
@@ -150,15 +161,18 @@ class Profile:
branches_max = self.branches_max()
sorter = lambda x: x.branches
- if sorting == 'hitrate':
+ if sorting == 'branch-hitrate':
+ sorter = lambda x: x.get_branch_hitrate()
+ elif sorting == 'hitrate':
sorter = lambda x: x.get_hitrate()
elif sorting == 'coverage':
sorter = lambda x: x.count
elif sorting == 'name':
sorter = lambda x: x.name.lower()
- print('%-40s %8s %6s %-16s %14s %8s %6s' % (group_name,
- 'BRANCHES', '(REL)', 'HITRATE', 'COVERAGE', 'COVERAGE', '(REL)'))
+ print('%-40s %8s %6s %12s %18s %14s %8s %6s' %
+ ('HEURISTICS', 'BRANCHES', '(REL)',
+ 'BR. HITRATE', 'HITRATE', 'COVERAGE', 'COVERAGE', '(REL)'))
for h in sorted(heuristics, key = sorter):
h.print(branches_max, count_max)
@@ -183,12 +197,15 @@ class Profile:
print(' median # of iter: %.2f' % median(self.niter_vector))
for v in [1, 5, 10, 20, 30]:
cut = 0.01 * v
- print(' avg. (%d%% cutoff) # of iter: %.2f' % (v, average_cutoff(self.niter_vector, cut)))
+ print(' avg. (%d%% cutoff) # of iter: %.2f'
+ % (v, average_cutoff(self.niter_vector, cut)))
parser = argparse.ArgumentParser()
-parser.add_argument('dump_file', metavar = 'dump_file', help = 'IPA profile dump file')
+parser.add_argument('dump_file', metavar = 'dump_file',
+ help = 'IPA profile dump file')
parser.add_argument('-s', '--sorting', dest = 'sorting',
- choices = ['branches', 'hitrate', 'coverage', 'name'], default = 'branches')
+ choices = ['branches', 'branch-hitrate', 'hitrate', 'coverage', 'name'],
+ default = 'branches')
args = parser.parse_args()
@@ -25,9 +25,11 @@ import argparse
script_location = os.path.realpath(__file__)
parser = argparse.ArgumentParser()
-parser.add_argument('location', metavar = 'dump_file', help = 'Location with SPEC benchmarks')
+parser.add_argument('location', metavar = 'dump_file',
+ help = 'Location with SPEC benchmarks')
parser.add_argument('-s', '--sorting', dest = 'sorting',
- choices = ['branches', 'hitrate', 'coverage', 'name'], default = 'branches')
+ choices = ['branches', 'branch-hitrate', 'hitrate', 'coverage', 'name'],
+ default = 'branches')
args = parser.parse_args()
@@ -52,7 +54,8 @@ for b in sorted(benchmarks):
print()
print(b)
sys.stdout.flush()
- p = [os.path.join(os.path.dirname(script_location), 'analyze_brprob.py'), temp.name, '--sorting', args.sorting]
+ p = [os.path.join(os.path.dirname(script_location), 'analyze_brprob.py'),
+ temp.name, '--sorting', args.sorting]
p = subprocess.check_call(p)
sys.stdout.flush()
--
2.10.2