Coverage for python/lsst/dax/apdb/timer.py: 20%

Shortcuts on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

56 statements  

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 

24This was developed as a part of a prototype for performance studies. It 

25could probably be removed in the production system. 

26""" 

27 

28 

29import logging 

30import resource 

31import time 

32 

33 

34_LOG = logging.getLogger(__name__.partition(".")[2]) # strip leading "lsst." 

35 

36 

37class Timer(object): 

38 """ 

39 Instance of this class can be used to track consumed time. 

40 

41 This class is also a context manager and can be used in 

42 a `with` statement. By default it prints consumed CPU time 

43 and real time spent in a context. 

44 

45 Example: 

46 

47 with Timer('SelectTimer'): 

48 engine.execute('SELECT ...') 

49 

50 """ 

51 def __init__(self, name="", doPrint=True): 

52 """ 

53 @param name: Time name, will be printed together with statistics 

54 @param doPrint: if True then print statistics on exist from context 

55 """ 

56 self._name = name 

57 self._print = doPrint 

58 

59 self._startReal = None 

60 self._startUser = None 

61 self._startSys = None 

62 self._sumReal = 0. 

63 self._sumUser = 0. 

64 self._sumSys = 0. 

65 

66 def start(self): 

67 """ 

68 Start timer. 

69 """ 

70 self._startReal = time.time() 

71 ru = resource.getrusage(resource.RUSAGE_SELF) 

72 self._startUser = ru.ru_utime 

73 self._startSys = ru.ru_stime 

74 return self 

75 

76 def stop(self): 

77 """ 

78 Stop timer. 

79 """ 

80 if self._startReal is not None: 

81 self._sumReal += time.time() - self._startReal 

82 ru = resource.getrusage(resource.RUSAGE_SELF) 

83 self._sumUser += ru.ru_utime - self._startUser 

84 self._sumSys += ru.ru_stime - self._startSys 

85 self._startReal = None 

86 self._startUser = None 

87 self._startSys = None 

88 return self 

89 

90 def dump(self): 

91 """ 

92 Dump timer statistics 

93 """ 

94 _LOG.info("%s", self) 

95 return self 

96 

97 def __str__(self): 

98 real = self._sumReal 

99 user = self._sumUser 

100 sys = self._sumSys 

101 if self._startReal is not None: 

102 real += time.time() - self._startReal 

103 ru = resource.getrusage(resource.RUSAGE_SELF) 

104 user += ru.ru_utime - self._startUser 

105 sys += ru.ru_stime - self._startSys 

106 info = "real=%.3f user=%.3f sys=%.3f" % (real, user, sys) 

107 if self._name: 

108 info = self._name + ": " + info 

109 return info 

110 

111 def __enter__(self): 

112 """ 

113 Enter context, start timer 

114 """ 

115 self.start() 

116 return self 

117 

118 def __exit__(self, exc_type, exc_val, exc_tb): 

119 """ 

120 Exit context, stop and dump timer 

121 """ 

122 if exc_type is None: 

123 self.stop() 

124 if self._print: 

125 self.dump() 

126 return False