comparison mercurial/revset.py @ 22503:300e07582e9b stable

revset: add an optimised baseset.__contains__ (issue4371) The baseset class is based on a python list. This means that base.__contains__ was absolutely as crappy as list.__contains__. We now rely on __contains__ from the underlying set. This will avoid having to explicitly convert the baseset to a set (using baseset.set()) whenever one want fast membership test. Apparently there is already code that forgot to do such conversions since we observe a massive speedup in some test. revset #25: roots((0::) - (0::tip)) 0) wall 2.079454 comb 2.080000 user 2.080000 sys 0.000000 (best of 5) 1) wall 0.132970 comb 0.130000 user 0.130000 sys 0.000000 (best of 65) No regression is observed in benchmarks. This change improve the issue4371 back to acceptable situation (but are still slower than manual substraction)
author Pierre-Yves David <pierre-yves.david@fb.com>
date Tue, 16 Sep 2014 23:59:29 -0700
parents 3efe3c2609e0
children c425b22a7ca5
comparison
equal deleted inserted replaced
22493:abf4e98b8ff2 22503:300e07582e9b
2226 This is part of the mandatory API for smartset.""" 2226 This is part of the mandatory API for smartset."""
2227 if not self._set: 2227 if not self._set:
2228 self._set = set(self) 2228 self._set = set(self)
2229 return self._set 2229 return self._set
2230 2230
2231 @util.propertycache
2232 def __contains__(self):
2233 return self.set().__contains__
2234
2231 def __sub__(self, other): 2235 def __sub__(self, other):
2232 """Returns a new object with the substraction of the two collections. 2236 """Returns a new object with the substraction of the two collections.
2233 2237
2234 This is part of the mandatory API for smartset.""" 2238 This is part of the mandatory API for smartset."""
2235 # If we are operating on 2 baseset, do the computation now since all 2239 # If we are operating on 2 baseset, do the computation now since all