|
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 [row for row 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 | +pretty = lambda x : f'{x:.1f}' |
| 20 | + |
| 21 | +def get_emoji(difference, stdev): |
| 22 | + z = 1.96 # 95% confidence interval |
| 23 | + if difference < z * stdev: |
| 24 | + return ':green_circle:' |
| 25 | + elif difference > z * stdev: |
| 26 | + return ':red_circle:' |
| 27 | + else: |
| 28 | + return ':white_circle:' |
19 | 29 |
|
20 | 30 | 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]) |
| 31 | +for current, baseline in zip(table_current, table_baseline): |
| 32 | + assert(current[0] == baseline[0]) |
| 33 | + name = current[0] |
| 34 | + time = int(float(current[1])) |
| 35 | + stdev = pretty(float(current[2])) |
| 36 | + d = float(baseline[1]) - float(current[1]) |
| 37 | + difference = int(d) |
| 38 | + percent = pretty(0 if float(baseline[1]) == 0.0 else 100 * d / float(baseline[1])) |
| 39 | + emoji = get_emoji(d, float(current[2])) |
| 40 | + table.append([name, time, stdev, difference, percent, emoji]) |
31 | 41 |
|
32 | | -header = ["name", "time", "stdev", "", "difference", "percent"] |
| 42 | +header = ["name", "time", "stdev", "difference", "percent", ""] |
33 | 43 | print(tab.tabulate(table, header, tablefmt="github")) |
0 commit comments