##// END OF EJS Templates
hgperf: update to conform with import style checks
Augie Fackler -
r33893:78f644fd default
parent child Browse files
Show More
@@ -1,98 +1,100 b''
1 1 #!/usr/bin/env python
2 2 #
3 3 # hgperf - measure performance of Mercurial commands
4 4 #
5 5 # Copyright 2014 Matt Mackall <mpm@selenic.com>
6 6 #
7 7 # This software may be used and distributed according to the terms of the
8 8 # GNU General Public License version 2 or any later version.
9 9
10 10 '''measure performance of Mercurial commands
11 11
12 12 Using ``hgperf`` instead of ``hg`` measures performance of the target
13 13 Mercurial command. For example, the execution below measures
14 14 performance of :hg:`heads --topo`::
15 15
16 16 $ hgperf heads --topo
17 17
18 18 All command output via ``ui`` is suppressed, and just measurement
19 19 result is displayed: see also "perf" extension in "contrib".
20 20
21 21 Costs of processing before dispatching to the command function like
22 22 below are not measured::
23 23
24 24 - parsing command line (e.g. option validity check)
25 25 - reading configuration files in
26 26
27 27 But ``pre-`` and ``post-`` hook invocation for the target command is
28 28 measured, even though these are invoked before or after dispatching to
29 29 the command function, because these may be required to repeat
30 30 execution of the target command correctly.
31 31 '''
32 32
33 33 import os
34 34 import sys
35 35
36 36 libdir = '@LIBDIR@'
37 37
38 38 if libdir != '@' 'LIBDIR' '@':
39 39 if not os.path.isabs(libdir):
40 40 libdir = os.path.join(os.path.dirname(os.path.realpath(__file__)),
41 41 libdir)
42 42 libdir = os.path.abspath(libdir)
43 43 sys.path.insert(0, libdir)
44 44
45 45 # enable importing on demand to reduce startup time
46 46 try:
47 47 from mercurial import demandimport; demandimport.enable()
48 48 except ImportError:
49 49 import sys
50 50 sys.stderr.write("abort: couldn't find mercurial libraries in [%s]\n" %
51 51 ' '.join(sys.path))
52 52 sys.stderr.write("(check your install and PYTHONPATH)\n")
53 53 sys.exit(-1)
54 54
55 import mercurial.util
56 import mercurial.dispatch
55 from mercurial import (
56 dispatch,
57 util,
58 )
57 59
58 60 def timer(func, title=None):
59 61 results = []
60 begin = mercurial.util.timer()
62 begin = util.timer()
61 63 count = 0
62 64 while True:
63 65 ostart = os.times()
64 cstart = mercurial.util.timer()
66 cstart = util.timer()
65 67 r = func()
66 cstop = mercurial.util.timer()
68 cstop = util.timer()
67 69 ostop = os.times()
68 70 count += 1
69 71 a, b = ostart, ostop
70 72 results.append((cstop - cstart, b[0] - a[0], b[1]-a[1]))
71 73 if cstop - begin > 3 and count >= 100:
72 74 break
73 75 if cstop - begin > 10 and count >= 3:
74 76 break
75 77 if title:
76 78 sys.stderr.write("! %s\n" % title)
77 79 if r:
78 80 sys.stderr.write("! result: %s\n" % r)
79 81 m = min(results)
80 82 sys.stderr.write("! wall %f comb %f user %f sys %f (best of %d)\n"
81 83 % (m[0], m[1] + m[2], m[1], m[2], count))
82 84
83 orgruncommand = mercurial.dispatch.runcommand
85 orgruncommand = dispatch.runcommand
84 86
85 87 def runcommand(lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions):
86 88 ui.pushbuffer()
87 89 lui.pushbuffer()
88 90 timer(lambda : orgruncommand(lui, repo, cmd, fullargs, ui,
89 91 options, d, cmdpats, cmdoptions))
90 92 ui.popbuffer()
91 93 lui.popbuffer()
92 94
93 mercurial.dispatch.runcommand = runcommand
95 dispatch.runcommand = runcommand
94 96
95 97 for fp in (sys.stdin, sys.stdout, sys.stderr):
96 mercurial.util.setbinary(fp)
98 util.setbinary(fp)
97 99
98 mercurial.dispatch.run()
100 dispatch.run()
General Comments 0
You need to be logged in to leave comments. Login now