Adding the orphaned options pages to the navigation
[chromium-blink-merge.git] / chrome / common / extensions / docs / server2 / timer.py
blob139ce81e3c2be70c0de7a107832060f637e1803c
1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 import time
8 class Timer(object):
9 '''A simple timer which starts when constructed and stops when Stop is called.
10 '''
12 def __init__(self):
13 self._start = time.time()
14 self._elapsed = None
16 def Stop(self):
17 '''Stops the timer. Must only be called once. Returns |self|.
18 '''
19 assert self._elapsed is None
20 self._elapsed = time.time() - self._start
21 return self
23 def With(self, other):
24 '''Returns a new stopped Timer with this Timer's elapsed time + |other|'s.
25 Both Timers must already be stopped.
26 '''
27 assert self._elapsed is not None
28 assert other._elapsed is not None
29 self_and_other = Timer()
30 self_and_other._start = min(self._start, other._start)
31 self_and_other._elapsed = self._elapsed + other._elapsed
32 return self_and_other
34 def FormatElapsed(self):
35 '''Returns the elapsed time as a string in a pretty format; as a whole
36 number in either seconds or milliseconds depending on which is more
37 appropriate. Must already be Stopped.
38 '''
39 assert self._elapsed is not None
40 elapsed = self._elapsed
41 if elapsed < 1:
42 elapsed = int(elapsed * 1000)
43 unit = 'ms'
44 else:
45 elapsed = int(elapsed)
46 unit = 'second' if elapsed == 1 else 'seconds'
47 return '%s %s' % (elapsed, unit)
50 def TimerClosure(closure, *args, **optargs):
51 '''A shorthand for timing a single function call. Returns a tuple of
52 (closure return value, timer).
53 '''
54 timer = Timer()
55 try:
56 return closure(*args, **optargs), timer
57 finally:
58 timer.Stop()