# HG changeset patch # User Yuya Nishihara <y...@tcha.org> # Date 1540030385 -32400 # Sat Oct 20 19:13:05 2018 +0900 # Node ID 6a3a42dfcdd0ccb628ae3b8f3129b26db32a7ff0 # Parent dce0e0f78f0f10578a17b586fe061e1985dd5c5f filecache: use try-except for faster __dict__ lookup
Python function call is slow, and the cost could be significant here. $ hg perfrevset 'branch(tip)' -R mercurial (orig) wall 0.139511 comb 0.140000 user 0.140000 sys 0.000000 (best of 66) (this) wall 0.114195 comb 0.110000 user 0.110000 sys 0.000000 (best of 81) diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -91,7 +91,13 @@ class _basefilecache(scmutil.filecache): def __get__(self, repo, type=None): if repo is None: return self - return super(_basefilecache, self).__get__(repo.unfiltered(), type) + # inlined the fast path as the cost of function call matters + unfi = repo.unfiltered() + try: + return unfi.__dict__[self.sname] + except KeyError: + pass + return super(_basefilecache, self).__get__(unfi, type) def __set__(self, repo, value): return super(_basefilecache, self).__set__(repo.unfiltered(), value) def __delete__(self, repo): diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -1292,9 +1292,10 @@ class filecache(object): if obj is None: return self # do we need to check if the file changed? - if self.sname in obj.__dict__: - assert self.name in obj._filecache, self.name + try: return obj.__dict__[self.sname] + except KeyError: + pass entry = obj._filecache.get(self.name) _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel