LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
timer.py
Go to the documentation of this file.
1 # This file is part of dax_apdb.
2 #
3 # Developed for the LSST Data Management System.
4 # This product includes software developed by the LSST Project
5 # (http://www.lsst.org).
6 # See the COPYRIGHT file at the top-level directory of this distribution
7 # for details of code ownership.
8 #
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 
22 """Module with methods to return timing information.
23 
24 This was developed as a part of a prototype for performance studies. It
25 could probably be removed in the production system.
26 """
27 
28 from __future__ import annotations
29 
30 import logging
31 import resource
32 import time
33 from typing import Any, Optional, Type
34 
35 
36 _LOG = logging.getLogger(__name__)
37 
38 
39 class Timer:
40  """
41  Instance of this class can be used to track consumed time.
42 
43  This class is also a context manager and can be used in
44  a `with` statement. By default it prints consumed CPU time
45  and real time spent in a context.
46 
47  Example:
48 
49  with Timer('SelectTimer'):
50  engine.execute('SELECT ...')
51 
52  """
53  def __init__(self, name: str = "", doPrint: bool = True):
54  """
55  Parameters
56  ----------
57  name : `str`
58  Timer name, will be printed together with statistics.
59  doPrint : `bool`
60  If True then print statistics on exist from context.
61  """
62  self._name_name = name
63  self._print_print = doPrint
64 
65  self._startReal_startReal = -1.
66  self._startUser_startUser = -1.
67  self._startSys_startSys = -1.
68  self._sumReal_sumReal = 0.
69  self._sumUser_sumUser = 0.
70  self._sumSys_sumSys = 0.
71 
72  def start(self) -> Timer:
73  """
74  Start timer.
75  """
76  self._startReal_startReal = time.time()
77  ru = resource.getrusage(resource.RUSAGE_SELF)
78  self._startUser_startUser = ru.ru_utime
79  self._startSys_startSys = ru.ru_stime
80  return self
81 
82  def stop(self) -> Timer:
83  """
84  Stop timer.
85  """
86  if self._startReal_startReal > 0:
87  self._sumReal_sumReal += time.time() - self._startReal_startReal
88  ru = resource.getrusage(resource.RUSAGE_SELF)
89  self._sumUser_sumUser += ru.ru_utime - self._startUser_startUser
90  self._sumSys_sumSys += ru.ru_stime - self._startSys_startSys
91  self._startReal_startReal = -1.
92  self._startUser_startUser = -1.
93  self._startSys_startSys = -1.
94  return self
95 
96  def dump(self) -> Timer:
97  """
98  Dump timer statistics
99  """
100  _LOG.info("%s", self)
101  return self
102 
103  def __str__(self) -> str:
104  real = self._sumReal_sumReal
105  user = self._sumUser_sumUser
106  sys = self._sumSys_sumSys
107  if self._startReal_startReal > 0:
108  real += time.time() - self._startReal_startReal
109  ru = resource.getrusage(resource.RUSAGE_SELF)
110  user += ru.ru_utime - self._startUser_startUser
111  sys += ru.ru_stime - self._startSys_startSys
112  info = "real=%.3f user=%.3f sys=%.3f" % (real, user, sys)
113  if self._name_name:
114  info = self._name_name + ": " + info
115  return info
116 
117  def __enter__(self) -> Timer:
118  """
119  Enter context, start timer
120  """
121  self.startstart()
122  return self
123 
124  def __exit__(self, exc_type: Optional[Type], exc_val: Any, exc_tb: Any) -> Any:
125  """
126  Exit context, stop and dump timer
127  """
128  if exc_type is None:
129  self.stopstop()
130  if self._print_print:
131  self.dumpdump()
132  return False
Timer __enter__(self)
Definition: timer.py:117
Timer start(self)
Definition: timer.py:72
Timer dump(self)
Definition: timer.py:96
Timer stop(self)
Definition: timer.py:82
def __init__(self, str name="", bool doPrint=True)
Definition: timer.py:53
Any __exit__(self, Optional[Type] exc_type, Any exc_val, Any exc_tb)
Definition: timer.py:124