68 lines
No EOL
1.7 KiB
Python
68 lines
No EOL
1.7 KiB
Python
import collections
|
|
from re import A
|
|
import time
|
|
from multiprocessing.sharedctypes import RawValue, Value, Array
|
|
from ctypes import c_double
|
|
from typing import MutableSequence
|
|
|
|
|
|
class Timer():
|
|
"""
|
|
Measure 2 independent things: the freuency of tic, and the duration of tic->toc
|
|
Note that indeed these don't need to be equal
|
|
"""
|
|
def __init__(self, name = 'timer') -> None:
|
|
self.name = name
|
|
self.tocs: MutableSequence[(float, int)] = collections.deque(maxlen=5)
|
|
self.iterations = Value('i', 0)
|
|
|
|
# def tic(self):
|
|
# now = time.time()
|
|
# if self.last_tic is None:
|
|
|
|
# self.last_tic = now
|
|
# return
|
|
|
|
# duration = now - self.last_tic
|
|
# self.last_tic = now
|
|
|
|
# current_fps = 1 / duration
|
|
# if not self.fps:
|
|
# self.fps = current_fps
|
|
# else:
|
|
# self.fps = self.fps * (1-self.smoothing) + current_fps * self.smoothing
|
|
|
|
def toc(self):
|
|
self.iterations += 1
|
|
|
|
def snapshot(self):
|
|
self.tocs.append((time.perf_counter(), self.iterations.value))
|
|
|
|
@property
|
|
def fps(self):
|
|
fpses = []
|
|
if len(self.tocs) < 2:
|
|
return 0
|
|
dt = self.tocs[-1][0] - self.tocs[0][0]
|
|
di = self.tocs[-1][1] - self.tocs[0][1]
|
|
return di/dt
|
|
|
|
|
|
class TimerCollection():
|
|
def __init__(self) -> None:
|
|
self._timers = set()
|
|
|
|
def snapshot(self):
|
|
for timer in self._timers:
|
|
timer.snapshot()
|
|
|
|
def to_string(self)->str:
|
|
strs = [f"{t.name} {t.fps:.2f}" for t in self._timers]
|
|
return " ".join(strs)
|
|
|
|
def new(self, name='timer'):
|
|
t = Timer(name)
|
|
self._timers.add(t)
|
|
return t
|
|
|
|
|