From e8fa8c5f0171366f7f2a5cfb3176e42ccf17b6be Mon Sep 17 00:00:00 2001 From: Harmen Stoppels Date: Fri, 23 Dec 2022 09:52:22 -0800 Subject: timer: pick a single unit based on max duration. --- lib/spack/llnl/util/lang.py | 22 +++++++++++++--------- lib/spack/spack/test/util/timer.py | 4 ++-- lib/spack/spack/util/timer.py | 16 ++++++++++------ 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py index 6deb224d70..6cffcd1438 100644 --- a/lib/spack/llnl/util/lang.py +++ b/lib/spack/llnl/util/lang.py @@ -741,6 +741,18 @@ def pretty_string_to_date(date_str, now=None): raise ValueError(msg) +def pretty_seconds_formatter(seconds): + if seconds >= 1: + multiplier, unit = 1, "s" + elif seconds >= 1e-3: + multiplier, unit = 1e3, "ms" + elif seconds >= 1e-6: + multiplier, unit = 1e6, "us" + else: + multiplier, unit = 1e9, "ns" + return lambda s: "%.3f%s" % (multiplier * s, unit) + + def pretty_seconds(seconds): """Seconds to string with appropriate units @@ -750,15 +762,7 @@ def pretty_seconds(seconds): Returns: str: Time string with units """ - if seconds >= 1: - value, unit = seconds, "s" - elif seconds >= 1e-3: - value, unit = seconds * 1e3, "ms" - elif seconds >= 1e-6: - value, unit = seconds * 1e6, "us" - else: - value, unit = seconds * 1e9, "ns" - return "%.3f%s" % (value, unit) + return pretty_seconds_formatter(seconds)(seconds) class RequiredAttributeError(ValueError): diff --git a/lib/spack/spack/test/util/timer.py b/lib/spack/spack/test/util/timer.py index 9f43526482..16c1564663 100644 --- a/lib/spack/spack/test/util/timer.py +++ b/lib/spack/spack/test/util/timer.py @@ -120,9 +120,9 @@ def test_timer_write(): output = text_buffer.getvalue().splitlines() assert "timer" in output[0] - assert "1.0000s" in output[0] + assert "1.000s" in output[0] assert "total" in output[1] - assert "3.0000s" in output[1] + assert "3.000s" in output[1] deserialized = json.loads(json_buffer.getvalue()) assert deserialized == { diff --git a/lib/spack/spack/util/timer.py b/lib/spack/spack/util/timer.py index 83d6907c67..840bfb3c0d 100644 --- a/lib/spack/spack/util/timer.py +++ b/lib/spack/spack/util/timer.py @@ -14,7 +14,7 @@ import time from collections import OrderedDict, namedtuple from contextlib import contextmanager -from llnl.util.lang import pretty_seconds +from llnl.util.lang import pretty_seconds_formatter import spack.util.spack_json as sjson @@ -139,12 +139,16 @@ class Timer(object): def write_tty(self, out=sys.stdout): """Write a human-readable summary of timings""" - # Individual timers ordered by registration - formatted = [(p, f"{self.duration(p):.4f}s") for p in self.phases] - # Total time - formatted.append(("total", f"{self.duration():.4f}s")) + times = [self.duration(p) for p in self.phases] + + # Get a consistent unit for the time + pretty_seconds = pretty_seconds_formatter(max(times)) + + # Tuples of (phase, time) including total. + formatted = list(zip(self.phases, times)) + formatted.append(("total", self.duration())) # Write to out for name, duration in formatted: - out.write(f" {name:10s} {duration:>10s}\n") + out.write(f" {name:10s} {pretty_seconds(duration):>10s}\n") -- cgit v1.2.3-70-g09d2