Mercurial > hg
comparison 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 |
comparison
equal
deleted
inserted
replaced
45514:93a0f3ba36bb | 45515:89f0d9f87701 |
---|---|
362 that SHA-1 digest. | 362 that SHA-1 digest. |
363 """ | 363 """ |
364 cl = repo.changelog | 364 cl = repo.changelog |
365 if not cl.filteredrevs: | 365 if not cl.filteredrevs: |
366 return None | 366 return None |
367 key = None | 367 key = cl._filteredrevs_hashcache.get(maxrev) |
368 revs = sorted(r for r in cl.filteredrevs if r <= maxrev) | 368 if not key: |
369 if revs: | 369 revs = sorted(r for r in cl.filteredrevs if r <= maxrev) |
370 s = hashutil.sha1() | 370 if revs: |
371 for rev in revs: | 371 s = hashutil.sha1() |
372 s.update(b'%d;' % rev) | 372 for rev in revs: |
373 key = s.digest() | 373 s.update(b'%d;' % rev) |
374 key = s.digest() | |
375 cl._filteredrevs_hashcache[maxrev] = key | |
374 return key | 376 return key |
375 | 377 |
376 | 378 |
377 def walkrepos(path, followsym=False, seen_dirs=None, recurse=False): | 379 def walkrepos(path, followsym=False, seen_dirs=None, recurse=False): |
378 '''yield every hg repository under path, always recursively. | 380 '''yield every hg repository under path, always recursively. |