Mercurial > public > mercurial-scm > hg
diff mercurial/scmutil.py @ 45515:89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
In a pathological `hg log` case, we end up executing the branchmap validity
checking twice per commit displayed. Or maybe we always do, and I just noticed
because it's really slow in this repo for some reason.
Before:
```
Time (mean ? ?): 9.816 s ? 0.071 s [User: 9.435 s, System: 0.392 s]
Range (min ? max): 9.709 s ? 9.920 s
```
After:
```
Time (mean ? ?): 8.671 s ? 0.078 s [User: 8.309 s, System: 0.392 s]
Range (min ? max): 8.594 s ? 8.816 s
```
Differential Revision: https://phab.mercurial-scm.org/D9023
author | Kyle Lippincott <spectral@google.com> |
---|---|
date | Wed, 16 Sep 2020 12:13:46 -0700 |
parents | d252f51ab032 |
children | 9b16bb3b2349 |
line wrap: on
line diff
--- a/mercurial/scmutil.py Mon Sep 21 15:05:38 2020 -0400 +++ b/mercurial/scmutil.py Wed Sep 16 12:13:46 2020 -0700 @@ -364,13 +364,15 @@ cl = repo.changelog if not cl.filteredrevs: return None - key = None - revs = sorted(r for r in cl.filteredrevs if r <= maxrev) - if revs: - s = hashutil.sha1() - for rev in revs: - s.update(b'%d;' % rev) - key = s.digest() + key = cl._filteredrevs_hashcache.get(maxrev) + if not key: + revs = sorted(r for r in cl.filteredrevs if r <= maxrev) + if revs: + s = hashutil.sha1() + for rev in revs: + s.update(b'%d;' % rev) + key = s.digest() + cl._filteredrevs_hashcache[maxrev] = key return key