scripts: csv.py: Added -H/--hlabel and --tlabel

These are useful for customizing the table renderer's header and total
labels:

  ./scripts/csv.py test.csv -ba -fc \
      -Hc='c(MiB/s)' \
      --tlabel='wow so many (%(c)s)'
  a                   c(MiB/s)
  x                          6
  wow so many (6)            6

In theory header labels could be controlled by the field names
themselves, but our use of Python's namedtuples internal is quite
limiting.

The immediate use case is -Hprobe=bench+probe in the bench-related
rules, but it may also be useful for adding units such as in the above
example.

---

I considered adding these to all csv scripts, but decided that was too
much. punescape modifiers are probably a good line for what should be
limited to csv.py.
This commit is contained in:
Christopher Haster
2026-02-06 19:05:22 -06:00
parent 8bbddd3500
commit 2cf87dedb4
10 changed files with 219 additions and 139 deletions
+5
View File
@@ -609,6 +609,7 @@ bench-marks: $(BENCH_CSV)
-ft='max(float(bench_simtime)/1.0e9)' \ -ft='max(float(bench_simtime)/1.0e9)' \
-o-) \ -o-) \
-bprobe \ -bprobe \
-Hprobe=bench+probe \
-fn \ -fn \
-ft \ -ft \
-fthroughput='avg(float(n) / max(t, 1.0e-9))' \ -fthroughput='avg(float(n) / max(t, 1.0e-9))' \
@@ -641,6 +642,7 @@ bench-marks-diff: $(BENCH_CSV)
-ft='max(float(bench_simtime)/1.0e9)' \ -ft='max(float(bench_simtime)/1.0e9)' \
-o-) \ -o-) \
-bprobe \ -bprobe \
-Hprobe=bench+probe \
-fthroughput='avg(float(n) / max(t, 1.0e-9))' \ -fthroughput='avg(float(n) / max(t, 1.0e-9))' \
$(SUMMARYFLAGS)) $(SUMMARYFLAGS))
@@ -660,6 +662,7 @@ bench-bottlenecks: $(BENCH_CSV)
-fruntime='max(bench_runtime)' \ -fruntime='max(bench_runtime)' \
-o-) \ -o-) \
-bprobe \ -bprobe \
-Hprobe=bench+probe \
-fn \ -fn \
-ft \ -ft \
-fruntime \ -fruntime \
@@ -674,6 +677,7 @@ bench-ops: $(BENCH_CSV)
commit,namelookup,$\ commit,namelookup,$\
write,stat,read \ write,stat,read \
-bprobe='%(case)s+%(probe)s' \ -bprobe='%(case)s+%(probe)s' \
-Hprobe=bench+probe \
-Fi='min(enumerate())' \ -Fi='min(enumerate())' \
-freads='bench_reads' \ -freads='bench_reads' \
-fprogs='bench_progs' \ -fprogs='bench_progs' \
@@ -692,6 +696,7 @@ bench-widths: $(BENCH_CSV)
commit,namelookup,$\ commit,namelookup,$\
write,stat,read \ write,stat,read \
-bprobe='%(case)s+%(probe)s' \ -bprobe='%(case)s+%(probe)s' \
-Hprobe=bench+probe \
-Fi='min(enumerate())' \ -Fi='min(enumerate())' \
-freaded="avg(saturate(ffrac( \ -freaded="avg(saturate(ffrac( \
float(bench_readed)/float(bench_reads), \ float(bench_readed)/float(bench_reads), \
+18 -13
View File
@@ -599,13 +599,15 @@ def fold(Result, results, *,
def table(Result, results, diff_results=None, *, def table(Result, results, diff_results=None, *,
by=None, by=None,
fields=None, fields=None,
hidden=None,
sort=None, sort=None,
labels=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, percent=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None,
tlabel=None,
no_header=False, no_header=False,
small_header=False, small_header=False,
no_total=False, no_total=False,
@@ -662,7 +664,8 @@ def table(Result, results, diff_results=None, *,
# header # header
if not no_header: if not no_header:
header = ['%s%s' % ( header = ['%s%s' % (
','.join(labels if labels is not None else by), ','.join((hlabel(k) if hlabel is not None else k)
for k in by if hidden is None or k not in hidden),
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
@@ -670,14 +673,14 @@ def table(Result, results, diff_results=None, *,
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent:
for k in fields: for k in fields:
header.append(k) header.append(hlabel(k) if hlabel is not None else k)
else: else:
for k in fields: for k in fields:
header.append('o'+k) header.append('o'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('n'+k) header.append('n'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('d'+k) header.append('d'+(hlabel(k) if hlabel is not None else k))
lines.append(header) lines.append(header)
# delete these to try to catch typos below, we need to rebuild # delete these to try to catch typos below, we need to rebuild
@@ -822,20 +825,20 @@ def table(Result, results, diff_results=None, *,
# find comparable results # find comparable results
diff_r = diff_table_.get(n) diff_r = diff_table_.get(n)
# figure out a good label # figure out a good name
if labels is not None: if hidden is not None:
label = next( name = next(
','.join(str(getattr(r_, k) ','.join(str(getattr(r_, k)
if getattr(r_, k) is not None if getattr(r_, k) is not None
else '') else '')
for k in labels) for k in by if k not in hidden)
for r_ in [r, diff_r] for r_ in [r, diff_r]
if r_ is not None) if r_ is not None)
else: else:
label = n name = n
# build line # build line
line = table_entry(label, r, diff_r) line = table_entry(name, r, diff_r)
# add prefixes # add prefixes
line = [x if isinstance(x, tuple) else (x, []) for x in line] line = [x if isinstance(x, tuple) else (x, []) for x in line]
@@ -867,7 +870,9 @@ def table(Result, results, diff_results=None, *,
else: else:
diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) diff_r = next(iter(fold(Result, diff_results, by=[])), Result())
lines.append(table_entry( lines.append(table_entry(
'TOTAL' if not small_total else '', '' if small_total
else tlabel(r) if tlabel is not None
else 'TOTAL',
r, diff_r)) r, diff_r))
# homogenize # homogenize
+18 -13
View File
@@ -468,13 +468,15 @@ def fold(Result, results, *,
def table(Result, results, diff_results=None, *, def table(Result, results, diff_results=None, *,
by=None, by=None,
fields=None, fields=None,
hidden=None,
sort=None, sort=None,
labels=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, percent=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None,
tlabel=None,
no_header=False, no_header=False,
small_header=False, small_header=False,
no_total=False, no_total=False,
@@ -531,7 +533,8 @@ def table(Result, results, diff_results=None, *,
# header # header
if not no_header: if not no_header:
header = ['%s%s' % ( header = ['%s%s' % (
','.join(labels if labels is not None else by), ','.join((hlabel(k) if hlabel is not None else k)
for k in by if hidden is None or k not in hidden),
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
@@ -539,14 +542,14 @@ def table(Result, results, diff_results=None, *,
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent:
for k in fields: for k in fields:
header.append(k) header.append(hlabel(k) if hlabel is not None else k)
else: else:
for k in fields: for k in fields:
header.append('o'+k) header.append('o'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('n'+k) header.append('n'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('d'+k) header.append('d'+(hlabel(k) if hlabel is not None else k))
lines.append(header) lines.append(header)
# delete these to try to catch typos below, we need to rebuild # delete these to try to catch typos below, we need to rebuild
@@ -691,20 +694,20 @@ def table(Result, results, diff_results=None, *,
# find comparable results # find comparable results
diff_r = diff_table_.get(n) diff_r = diff_table_.get(n)
# figure out a good label # figure out a good name
if labels is not None: if hidden is not None:
label = next( name = next(
','.join(str(getattr(r_, k) ','.join(str(getattr(r_, k)
if getattr(r_, k) is not None if getattr(r_, k) is not None
else '') else '')
for k in labels) for k in by if k not in hidden)
for r_ in [r, diff_r] for r_ in [r, diff_r]
if r_ is not None) if r_ is not None)
else: else:
label = n name = n
# build line # build line
line = table_entry(label, r, diff_r) line = table_entry(name, r, diff_r)
# add prefixes # add prefixes
line = [x if isinstance(x, tuple) else (x, []) for x in line] line = [x if isinstance(x, tuple) else (x, []) for x in line]
@@ -736,7 +739,9 @@ def table(Result, results, diff_results=None, *,
else: else:
diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) diff_r = next(iter(fold(Result, diff_results, by=[])), Result())
lines.append(table_entry( lines.append(table_entry(
'TOTAL' if not small_total else '', '' if small_total
else tlabel(r) if tlabel is not None
else 'TOTAL',
r, diff_r)) r, diff_r))
# homogenize # homogenize
+55 -20
View File
@@ -1776,6 +1776,15 @@ def punescape(s, attrs=None):
return re.sub(pattern, unescape, s) return re.sub(pattern, unescape, s)
class PunescapeGetattr:
def __init__(self, r):
self.r = r
def __getitem__(self, k):
try:
return getattr(self.r, k)
except AttributeError:
raise KeyError(k)
def punescape_help(): def punescape_help():
print('mods:') print('mods:')
print(' %-21s %s' % ('%%', 'A literal % character')) print(' %-21s %s' % ('%%', 'A literal % character'))
@@ -1916,7 +1925,7 @@ def compile(fields_, results,
for k, reverse in it.chain(sort or [], hot or []): for k, reverse in it.chain(sort or [], hot or []):
# this defaults to typechecking sort/hot fields, which is # this defaults to typechecking sort/hot fields, which is
# probably safer, if you really want to sort by strings you # probably safer, if you really want to sort by strings you
# can use --by + --label to create hidden by fields # can use -B/--hidden-by to create hidden by fields
if k and k not in by and k not in fields: if k and k not in by and k not in fields:
fields.append(k) fields.append(k)
# make sure all expr targets are in fields so they get typechecked # make sure all expr targets are in fields so they get typechecked
@@ -2229,13 +2238,15 @@ def hotify(Result, results, *,
def table(Result, results, diff_results=None, *, def table(Result, results, diff_results=None, *,
by=None, by=None,
fields=None, fields=None,
hidden=None,
sort=None, sort=None,
labels=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, percent=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None,
tlabel=None,
no_header=False, no_header=False,
small_header=False, small_header=False,
no_total=False, no_total=False,
@@ -2292,7 +2303,8 @@ def table(Result, results, diff_results=None, *,
# header # header
if not no_header: if not no_header:
header = ['%s%s' % ( header = ['%s%s' % (
','.join(labels if labels is not None else by), ','.join((hlabel(k) if hlabel is not None else k)
for k in by if hidden is None or k not in hidden),
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
@@ -2300,14 +2312,14 @@ def table(Result, results, diff_results=None, *,
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent:
for k in fields: for k in fields:
header.append(k) header.append(hlabel(k) if hlabel is not None else k)
else: else:
for k in fields: for k in fields:
header.append('o'+k) header.append('o'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('n'+k) header.append('n'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('d'+k) header.append('d'+(hlabel(k) if hlabel is not None else k))
lines.append(header) lines.append(header)
# delete these to try to catch typos below, we need to rebuild # delete these to try to catch typos below, we need to rebuild
@@ -2452,20 +2464,20 @@ def table(Result, results, diff_results=None, *,
# find comparable results # find comparable results
diff_r = diff_table_.get(n) diff_r = diff_table_.get(n)
# figure out a good label # figure out a good name
if labels is not None: if hidden is not None:
label = next( name = next(
','.join(str(getattr(r_, k) ','.join(str(getattr(r_, k)
if getattr(r_, k) is not None if getattr(r_, k) is not None
else '') else '')
for k in labels) for k in by if k not in hidden)
for r_ in [r, diff_r] for r_ in [r, diff_r]
if r_ is not None) if r_ is not None)
else: else:
label = n name = n
# build line # build line
line = table_entry(label, r, diff_r) line = table_entry(name, r, diff_r)
# add prefixes # add prefixes
line = [x if isinstance(x, tuple) else (x, []) for x in line] line = [x if isinstance(x, tuple) else (x, []) for x in line]
@@ -2497,7 +2509,9 @@ def table(Result, results, diff_results=None, *,
else: else:
diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) diff_r = next(iter(fold(Result, diff_results, by=[])), Result())
lines.append(table_entry( lines.append(table_entry(
'TOTAL' if not small_total else '', '' if small_total
else tlabel(r) if tlabel is not None
else 'TOTAL',
r, diff_r)) r, diff_r))
# homogenize # homogenize
@@ -2911,6 +2925,8 @@ def main(csv_paths, *,
children=None, children=None,
hot=None, hot=None,
notes=None, notes=None,
hlabels=None,
tlabel=None,
**args): **args):
# show mod help text? # show mod help text?
if args.get('help_mods'): if args.get('help_mods'):
@@ -3000,14 +3016,13 @@ def main(csv_paths, *,
((k, v) for (k, v), reverse in (hot or []))) ((k, v) for (k, v), reverse in (hot or [])))
if v is not None] if v is not None]
# figure out labels/by/fields # figure out by/hidden/fields
labels__ = None
by__ = [] by__ = []
hidden__ = None
fields__ = [] fields__ = []
if by is not None and any(not hidden for (k, v), hidden in by):
labels__ = [k for (k, v), hidden in by if not hidden]
if by is not None: if by is not None:
by__ = [k for (k, v), hidden in by] by__ = [k for (k, v), hidden in by]
hidden__ = {k for (k, v), hidden in by if hidden}
if fields is not None: if fields is not None:
fields__ = [k for (k, v), hidden in fields fields__ = [k for (k, v), hidden in fields
if not hidden if not hidden
@@ -3047,8 +3062,8 @@ def main(csv_paths, *,
and not any(k == k_ and not any(k == k_
for _, expr in exprs for _, expr in exprs
for k_ in expr.fields())) for k_ in expr.fields()))
labels = labels__
by = by__ by = by__
hidden = hidden__
fields = fields__ fields = fields__
# filter exprs from sort/hot # filter exprs from sort/hot
@@ -3145,9 +3160,15 @@ def main(csv_paths, *,
table(Result, results, diff_results, table(Result, results, diff_results,
by=by, by=by,
fields=fields, fields=fields,
hidden=hidden,
sort=sort, sort=sort,
labels=labels,
depth=depth, depth=depth,
hlabel=(lambda hlabels_: (lambda k:
punescape(hlabels_[k]) if k in hlabels_ else k)
)(dict(hlabels))
if hlabels else None,
tlabel=(lambda r: punescape(tlabel, PunescapeGetattr(r)))
if tlabel else None,
**args) **args)
@@ -3374,6 +3395,20 @@ if __name__ == "__main__":
const='notes', const='notes',
action='append', action='append',
help="Field to use for notes. Defaults to 'notes'.") help="Field to use for notes. Defaults to 'notes'.")
parser.add_argument(
'-H', '--hlabel',
dest='hlabels',
action='append',
type=lambda x: (
lambda k, v: (
k.strip(),
v.strip())
)(*x.split('=', 1)),
help="Change the default header label for a given field. "
"Accepts %% modifiers.")
parser.add_argument(
'--tlabel',
help="Change the default TOTAL label. Accepts %% modifiers.")
parser.add_argument( parser.add_argument(
'--no-header', '--no-header',
action='store_true', action='store_true',
+21 -16
View File
@@ -858,13 +858,15 @@ def hotify(Result, results, *,
def table(Result, results, diff_results=None, *, def table(Result, results, diff_results=None, *,
by=None, by=None,
fields=None, fields=None,
hidden=None,
sort=None, sort=None,
labels=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, percent=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None,
tlabel=None,
no_header=False, no_header=False,
small_header=False, small_header=False,
no_total=False, no_total=False,
@@ -921,7 +923,8 @@ def table(Result, results, diff_results=None, *,
# header # header
if not no_header: if not no_header:
header = ['%s%s' % ( header = ['%s%s' % (
','.join(labels if labels is not None else by), ','.join((hlabel(k) if hlabel is not None else k)
for k in by if hidden is None or k not in hidden),
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
@@ -929,14 +932,14 @@ def table(Result, results, diff_results=None, *,
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent:
for k in fields: for k in fields:
header.append(k) header.append(hlabel(k) if hlabel is not None else k)
else: else:
for k in fields: for k in fields:
header.append('o'+k) header.append('o'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('n'+k) header.append('n'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('d'+k) header.append('d'+(hlabel(k) if hlabel is not None else k))
lines.append(header) lines.append(header)
# delete these to try to catch typos below, we need to rebuild # delete these to try to catch typos below, we need to rebuild
@@ -1081,20 +1084,20 @@ def table(Result, results, diff_results=None, *,
# find comparable results # find comparable results
diff_r = diff_table_.get(n) diff_r = diff_table_.get(n)
# figure out a good label # figure out a good name
if labels is not None: if hidden is not None:
label = next( name = next(
','.join(str(getattr(r_, k) ','.join(str(getattr(r_, k)
if getattr(r_, k) is not None if getattr(r_, k) is not None
else '') else '')
for k in labels) for k in by if k not in hidden)
for r_ in [r, diff_r] for r_ in [r, diff_r]
if r_ is not None) if r_ is not None)
else: else:
label = n name = n
# build line # build line
line = table_entry(label, r, diff_r) line = table_entry(name, r, diff_r)
# add prefixes # add prefixes
line = [x if isinstance(x, tuple) else (x, []) for x in line] line = [x if isinstance(x, tuple) else (x, []) for x in line]
@@ -1126,7 +1129,9 @@ def table(Result, results, diff_results=None, *,
else: else:
diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) diff_r = next(iter(fold(Result, diff_results, by=[])), Result())
lines.append(table_entry( lines.append(table_entry(
'TOTAL' if not small_total else '', '' if small_total
else tlabel(r) if tlabel is not None
else 'TOTAL',
r, diff_r)) r, diff_r))
# homogenize # homogenize
@@ -1307,13 +1312,13 @@ def main(obj_paths, *,
hot=None, hot=None,
**args): **args):
# figure out what fields we're interested in # figure out what fields we're interested in
labels = None hidden = None
if by is None: if by is None:
if args.get('output') or args.get('output_json'): if args.get('output') or args.get('output_json'):
by = CtxResult._by by = CtxResult._by
elif depth is not None or hot is not None: elif depth is not None or hot is not None:
by = ['z', 'i', 'function'] by = ['z', 'i', 'function']
labels = ['function'] hidden = {'z', 'i'}
else: else:
by = ['function'] by = ['function']
@@ -1403,8 +1408,8 @@ def main(obj_paths, *,
table(CtxResult, results, diff_results, table(CtxResult, results, diff_results,
by=by, by=by,
fields=fields, fields=fields,
hidden=hidden,
sort=sort, sort=sort,
labels=labels,
depth=depth, depth=depth,
**args) **args)
+18 -13
View File
@@ -599,13 +599,15 @@ def fold(Result, results, *,
def table(Result, results, diff_results=None, *, def table(Result, results, diff_results=None, *,
by=None, by=None,
fields=None, fields=None,
hidden=None,
sort=None, sort=None,
labels=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, percent=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None,
tlabel=None,
no_header=False, no_header=False,
small_header=False, small_header=False,
no_total=False, no_total=False,
@@ -662,7 +664,8 @@ def table(Result, results, diff_results=None, *,
# header # header
if not no_header: if not no_header:
header = ['%s%s' % ( header = ['%s%s' % (
','.join(labels if labels is not None else by), ','.join((hlabel(k) if hlabel is not None else k)
for k in by if hidden is None or k not in hidden),
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
@@ -670,14 +673,14 @@ def table(Result, results, diff_results=None, *,
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent:
for k in fields: for k in fields:
header.append(k) header.append(hlabel(k) if hlabel is not None else k)
else: else:
for k in fields: for k in fields:
header.append('o'+k) header.append('o'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('n'+k) header.append('n'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('d'+k) header.append('d'+(hlabel(k) if hlabel is not None else k))
lines.append(header) lines.append(header)
# delete these to try to catch typos below, we need to rebuild # delete these to try to catch typos below, we need to rebuild
@@ -822,20 +825,20 @@ def table(Result, results, diff_results=None, *,
# find comparable results # find comparable results
diff_r = diff_table_.get(n) diff_r = diff_table_.get(n)
# figure out a good label # figure out a good name
if labels is not None: if hidden is not None:
label = next( name = next(
','.join(str(getattr(r_, k) ','.join(str(getattr(r_, k)
if getattr(r_, k) is not None if getattr(r_, k) is not None
else '') else '')
for k in labels) for k in by if k not in hidden)
for r_ in [r, diff_r] for r_ in [r, diff_r]
if r_ is not None) if r_ is not None)
else: else:
label = n name = n
# build line # build line
line = table_entry(label, r, diff_r) line = table_entry(name, r, diff_r)
# add prefixes # add prefixes
line = [x if isinstance(x, tuple) else (x, []) for x in line] line = [x if isinstance(x, tuple) else (x, []) for x in line]
@@ -867,7 +870,9 @@ def table(Result, results, diff_results=None, *,
else: else:
diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) diff_r = next(iter(fold(Result, diff_results, by=[])), Result())
lines.append(table_entry( lines.append(table_entry(
'TOTAL' if not small_total else '', '' if small_total
else tlabel(r) if tlabel is not None
else 'TOTAL',
r, diff_r)) r, diff_r))
# homogenize # homogenize
+21 -16
View File
@@ -957,13 +957,15 @@ def hotify(Result, results, *,
def table(Result, results, diff_results=None, *, def table(Result, results, diff_results=None, *,
by=None, by=None,
fields=None, fields=None,
hidden=None,
sort=None, sort=None,
labels=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, percent=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None,
tlabel=None,
no_header=False, no_header=False,
small_header=False, small_header=False,
no_total=False, no_total=False,
@@ -1020,7 +1022,8 @@ def table(Result, results, diff_results=None, *,
# header # header
if not no_header: if not no_header:
header = ['%s%s' % ( header = ['%s%s' % (
','.join(labels if labels is not None else by), ','.join((hlabel(k) if hlabel is not None else k)
for k in by if hidden is None or k not in hidden),
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
@@ -1028,14 +1031,14 @@ def table(Result, results, diff_results=None, *,
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent:
for k in fields: for k in fields:
header.append(k) header.append(hlabel(k) if hlabel is not None else k)
else: else:
for k in fields: for k in fields:
header.append('o'+k) header.append('o'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('n'+k) header.append('n'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('d'+k) header.append('d'+(hlabel(k) if hlabel is not None else k))
lines.append(header) lines.append(header)
# delete these to try to catch typos below, we need to rebuild # delete these to try to catch typos below, we need to rebuild
@@ -1180,20 +1183,20 @@ def table(Result, results, diff_results=None, *,
# find comparable results # find comparable results
diff_r = diff_table_.get(n) diff_r = diff_table_.get(n)
# figure out a good label # figure out a good name
if labels is not None: if hidden is not None:
label = next( name = next(
','.join(str(getattr(r_, k) ','.join(str(getattr(r_, k)
if getattr(r_, k) is not None if getattr(r_, k) is not None
else '') else '')
for k in labels) for k in by if k not in hidden)
for r_ in [r, diff_r] for r_ in [r, diff_r]
if r_ is not None) if r_ is not None)
else: else:
label = n name = n
# build line # build line
line = table_entry(label, r, diff_r) line = table_entry(name, r, diff_r)
# add prefixes # add prefixes
line = [x if isinstance(x, tuple) else (x, []) for x in line] line = [x if isinstance(x, tuple) else (x, []) for x in line]
@@ -1225,7 +1228,9 @@ def table(Result, results, diff_results=None, *,
else: else:
diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) diff_r = next(iter(fold(Result, diff_results, by=[])), Result())
lines.append(table_entry( lines.append(table_entry(
'TOTAL' if not small_total else '', '' if small_total
else tlabel(r) if tlabel is not None
else 'TOTAL',
r, diff_r)) r, diff_r))
# homogenize # homogenize
@@ -1515,7 +1520,7 @@ def main_(perf_paths, *,
args['color'] = False args['color'] = False
# figure out what fields we're interested in # figure out what fields we're interested in
labels = None hidden = None
if by is None: if by is None:
if (args.get('annotate') if (args.get('annotate')
or args.get('threshold') or args.get('threshold')
@@ -1524,7 +1529,7 @@ def main_(perf_paths, *,
by = PerfResult._by by = PerfResult._by
elif depth is not None or hot is not None: elif depth is not None or hot is not None:
by = ['z', 'function'] by = ['z', 'function']
labels = ['function'] hidden = {'z'}
else: else:
by = ['function'] by = ['function']
@@ -1628,8 +1633,8 @@ def main_(perf_paths, *,
table(PerfResult, results, diff_results, table(PerfResult, results, diff_results,
by=by, by=by,
fields=fields, fields=fields,
hidden=hidden,
sort=sort, sort=sort,
labels=labels,
depth=depth, depth=depth,
**args) **args)
+21 -16
View File
@@ -931,13 +931,15 @@ def hotify(Result, results, *,
def table(Result, results, diff_results=None, *, def table(Result, results, diff_results=None, *,
by=None, by=None,
fields=None, fields=None,
hidden=None,
sort=None, sort=None,
labels=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, percent=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None,
tlabel=None,
no_header=False, no_header=False,
small_header=False, small_header=False,
no_total=False, no_total=False,
@@ -994,7 +996,8 @@ def table(Result, results, diff_results=None, *,
# header # header
if not no_header: if not no_header:
header = ['%s%s' % ( header = ['%s%s' % (
','.join(labels if labels is not None else by), ','.join((hlabel(k) if hlabel is not None else k)
for k in by if hidden is None or k not in hidden),
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
@@ -1002,14 +1005,14 @@ def table(Result, results, diff_results=None, *,
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent:
for k in fields: for k in fields:
header.append(k) header.append(hlabel(k) if hlabel is not None else k)
else: else:
for k in fields: for k in fields:
header.append('o'+k) header.append('o'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('n'+k) header.append('n'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('d'+k) header.append('d'+(hlabel(k) if hlabel is not None else k))
lines.append(header) lines.append(header)
# delete these to try to catch typos below, we need to rebuild # delete these to try to catch typos below, we need to rebuild
@@ -1154,20 +1157,20 @@ def table(Result, results, diff_results=None, *,
# find comparable results # find comparable results
diff_r = diff_table_.get(n) diff_r = diff_table_.get(n)
# figure out a good label # figure out a good name
if labels is not None: if hidden is not None:
label = next( name = next(
','.join(str(getattr(r_, k) ','.join(str(getattr(r_, k)
if getattr(r_, k) is not None if getattr(r_, k) is not None
else '') else '')
for k in labels) for k in by if k not in hidden)
for r_ in [r, diff_r] for r_ in [r, diff_r]
if r_ is not None) if r_ is not None)
else: else:
label = n name = n
# build line # build line
line = table_entry(label, r, diff_r) line = table_entry(name, r, diff_r)
# add prefixes # add prefixes
line = [x if isinstance(x, tuple) else (x, []) for x in line] line = [x if isinstance(x, tuple) else (x, []) for x in line]
@@ -1199,7 +1202,9 @@ def table(Result, results, diff_results=None, *,
else: else:
diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) diff_r = next(iter(fold(Result, diff_results, by=[])), Result())
lines.append(table_entry( lines.append(table_entry(
'TOTAL' if not small_total else '', '' if small_total
else tlabel(r) if tlabel is not None
else 'TOTAL',
r, diff_r)) r, diff_r))
# homogenize # homogenize
@@ -1501,7 +1506,7 @@ def main_(paths, *,
args['color'] = False args['color'] = False
# figure out what fields we're interested in # figure out what fields we're interested in
labels = None hidden = None
if by is None: if by is None:
if (args.get('annotate') if (args.get('annotate')
or args.get('threshold') or args.get('threshold')
@@ -1513,7 +1518,7 @@ def main_(paths, *,
by = PerfBdResult._by by = PerfBdResult._by
elif depth is not None or hot is not None: elif depth is not None or hot is not None:
by = ['z', 'function'] by = ['z', 'function']
labels = ['function'] hidden = {'z'}
else: else:
by = ['function'] by = ['function']
@@ -1624,8 +1629,8 @@ def main_(paths, *,
table(PerfBdResult, results, diff_results, table(PerfBdResult, results, diff_results,
by=by, by=by,
fields=fields, fields=fields,
hidden=hidden,
sort=sort, sort=sort,
labels=labels,
depth=depth, depth=depth,
**args) **args)
+21 -16
View File
@@ -599,13 +599,15 @@ def hotify(Result, results, *,
def table(Result, results, diff_results=None, *, def table(Result, results, diff_results=None, *,
by=None, by=None,
fields=None, fields=None,
hidden=None,
sort=None, sort=None,
labels=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, percent=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None,
tlabel=None,
no_header=False, no_header=False,
small_header=False, small_header=False,
no_total=False, no_total=False,
@@ -662,7 +664,8 @@ def table(Result, results, diff_results=None, *,
# header # header
if not no_header: if not no_header:
header = ['%s%s' % ( header = ['%s%s' % (
','.join(labels if labels is not None else by), ','.join((hlabel(k) if hlabel is not None else k)
for k in by if hidden is None or k not in hidden),
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
@@ -670,14 +673,14 @@ def table(Result, results, diff_results=None, *,
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent:
for k in fields: for k in fields:
header.append(k) header.append(hlabel(k) if hlabel is not None else k)
else: else:
for k in fields: for k in fields:
header.append('o'+k) header.append('o'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('n'+k) header.append('n'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('d'+k) header.append('d'+(hlabel(k) if hlabel is not None else k))
lines.append(header) lines.append(header)
# delete these to try to catch typos below, we need to rebuild # delete these to try to catch typos below, we need to rebuild
@@ -822,20 +825,20 @@ def table(Result, results, diff_results=None, *,
# find comparable results # find comparable results
diff_r = diff_table_.get(n) diff_r = diff_table_.get(n)
# figure out a good label # figure out a good name
if labels is not None: if hidden is not None:
label = next( name = next(
','.join(str(getattr(r_, k) ','.join(str(getattr(r_, k)
if getattr(r_, k) is not None if getattr(r_, k) is not None
else '') else '')
for k in labels) for k in by if k not in hidden)
for r_ in [r, diff_r] for r_ in [r, diff_r]
if r_ is not None) if r_ is not None)
else: else:
label = n name = n
# build line # build line
line = table_entry(label, r, diff_r) line = table_entry(name, r, diff_r)
# add prefixes # add prefixes
line = [x if isinstance(x, tuple) else (x, []) for x in line] line = [x if isinstance(x, tuple) else (x, []) for x in line]
@@ -867,7 +870,9 @@ def table(Result, results, diff_results=None, *,
else: else:
diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) diff_r = next(iter(fold(Result, diff_results, by=[])), Result())
lines.append(table_entry( lines.append(table_entry(
'TOTAL' if not small_total else '', '' if small_total
else tlabel(r) if tlabel is not None
else 'TOTAL',
r, diff_r)) r, diff_r))
# homogenize # homogenize
@@ -1048,13 +1053,13 @@ def main(ci_paths,
hot=None, hot=None,
**args): **args):
# figure out what fields we're interested in # figure out what fields we're interested in
labels = None hidden = None
if by is None: if by is None:
if args.get('output') or args.get('output_json'): if args.get('output') or args.get('output_json'):
by = StackResult._by by = StackResult._by
elif depth is not None or hot is not None: elif depth is not None or hot is not None:
by = ['z', 'function'] by = ['z', 'function']
labels = ['function'] hidden = ['z']
else: else:
by = ['function'] by = ['function']
@@ -1141,8 +1146,8 @@ def main(ci_paths,
table(StackResult, results, diff_results, table(StackResult, results, diff_results,
by=by, by=by,
fields=fields, fields=fields,
hidden=hidden,
sort=sort, sort=sort,
labels=labels,
depth=depth, depth=depth,
**args) **args)
+21 -16
View File
@@ -747,13 +747,15 @@ def hotify(Result, results, *,
def table(Result, results, diff_results=None, *, def table(Result, results, diff_results=None, *,
by=None, by=None,
fields=None, fields=None,
hidden=None,
sort=None, sort=None,
labels=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, percent=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None,
tlabel=None,
no_header=False, no_header=False,
small_header=False, small_header=False,
no_total=False, no_total=False,
@@ -810,7 +812,8 @@ def table(Result, results, diff_results=None, *,
# header # header
if not no_header: if not no_header:
header = ['%s%s' % ( header = ['%s%s' % (
','.join(labels if labels is not None else by), ','.join((hlabel(k) if hlabel is not None else k)
for k in by if hidden is None or k not in hidden),
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
@@ -818,14 +821,14 @@ def table(Result, results, diff_results=None, *,
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent:
for k in fields: for k in fields:
header.append(k) header.append(hlabel(k) if hlabel is not None else k)
else: else:
for k in fields: for k in fields:
header.append('o'+k) header.append('o'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('n'+k) header.append('n'+(hlabel(k) if hlabel is not None else k))
for k in fields: for k in fields:
header.append('d'+k) header.append('d'+(hlabel(k) if hlabel is not None else k))
lines.append(header) lines.append(header)
# delete these to try to catch typos below, we need to rebuild # delete these to try to catch typos below, we need to rebuild
@@ -970,20 +973,20 @@ def table(Result, results, diff_results=None, *,
# find comparable results # find comparable results
diff_r = diff_table_.get(n) diff_r = diff_table_.get(n)
# figure out a good label # figure out a good name
if labels is not None: if hidden is not None:
label = next( name = next(
','.join(str(getattr(r_, k) ','.join(str(getattr(r_, k)
if getattr(r_, k) is not None if getattr(r_, k) is not None
else '') else '')
for k in labels) for k in by if k not in hidden)
for r_ in [r, diff_r] for r_ in [r, diff_r]
if r_ is not None) if r_ is not None)
else: else:
label = n name = n
# build line # build line
line = table_entry(label, r, diff_r) line = table_entry(name, r, diff_r)
# add prefixes # add prefixes
line = [x if isinstance(x, tuple) else (x, []) for x in line] line = [x if isinstance(x, tuple) else (x, []) for x in line]
@@ -1015,7 +1018,9 @@ def table(Result, results, diff_results=None, *,
else: else:
diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) diff_r = next(iter(fold(Result, diff_results, by=[])), Result())
lines.append(table_entry( lines.append(table_entry(
'TOTAL' if not small_total else '', '' if small_total
else tlabel(r) if tlabel is not None
else 'TOTAL',
r, diff_r)) r, diff_r))
# homogenize # homogenize
@@ -1196,13 +1201,13 @@ def main(obj_paths, *,
hot=None, hot=None,
**args): **args):
# figure out what fields we're interested in # figure out what fields we're interested in
labels = None hidden = None
if by is None: if by is None:
if args.get('output') or args.get('output_json'): if args.get('output') or args.get('output_json'):
by = StructResult._by by = StructResult._by
elif depth is not None or hot is not None: elif depth is not None or hot is not None:
by = ['z', 'i', 'struct'] by = ['z', 'i', 'struct']
labels = ['struct'] hidden = {'z', 'i'}
else: else:
by = ['struct'] by = ['struct']
@@ -1292,8 +1297,8 @@ def main(obj_paths, *,
table(StructResult, results, diff_results, table(StructResult, results, diff_results,
by=by, by=by,
fields=fields, fields=fields,
hidden=hidden,
sort=sort, sort=sort,
labels=labels,
depth=depth, depth=depth,
**args) **args)