clearml-server/server/timing_context.py
2019-06-11 00:24:35 +03:00

66 lines
1.6 KiB
Python

import time
from config import config
log = config.logger(__file__)
_stats = dict()
def stats():
aggregate()
return _stats
def clear():
global _stats
_stats = dict()
def get_component_total(comp):
if comp not in _stats:
return 0
return _stats[comp].get("total")
# create a "total" node for each componenet
def aggregate():
grand_total = 0
for comp in _stats:
total = 0
for op in _stats[comp]:
total += _stats[comp][op]
_stats[comp]["total"] = total
grand_total += total
_stats["_all"] = dict(total=grand_total)
class TimingContext:
def __init__(self, component, operation):
self.component = component
self.operation = operation
_stats["_all"] = dict(total=0)
if component not in _stats:
_stats[component] = dict(total=0)
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, *args):
try:
self.end = time.time()
latency_ms = int((self.end - self.start) * 1000)
if self.operation in _stats.get(self.component, {}):
previous_latency = _stats[self.component][self.operation]
new_latency = int((previous_latency + latency_ms) / 2)
else:
new_latency = latency_ms
if self.component not in _stats:
_stats[self.component] = dict(total=0)
_stats[self.component][self.operation] = new_latency
except Exception as ex:
log.error("%s calculating latency: %s" % (type(ex).__name__, str(ex)))