On Sun, Aug 5, 2018 at 8:06 AM, Rhys Perry <pendingchao...@gmail.com> wrote: > v2: change compute_totals() to take an include instead of an exclude list > v2: show number of affected programs > v2: flip around the shared and affected statistics > > Signed-off-by: Rhys Perry <pendingchao...@gmail.com> > --- > nv-report.py | 35 +++++++++++++++++++++++++---------- > 1 file changed, 25 insertions(+), 10 deletions(-) > > diff --git a/nv-report.py b/nv-report.py > index 91007625ff..5049207c22 100644 > --- a/nv-report.py > +++ b/nv-report.py > @@ -35,6 +35,9 @@ class Stat(object): > return False > return True > > + def __ne__(self, other): > + return not (self == other) > + > class Stats(object): > > def __init__(self): > @@ -46,9 +49,9 @@ class Stats(object): > assert name not in self.stats, name > self.stats[name] = stat > > - def compute_totals(self): > + def compute_totals(self, stat_keys): > for attr in STATS: > - stats = self.stats.itervalues() > + stats = [self.stats[key] for key in stat_keys]
Your call, but making this a generator would avoid the copy. i.e. stats = (self.stats[key] for key in stat_keys) This would mean that the logic would run each time you iterate, but since you only iterate once... > setattr(self, attr, sum(getattr(stat, attr) for stat in stats)) Or alternatively, this could be ... sum(getattr(self.stats[key], attr) for key in stat_keys) which is probably the simplest option. Also come to think of it, this is the wrong abstraction. Ideally the caller would create a new Stats object with just the stats that need analysis. But we've already spent way too much time on this, so I don't really care. > > RE = { > @@ -80,14 +83,24 @@ def diff(a, b): > percentage = float('inf') > return "%d -> %d (%.2f%%)" % (a, b, percentage) > > -def print_summary(before, after): > - before.compute_totals() > - after.compute_totals() > +def print_summary(before, after, keys, only_affected): > + if only_affected: > + stat_keys = [key for key in keys if before.stats[key] != > after.stats[key]] > + else: > + stat_keys = keys > + before.compute_totals(stat_keys) > + after.compute_totals(stat_keys) > > - print "total instructions in shared programs :", diff(before.inst, > after.inst) > - print "total gprs used in shared programs :", diff(before.gpr, > after.gpr) > - print "total shared used in shared programs :", diff(before.shared, > after.shared) > - print "total local used in shared programs :", diff(before.local, > after.local) > + if only_affected: > + affected = len(stat_keys) > + programs = "%d (%.2f%%) affected programs" % (affected, > affected/float(len(keys))*100.0) > + else: > + programs = "shared programs" > + > + print "total instructions in %s :" % programs, diff(before.inst, > after.inst) > + print "total gprs used in %s :" % programs, diff(before.gpr, > after.gpr) > + print "total shared used in %s :" % programs, diff(before.shared, > after.shared) > + print "total local used in %s :" % programs, diff(before.local, > after.local) > > def print_helped_hurt(keys, before, after): > helped = Stat() > @@ -129,7 +142,9 @@ def main(argv): > continue > keys.add(key) > > - print_summary(before, after) > + print_summary(before, after, keys, True) > + print > + print_summary(before, after, keys, False) > print > print_helped_hurt(keys, before, after) > > -- > 2.14.4 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev