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.