summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorHarmen Stoppels <harmenstoppels@gmail.com>2022-12-23 09:52:22 -0800
committerHarmen Stoppels <harmenstoppels@gmail.com>2022-12-26 22:28:44 +0100
commite8fa8c5f0171366f7f2a5cfb3176e42ccf17b6be (patch)
treefc715f8061217df47b2f620b57db2ab77d89e2e1 /lib
parentbe6bb413dfed861c5f317b5d7274e4d47c34aeab (diff)
downloadspack-e8fa8c5f0171366f7f2a5cfb3176e42ccf17b6be.tar.gz
spack-e8fa8c5f0171366f7f2a5cfb3176e42ccf17b6be.tar.bz2
spack-e8fa8c5f0171366f7f2a5cfb3176e42ccf17b6be.tar.xz
spack-e8fa8c5f0171366f7f2a5cfb3176e42ccf17b6be.zip
timer: pick a single unit based on max duration.
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/llnl/util/lang.py22
-rw-r--r--lib/spack/spack/test/util/timer.py4
-rw-r--r--lib/spack/spack/util/timer.py16
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")