Source code for banff._common.src.diagnostics.time_measurement
"""time_measurement: facilitate common time measurement code.
Uses only standard packages
"""
import time
from ..nls import _
from .gensys_diagnostics import (
GensysDiagnostics,
default_log_level,
)
[docs]
class ExecTimer(GensysDiagnostics):
def __init__(self, name, logger=None, log_level=default_log_level):
super().__init__()
if self.is_disabled():
return
self.name = name
self.logger=logger
self.log_level = log_level
self.end_time = None
self.duration = None
def __enter__(self):
if self.is_disabled():
return
self.start()
def __exit__(self, exc_type, exc_value, traceback):
if self.is_disabled():
return
self.stop()
if self.logger is not None:
self.logger.log(self.log_level, self.print_duration())
else:
print(self.print_duration()) # noqa: T201
[docs]
def start(self):
if self.is_disabled():
return
self.start_time = get_time()
[docs]
def stop(self):
if self.is_disabled():
return
self.end_time = get_time()
[docs]
def print_duration(self):
if self.is_disabled():
return None
t_wall_seconds = (self.end_time["wall"] - self.start_time["wall"])/1e+09
t_cpu_seconds = (self.end_time["cpu"] - self.start_time["cpu"])/1e+09
# CONTEXT: [TIME] <name of time measurement>
return _("[TIME] {} {:.3f} seconds (WALL), {:.3f} seconds (CPU)").format(
(self.name + ":").ljust(20),
t_wall_seconds,
t_cpu_seconds,
)
def get_time():
return {"cpu": time.process_time_ns(), "wall": time.time_ns()}