Source code for eWRT.util.timing

#!/usr/bin/env python

''' @package eWRT.util.timing
    timing of abitrary method calls

    Examples: see unittests
'''

# (C)opyrights 2010 - 2015 by Albert Weichselbraun <albert@weichselbraun.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

__author__ = "Albert Weichselbraun"
__copyright__ = "GPL"

from time import time
from unittest import TestCase

[docs]class Timed(object): ''' decorator class used to time functions ''' def __init__(self, f): self.f = f self.clear() def __call__(self, *args, **kargs): ''' calls the timed function and computes all necessary statistics ''' self.numberOfCalls += 1 beforeCall = time() retVal = self.f(*args, **kargs) self.lastCallDuration = time() - beforeCall self.totalCallDuration += self.lastCallDuration return retVal
[docs] def clear(self): self.startTime = time() self.lastCallDuration = None self.totalCallDuration = 0. self.numberOfCalls = 0
[docs]class TimedTest(TestCase): @Timed def _timeFunction(self, a, b): [x for x in range(1000)] return a + b
[docs] def testReturnValue(self): assert self._timeFunction(self, 2, 8) == 10
[docs] def testCallStatistics(self): NR_CALL = 5000 for x in range(NR_CALL): self._timeFunction(self, x, 10*x) assert self._timeFunction.numberOfCalls == NR_CALL self.assertAlmostEqual(self._timeFunction.totalCallDuration/NR_CALL, self._timeFunction.lastCallDuration, 1)
[docs] def testClearCallStatistics(self): NR_CALL = 5000 for x in range(NR_CALL): self._timeFunction(self, x, 10*x) self._timeFunction.clear() assert self._timeFunction.totalCallDuration == 0. assert self._timeFunction.numberOfCalls == 0