Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revset.py @ 22450:95af98616aa7
revset: make parents() O(number of parents)
Strip executes a revset like this:
max(parents(_intlist('1234\x001235')) - _intlist('1234\x001235'))
Previously the parents() revset would do 'subset & parents' which iterates over
each item in the subset and checks if it's in parents. subset is usually the
entire repo (a spanset) so this takes a while.
Reversing the parameters to be 'parents & subset' means the operation becomes
O(number of parents) instead of O(size of repo). It also means the result gets
evaluated immediately (since parents isn't a lazy set), but I think this is a
win in most scenarios.
This shaves 0.3 seconds off strip (amend/histedit/rebase/etc) for large repositories.
revset #0: parents(20000)
0) obsolete feature not enabled but 54243 markers found!
! wall 0.006256 comb 0.010000 user 0.010000 sys 0.000000 (best of 289)
1) obsolete feature not enabled but 54243 markers found!
! wall 0.000391 comb 0.000000 user 0.000000 sys 0.000000 (best of 4323)
author | Durham Goode <durham@fb.com> |
---|---|
date | Fri, 12 Sep 2014 15:00:51 -0700 |
parents | da05fe01170b |
children | 186fd06283b4 |
comparison
equal
deleted
inserted
replaced
22449:da05fe01170b | 22450:95af98616aa7 |
---|---|
1234 | 1234 |
1235 ps = set() | 1235 ps = set() |
1236 cl = repo.changelog | 1236 cl = repo.changelog |
1237 for r in getset(repo, spanset(repo), x): | 1237 for r in getset(repo, spanset(repo), x): |
1238 ps.update(cl.parentrevs(r)) | 1238 ps.update(cl.parentrevs(r)) |
1239 return subset & ps | 1239 return baseset(ps) & subset |
1240 | 1240 |
1241 def parentspec(repo, subset, x, n): | 1241 def parentspec(repo, subset, x, n): |
1242 """``set^0`` | 1242 """``set^0`` |
1243 The set. | 1243 The set. |
1244 ``set^1`` (or ``set^``), ``set^2`` | 1244 ``set^1`` (or ``set^``), ``set^2`` |