# Licensed under a 3-clause BSD style license - see LICENSE.rstimportitertoolsimportosfrom..importutilfrom..consoleimportlogfrom..graphimportGraphfrom..publishingimportOutputPublisher
[docs]defbenchmark_param_iter(benchmark):""" Iterate over all combinations of parameterized benchmark parameters. Yields ------ idx : int Combination flat index. `None` if benchmark not parameterized. params : tuple Tuple of parameter values. """ifnotbenchmark['params']:yieldNone,()else:foriteminenumerate(itertools.product(*benchmark['params'])):yielditem
[docs]defpublish(cls,conf,repo,benchmarks,graphs,revisions):results={}# Investigate all benchmarksforbenchmark_name,benchmarkinsorted(benchmarks.items()):log.dot()benchmark_graphs=graphs.get_graph_group(benchmark_name)# For parameterized benchmarks, consider each combination separatelyforidx,benchmark_paraminbenchmark_param_iter(benchmark):pretty_name=benchmark_nameifbenchmark.get('pretty_name'):pretty_name=benchmark['pretty_name']ifidxisnotNone:bench_param=", ".join(benchmark_param)pretty_name=f'{pretty_name}({bench_param})'# Each environment parameter combination is reported# separately on the summarylist pagebenchmark_graphs=graphs.get_graph_group(benchmark_name)forgraphinbenchmark_graphs:# Produce interesting information, based on# stepwise fit on the benchmark data (reduces noise)steps=graph.get_steps()ifidxisnotNoneandsteps:steps=graph.get_steps()[idx]last_value=Nonelast_err=Nonechange_rev=Nonelast_rev=Noneprev_value=Noneifnotsteps:# No datapasselse:last_piece=steps[-1]last_value=last_piece[2]last_err=last_piece[4]last_rev=last_piece[1]-1iflen(steps)>1:prev_piece=steps[-2]prev_value=prev_piece[2]ifprev_piece[1]==last_piece[0]:# Single commitchange_rev=[None,last_piece[0]]else:# Revision range (left-exclusive)change_rev=[prev_piece[1]-1,last_piece[0]]row={'name':benchmark_name,'idx':idx,'pretty_name':pretty_name,'last_rev':last_rev,'last_value':last_value,'last_err':last_err,'prev_value':prev_value,'change_rev':change_rev,}# Generate summary data filename.# Note that 'summary' is not a valid benchmark name, so that we can# be sure it can be always used.path=Graph.get_file_path(graph.params,'summary')+".json"results.setdefault(path,[]).append(row)# Write results to filesforpath,datainresults.items():filename=os.path.join(conf.html_dir,path)util.write_json(filename,sorted(data,key=lambdax:(x['name'],x['idx'])),compact=True)