Index: tools/bisect-perf-regression.py |
diff --git a/tools/bisect-perf-regression.py b/tools/bisect-perf-regression.py |
index df3a7317e6feca00462c2faa170927361c46e5b4..6b98b4b40dcb34b7b2a7ce3f2b3f10b58fad4743 100755 |
--- a/tools/bisect-perf-regression.py |
+++ b/tools/bisect-perf-regression.py |
@@ -291,6 +291,29 @@ def CalculateStandardDeviation(values): |
return std_dev |
+def CalculateRelativeChange(before, after): |
+ """Returns the relative change of before and after, relative to before. |
+ |
+ There are several different ways to define relative difference between |
+ two numbers; sometimes it is defined as relative to the smaller number, |
+ or to the mean of the two numbers. This version returns the difference |
+ relative to the first of the two numbers. |
+ |
+ Args: |
+ before: A number representing an earlier value. |
+ after: Another number, representing a later value. |
+ |
+ Returns: |
+ A non-negative floating point number; 0.1 represents a 10% change. |
+ """ |
+ if before == after: |
+ return 0.0 |
+ if before == 0: |
+ return float('nan') |
+ difference = after - before |
+ return math.fabs(difference / before) |
+ |
+ |
def CalculatePooledStandardError(work_sets): |
numerator = 0.0 |
denominator1 = 0.0 |
@@ -3165,8 +3188,10 @@ class BisectPerformanceMetrics(object): |
mean_of_bad_runs = CalculateMean(broken_mean) |
mean_of_good_runs = CalculateMean(working_mean) |
- regression_size = math.fabs(max(mean_of_good_runs, mean_of_bad_runs) / |
- max(0.0001, min(mean_of_good_runs, mean_of_bad_runs))) * 100.0 - 100.0 |
+ regression_size = 100 * CalculateRelativeChange(mean_of_good_runs, |
+ mean_of_bad_runs) |
+ if math.isnan(regression_size): |
+ regression_size = 'zero-to-nonzero' |
regression_std_err = math.fabs(CalculatePooledStandardError( |
[working_mean, broken_mean]) / |