Group of timers.
| 65 | |
| 66 | |
| 67 | class Timers: |
| 68 | """Group of timers.""" |
| 69 | |
| 70 | class Timer: |
| 71 | """Timer.""" |
| 72 | |
| 73 | def __init__(self, name): |
| 74 | self.name_ = name |
| 75 | self.elapsed_ = 0.0 |
| 76 | self.started_ = False |
| 77 | self.start_time = time.time() |
| 78 | |
| 79 | def start(self): |
| 80 | """Start the timer.""" |
| 81 | assert not self.started_, 'timer has already been started' |
| 82 | torch.cuda.synchronize() |
| 83 | self.start_time = time.time() |
| 84 | self.started_ = True |
| 85 | |
| 86 | def stop(self): |
| 87 | """Stop the timer.""" |
| 88 | assert self.started_, 'timer is not started' |
| 89 | torch.cuda.synchronize() |
| 90 | self.elapsed_ += (time.time() - self.start_time) |
| 91 | self.started_ = False |
| 92 | |
| 93 | def reset(self): |
| 94 | """Reset timer.""" |
| 95 | self.elapsed_ = 0.0 |
| 96 | self.started_ = False |
| 97 | |
| 98 | def elapsed(self, reset=True): |
| 99 | """Calculate the elapsed time.""" |
| 100 | started_ = self.started_ |
| 101 | # If the timing in progress, end it first. |
| 102 | if self.started_: |
| 103 | self.stop() |
| 104 | # Get the elapsed time. |
| 105 | elapsed_ = self.elapsed_ |
| 106 | # Reset the elapsed time |
| 107 | if reset: |
| 108 | self.reset() |
| 109 | # If timing was in progress, set it back. |
| 110 | if started_: |
| 111 | self.start() |
| 112 | return elapsed_ |
| 113 | |
| 114 | def __init__(self): |
| 115 | self.timers = {} |
| 116 | |
| 117 | def __call__(self, name): |
| 118 | if name not in self.timers: |
| 119 | self.timers[name] = self.Timer(name) |
| 120 | return self.timers[name] |
| 121 | |
| 122 | def log(self, names, normalizer=1.0, reset=True): |
| 123 | """Log a group of timers.""" |
| 124 | assert normalizer > 0.0 |