Source code for archai.common.stopwatch
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
# adapted from https://github.com/ildoonet/pystopwatch2/blob/master/pystopwatch2/watch.py
import threading
import time
from collections import defaultdict
from enum import Enum
class _ClockState(Enum):
PAUSE = 0
RUN = 1
class _Clock:
tag_default = '__default1958__'
th_lock = threading.Lock()
def __init__(self):
self.prev_time = time.time()
self.sum = 0.
self.state = _ClockState.PAUSE
def __str__(self):
return 'state=%s elapsed=%.4f prev_time=%.8f' % (self.state, self.sum, self.prev_time)
def __repr__(self):
return self.__str__()
[docs]class StopWatch:
stopwatch:'StopWatch' = None
def __init__(self):
self.clocks = defaultdict(lambda: _Clock())
[docs] def start(self, tag=None):
if tag is None:
tag = _Clock.tag_default
with _Clock.th_lock:
clock = self.clocks[tag]
if clock.state == _ClockState.RUN:
return
clock.state = _ClockState.RUN
clock.prev_time = time.time()
[docs] def pause(self, tag=None):
if tag is None:
tag = _Clock.tag_default
with _Clock.th_lock:
clock = self.clocks[tag]
clock.state = _ClockState.PAUSE
delta = time.time() - clock.prev_time
clock.sum += delta
return clock.sum
[docs] def clear(self, tag=None):
if tag is None:
tag = _Clock.tag_default
del self.clocks[tag]
[docs] def get_elapsed(self, tag=None):
if tag is None:
tag = _Clock.tag_default
clock = self.clocks[tag]
elapsed = clock.sum
if clock.state == _ClockState.RUN:
elapsed += time.time() - clock.prev_time
return elapsed
[docs] def keys(self):
return self.clocks.keys()
def __str__(self):
return '\n'.join(['%s: %s' % (k, v) for k, v in self.clocks.items()])
def __repr__(self):
return self.__str__()
[docs] @staticmethod
def set(instance:'StopWatch')->None:
StopWatch.stopwatch = instance
[docs] @staticmethod
def get()->'StopWatch':
return StopWatch.stopwatch