def check_method_for_perf_regressions(func: Callable) -> Callable:
- """This is meant to be used on a method in a class that subclasses
+ """
+ This is meant to be used on a method in a class that subclasses
unittest.TestCase. When thus decorated it will time the execution
of the code in the method, compare it with a database of
historical perfmance, and fail the test with a perf-related
message if it has become too slow.
- """
+ """
def load_known_test_performance_characteristics():
with open(_db, 'rb') as f:
return pickle.load(f)
)
else:
stdev = statistics.stdev(hist)
- limit = hist[-1] + stdev * 3
+ limit = hist[-1] + stdev * 5
logger.debug(
f'Max acceptable performace for {func.__name__} is {limit:f}s'
)
):
msg = f'''{func_id} performance has regressed unacceptably.
{hist[-1]:f}s is the slowest record in {len(hist)} db perf samples.
-It just ran in {run_time:f}s which is >3 stdevs slower than the slowest sample.
+It just ran in {run_time:f}s which is >5 stdevs slower than the slowest sample.
Here is the current, full db perf timing distribution:
-{hist}'''
- slf = args[0]
+'''
+ for x in hist:
+ msg += f'{x:f}\n'
logger.error(msg)
+ slf = args[0]
slf.fail(msg)
else:
hist.append(run_time)