forked from openturns/openturns
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcostDiff.py
87 lines (75 loc) · 2.81 KB
/
costDiff.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# Tool to compare testsuite costs
#
# 1. run tests in reference configuration:
# $ make install && make tests && rm -rf Testing && ctest && cp Testing/Temporary/CTestCostData.txt CTestCostData0.txt
#
# 2. run tests with new code:
# $ make install && make tests && rm -rf Testing && ctest && cp Testing/Temporary/CTestCostData.txt CTestCostData1.txt
#
# 3. compare tests costs:
# $ python3 ../utils/costDiff.py CTestCostData0.txt CTestCostData1.txt
import argparse
def parse_cost(path):
tdata = dict()
with open(path) as cost1:
for line in cost1.readlines():
try:
tag, reps, cost = line.split(" ")
if reps == "0":
raise ValueError()
tdata[tag] = float(cost)
except ValueError:
pass
return tdata
def compare_cost(path1, path2):
data1 = parse_cost(path1)
data2 = parse_cost(path2)
diffData = {}
relDiffData = {}
n_slower = 0
n_faster = 0
a_tol = 8e-1
r_tol = 1e-1
for key in data1.keys():
if data1[key] < a_tol:
continue
if key in data2:
diff = data2[key] - data1[key]
diffData[key] = diff
relDiff = diff / data1[key]
if diff > a_tol and relDiff > r_tol:
n_slower +=1
if diff < -a_tol and -relDiff > r_tol:
n_faster +=1
relDiffData[key] = relDiff
for key in diffData.keys():
print(f"{key} diff {diffData[key]:.3f} slowdown {relDiffData[key]:.3f}")
n = 10
print(f"= top {n} SLOWEST tests ============")
std = sorted(data1.items(), key=lambda item: item[1])
slowest = dict(reversed(std[-n:]))
for key in slowest.keys():
print(f"{key} {data1[key]:.3f}")
std = sorted(relDiffData.items(), key=lambda item: item[1])
slower = dict(reversed(std[-n:]))
faster = dict(std[:n])
print(f"= top {n} FASTER tests ============")
for key in faster.keys():
print(f"{key} diff {diffData[key]:.3f} speedup {-100.0*relDiffData[key]:.3f}% (before={data1[key]:.3f} after={data2[key]:.3f})")
print(f"= top {n} SLOWER tests ============")
for key in slower.keys():
print(f"{key} diff {diffData[key]:.3f} slowdown {100.0*relDiffData[key]:.3f}% (before={data1[key]:.3f} after={data2[key]:.3f})")
print(f"==============")
print(f"n_faster={n_faster} n_slower={n_slower}")
print(f"==============")
def main():
"""
entry point.
"""
parser = argparse.ArgumentParser(description="Compare test data")
parser.add_argument("path1", type=str, help="Path to the cost data (eg CTestCostData.txt)")
parser.add_argument("path2", type=str, help="Path to the cost data (eg CTestCostData.txt)")
args = parser.parse_args()
compare_cost(**vars(args))
if __name__ == "__main__":
main()