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 = |
|
|
62 | begin = util.timer() | |
|
61 | 63 | count = 0 |
|
62 | 64 | while True: |
|
63 | 65 | ostart = os.times() |
|
64 |
cstart = |
|
|
66 | cstart = util.timer() | |
|
65 | 67 | r = func() |
|
66 |
cstop = |
|
|
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 = |
|
|
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 |
|
|
|
95 | dispatch.runcommand = runcommand | |
|
94 | 96 | |
|
95 | 97 | for fp in (sys.stdin, sys.stdout, sys.stderr): |
|
96 |
|
|
|
98 | util.setbinary(fp) | |
|
97 | 99 | |
|
98 |
|
|
|
100 | dispatch.run() |
General Comments 0
You need to be logged in to leave comments.
Login now