From c2cb5e9a72cc97c2ad16217813f5826782541afd Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Tue, 23 Nov 2021 18:55:54 -0500 Subject: testsuite: Print geometric mean of stat metrics As suggested in #20733. --- testsuite/driver/runtests.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'testsuite/driver') diff --git a/testsuite/driver/runtests.py b/testsuite/driver/runtests.py index eff240fc78..47d3324a82 100644 --- a/testsuite/driver/runtests.py +++ b/testsuite/driver/runtests.py @@ -9,11 +9,13 @@ import signal import sys import os import io +import operator import shutil import tempfile import time import re import traceback +from functools import reduce from pathlib import Path # We don't actually need subprocess in runtests.py, but: @@ -361,6 +363,9 @@ def cleanup_and_exit(exitcode): shutil.rmtree(tempdir, ignore_errors=True) exit(exitcode) +def geometric_mean(xs: List[float]) -> float: + return reduce(operator.mul, xs)**(1. / len(xs)) + def tabulate_metrics(metrics: List[PerfMetric]) -> None: abbrevLen = get_abbrev_hash_length() hasBaseline = any([x.baseline is not None for x in metrics]) @@ -399,6 +404,15 @@ def tabulate_metrics(metrics: List[PerfMetric]) -> None: "{}".format(x.change.hint()) )) for x in sorted(metrics, key = lambda m: (m.stat.test, m.stat.way, m.stat.metric))] + geoMean = geometric_mean([ + x.stat.value / x.baseline.perfStat.value + for x in metrics + if x.baseline is not None + ]) + dataRows += [ + row(("", "", "", "", "", "", "", "")), + row(("geo. mean", "", "", "", "", "", "{:+4.1f}%".format(100*(geoMean-1)), "")) + ] print_table(headerRows, dataRows, 1) print("") if hasBaseline: -- cgit v1.2.1