##// END OF EJS Templates
regression: missing arg from 24ce8f0c0a39 dirstate.{walk,status} changes
Benoit Boissinot -
r10493:283f3b41 stable
parent child Browse files
Show More
@@ -1,152 +1,152 b''
1 1 # perf.py - performance test routines
2 2 '''helper extension to measure performance'''
3 3
4 4 from mercurial import cmdutil, match, commands
5 5 import time, os, sys
6 6
7 7 def timer(func, title=None):
8 8 results = []
9 9 begin = time.time()
10 10 count = 0
11 11 while 1:
12 12 ostart = os.times()
13 13 cstart = time.time()
14 14 r = func()
15 15 cstop = time.time()
16 16 ostop = os.times()
17 17 count += 1
18 18 a, b = ostart, ostop
19 19 results.append((cstop - cstart, b[0] - a[0], b[1]-a[1]))
20 20 if cstop - begin > 3 and count >= 100:
21 21 break
22 22 if cstop - begin > 10 and count >= 3:
23 23 break
24 24 if title:
25 25 sys.stderr.write("! %s\n" % title)
26 26 if r:
27 27 sys.stderr.write("! result: %s\n" % r)
28 28 m = min(results)
29 29 sys.stderr.write("! wall %f comb %f user %f sys %f (best of %d)\n"
30 30 % (m[0], m[1] + m[2], m[1], m[2], count))
31 31
32 32 def perfwalk(ui, repo, *pats):
33 33 try:
34 34 m = cmdutil.match(repo, pats, {})
35 35 timer(lambda: len(list(repo.dirstate.walk(m, [], True, False))))
36 36 except:
37 37 try:
38 38 m = cmdutil.match(repo, pats, {})
39 39 timer(lambda: len([b for a, b, c in repo.dirstate.statwalk([], m)]))
40 40 except:
41 41 timer(lambda: len(list(cmdutil.walk(repo, pats, {}))))
42 42
43 43 def perfstatus(ui, repo, *pats):
44 44 #m = match.always(repo.root, repo.getcwd())
45 #timer(lambda: sum(map(len, repo.dirstate.status(m, False, False, False))))
45 #timer(lambda: sum(map(len, repo.dirstate.status(m, [], False, False, False))))
46 46 timer(lambda: sum(map(len, repo.status())))
47 47
48 48 def perfheads(ui, repo):
49 49 timer(lambda: len(repo.changelog.heads()))
50 50
51 51 def perftags(ui, repo):
52 52 import mercurial.changelog, mercurial.manifest
53 53 def t():
54 54 repo.changelog = mercurial.changelog.changelog(repo.sopener)
55 55 repo.manifest = mercurial.manifest.manifest(repo.sopener)
56 56 repo._tags = None
57 57 return len(repo.tags())
58 58 timer(t)
59 59
60 60 def perfdirstate(ui, repo):
61 61 "a" in repo.dirstate
62 62 def d():
63 63 repo.dirstate.invalidate()
64 64 "a" in repo.dirstate
65 65 timer(d)
66 66
67 67 def perfdirstatedirs(ui, repo):
68 68 "a" in repo.dirstate
69 69 def d():
70 70 "a" in repo.dirstate._dirs
71 71 del repo.dirstate._dirs
72 72 timer(d)
73 73
74 74 def perfmanifest(ui, repo):
75 75 def d():
76 76 t = repo.manifest.tip()
77 77 m = repo.manifest.read(t)
78 78 repo.manifest.mapcache = None
79 79 repo.manifest._cache = None
80 80 timer(d)
81 81
82 82 def perfindex(ui, repo):
83 83 import mercurial.changelog
84 84 def d():
85 85 t = repo.changelog.tip()
86 86 repo.changelog = mercurial.changelog.changelog(repo.sopener)
87 87 repo.changelog._loadindexmap()
88 88 timer(d)
89 89
90 90 def perfstartup(ui, repo):
91 91 cmd = sys.argv[0]
92 92 def d():
93 93 os.system("HGRCPATH= %s version -q > /dev/null" % cmd)
94 94 timer(d)
95 95
96 96 def perfparents(ui, repo):
97 97 nl = [repo.changelog.node(i) for i in xrange(1000)]
98 98 def d():
99 99 for n in nl:
100 100 repo.changelog.parents(n)
101 101 timer(d)
102 102
103 103 def perflookup(ui, repo, rev):
104 104 timer(lambda: len(repo.lookup(rev)))
105 105
106 106 def perflog(ui, repo, **opts):
107 107 ui.pushbuffer()
108 108 timer(lambda: commands.log(ui, repo, rev=[], date='', user='',
109 109 copies=opts.get('rename')))
110 110 ui.popbuffer()
111 111
112 112 def perftemplating(ui, repo):
113 113 ui.pushbuffer()
114 114 timer(lambda: commands.log(ui, repo, rev=[], date='', user='',
115 115 template='{date|shortdate} [{rev}:{node|short}]'
116 116 ' {author|person}: {desc|firstline}\n'))
117 117 ui.popbuffer()
118 118
119 119 def perfdiffwd(ui, repo):
120 120 """Profile diff of working directory changes"""
121 121 options = {
122 122 'w': 'ignore_all_space',
123 123 'b': 'ignore_space_change',
124 124 'B': 'ignore_blank_lines',
125 125 }
126 126
127 127 for diffopt in ('', 'w', 'b', 'B', 'wB'):
128 128 opts = dict((options[c], '1') for c in diffopt)
129 129 def d():
130 130 ui.pushbuffer()
131 131 commands.diff(ui, repo, **opts)
132 132 ui.popbuffer()
133 133 title = 'diffopts: %s' % (diffopt and ('-' + diffopt) or 'none')
134 134 timer(d, title)
135 135
136 136 cmdtable = {
137 137 'perflookup': (perflookup, []),
138 138 'perfparents': (perfparents, []),
139 139 'perfstartup': (perfstartup, []),
140 140 'perfstatus': (perfstatus, []),
141 141 'perfwalk': (perfwalk, []),
142 142 'perfmanifest': (perfmanifest, []),
143 143 'perfindex': (perfindex, []),
144 144 'perfheads': (perfheads, []),
145 145 'perftags': (perftags, []),
146 146 'perfdirstate': (perfdirstate, []),
147 147 'perfdirstatedirs': (perfdirstate, []),
148 148 'perflog': (perflog,
149 149 [('', 'rename', False, 'ask log to follow renames')]),
150 150 'perftemplating': (perftemplating, []),
151 151 'perfdiffwd': (perfdiffwd, []),
152 152 }
@@ -1,86 +1,86 b''
1 1 # __init__.py - inotify-based status acceleration for Linux
2 2 #
3 3 # Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com>
4 4 # Copyright 2007, 2008 Brendan Cully <brendan@kublai.com>
5 5 #
6 6 # This software may be used and distributed according to the terms of the
7 7 # GNU General Public License version 2 or any later version.
8 8
9 9 '''accelerate status report using Linux's inotify service'''
10 10
11 11 # todo: socket permissions
12 12
13 13 from mercurial.i18n import _
14 14 import server
15 15 from client import client, QueryFailed
16 16
17 17 def serve(ui, repo, **opts):
18 18 '''start an inotify server for this repository'''
19 19 server.start(ui, repo.dirstate, repo.root, opts)
20 20
21 21 def debuginotify(ui, repo, **opts):
22 22 '''debugging information for inotify extension
23 23
24 24 Prints the list of directories being watched by the inotify server.
25 25 '''
26 26 cli = client(ui, repo)
27 27 response = cli.debugquery()
28 28
29 29 ui.write(_('directories being watched:\n'))
30 30 for path in response:
31 31 ui.write((' %s/\n') % path)
32 32
33 33 def reposetup(ui, repo):
34 34 if not hasattr(repo, 'dirstate'):
35 35 return
36 36
37 37 class inotifydirstate(repo.dirstate.__class__):
38 38
39 39 # We'll set this to false after an unsuccessful attempt so that
40 40 # next calls of status() within the same instance don't try again
41 41 # to start an inotify server if it won't start.
42 42 _inotifyon = True
43 43
44 44 def status(self, match, subrepos, ignored, clean, unknown=True):
45 45 files = match.files()
46 46 if '.' in files:
47 47 files = []
48 48 if self._inotifyon and not ignored and not subrepos and not self._dirty:
49 49 cli = client(ui, repo)
50 50 try:
51 51 result = cli.statusquery(files, match, False,
52 52 clean, unknown)
53 53 except QueryFailed, instr:
54 54 ui.debug(str(instr))
55 55 # don't retry within the same hg instance
56 56 inotifydirstate._inotifyon = False
57 57 pass
58 58 else:
59 59 if ui.config('inotify', 'debug'):
60 60 r2 = super(inotifydirstate, self).status(
61 match, False, clean, unknown)
61 match, [], False, clean, unknown)
62 62 for c, a, b in zip('LMARDUIC', result, r2):
63 63 for f in a:
64 64 if f not in b:
65 65 ui.warn('*** inotify: %s +%s\n' % (c, f))
66 66 for f in b:
67 67 if f not in a:
68 68 ui.warn('*** inotify: %s -%s\n' % (c, f))
69 69 result = r2
70 70 return result
71 71 return super(inotifydirstate, self).status(
72 72 match, subrepos, ignored, clean, unknown)
73 73
74 74 repo.dirstate.__class__ = inotifydirstate
75 75
76 76 cmdtable = {
77 77 'debuginotify':
78 78 (debuginotify, [], ('hg debuginotify')),
79 79 '^inserve':
80 80 (serve,
81 81 [('d', 'daemon', None, _('run server in background')),
82 82 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
83 83 ('t', 'idle-timeout', '', _('minutes to sit idle before exiting')),
84 84 ('', 'pid-file', '', _('name of file to write process ID to'))],
85 85 _('hg inserve [OPTION]...')),
86 86 }
General Comments 0
You need to be logged in to leave comments. Login now