in benchmark.py [0:0]
def create_summary(data, project_source):
"""Creates the runs summary onto stdout.
Excludes runs with non-zero exit codes from the final summary table.
"""
unit = {
'wall': 's ',
'cpu': 's ',
'system': 's ',
'memory': 'MB'
}
summary_builder = []
summary_builder.append('\nRESULTS:')
last_collected = None
for (i, bazel_commit, project_commit), collected in data.items():
header = ('[Unit #%d] Bazel version: %s, Project commit: %s, Project source: %s' %
(i, bazel_commit, project_commit, project_source))
summary_builder.append(header)
summary_builder.append(
'%s %s %s %s %s' %
('metric'.rjust(8), 'mean'.center(20), 'median'.center(20),
'stddev'.center(10), 'pval'.center(10)))
num_runs = len(collected['wall'].items())
# A map from run number to exit code, for runs with non-zero exit codes.
non_zero_runs = {}
for i, exit_code in enumerate(collected['exit_status'].items()):
if exit_code != 0:
non_zero_runs[i] = exit_code
for metric, values in collected.items():
if metric in ['exit_status', 'started_at']:
continue
values_exclude_failures = values.exclude_from_indexes(
non_zero_runs.keys())
# Skip if there's no value available after excluding failed runs.
if not values_exclude_failures.items():
continue
if last_collected:
base = last_collected[metric]
pval = '% 7.5f' % values_exclude_failures.pval(base.values())
mean_diff = '(% +6.2f%%)' % (
100. * (values_exclude_failures.mean() - base.mean()) / base.mean())
median_diff = '(% +6.2f%%)' % (
100. *
(values_exclude_failures.median() - base.median()) / base.median())
else:
pval = ''
mean_diff = median_diff = ' '
summary_builder.append(
'%s: %s %s %s %s' %
(metric.rjust(8),
('% 8.3f%s %s' %
(values_exclude_failures.mean(), unit[metric], mean_diff)).center(20),
('% 8.3f%s %s' %
(values_exclude_failures.median(), unit[metric], median_diff)).center(20),
('% 7.3f%s' % (values_exclude_failures.stddev(), unit[metric])).center(10),
pval.center(10)))
last_collected = collected
if non_zero_runs:
summary_builder.append(
('The following runs contain non-zero exit code(s):\n %s\n'
'Please check the full log for more details. These runs are '
'excluded from the above result table.' %
'\n '.join('- run: %s/%s, exit_code: %s' % (k + 1, num_runs, v)
for k, v in non_zero_runs.items())))
summary_builder.append('')
return '\n'.join(summary_builder)