|
1 | | -import sys |
| 1 | +import argparse |
2 | 2 | import csv |
3 | 3 | import tabulate as tab |
4 | 4 |
|
5 | | -csv_benchmark = sys.argv[1] |
6 | | -csv_baseline = sys.argv[2] |
| 5 | +parser = argparse.ArgumentParser() |
| 6 | +parser.add_argument('-b', '--baseline', required=True, help='Baseline CSV file') |
| 7 | +parser.add_argument('-c', '--current', required=True, help='Current CSV file') |
| 8 | +args = parser.parse_args() |
7 | 9 |
|
8 | | -pretty = lambda x : "{:.1f}".format(x) if x <= 0 else "+{:.1f}".format(x) |
| 10 | +def get_2d_list(csv_filename): |
| 11 | + with open(csv_filename) as csv_file: |
| 12 | + csv_reader = csv.reader(csv_file) |
| 13 | + next(csv_reader) |
| 14 | + return [[str(name), float(mean), float(stdev)] for name, mean, stdev in csv_reader] |
9 | 15 |
|
10 | | -with open(csv_benchmark) as csv_file: |
11 | | - csv_reader = csv.reader(csv_file) |
12 | | - next(csv_reader) |
13 | | - table_benchmark = [row for row in csv_reader] |
14 | | - |
15 | | -with open(csv_baseline) as csv_file: |
16 | | - csv_reader = csv.reader(csv_file) |
17 | | - next(csv_reader) |
18 | | - table_baseline = [row for row in csv_reader] |
| 16 | +table_baseline = get_2d_list(args.baseline) |
| 17 | +table_current = get_2d_list(args.current) |
| 18 | + |
| 19 | +def get_emoji(d, stdev): |
| 20 | + z = 1.96 # 95% confidence interval |
| 21 | + if d < -z * stdev: |
| 22 | + return ':green_circle:' |
| 23 | + elif d > z * stdev: |
| 24 | + return ':red_circle:' |
| 25 | + else: |
| 26 | + return ':white_circle:' |
19 | 27 |
|
20 | 28 | table = [] |
21 | | -for benchmark, baseline in zip(table_benchmark, table_baseline): |
22 | | - assert(benchmark[0] == baseline[0]) |
23 | | - name = benchmark[0] |
24 | | - time = benchmark[1] |
25 | | - stdev = u"\u00B1" + str(benchmark[2]) |
26 | | - d = float(baseline[1]) - float(benchmark[1]) |
27 | | - emoji = ':red_circle:' if 0 < d else ':green_circle:' |
28 | | - difference = pretty(d) |
29 | | - percent = pretty(100 * d / float(baseline[1])) |
30 | | - table.append([name, time, stdev, emoji, difference, percent]) |
| 29 | +for baseline, current in zip(table_baseline, table_current): |
| 30 | + baseline_name, baseline_mean, _ = baseline |
| 31 | + name, mean, stdev = current |
| 32 | + assert(baseline_name == name) |
| 33 | + diff = baseline_mean - mean |
| 34 | + impact = 0.0 if stdev == 0.0 else diff / stdev |
| 35 | + emoji = get_emoji(diff, stdev) |
| 36 | + table.append([name, int(mean), f'{stdev:.2f}', int(diff), f'{impact:.2f}', emoji]) |
31 | 37 |
|
32 | | -header = ["name", "time", "stdev", "", "difference", "percent"] |
| 38 | +header = ['name', 'mean (ms)', 'stdev \u03C3', 'diff \u0394', '\u0394 / \u03C3', ''] |
33 | 39 | print(tab.tabulate(table, header, tablefmt="github")) |
0 commit comments