diff mercurial/smartset.py @ 32821:9b7d615108d7

smartset: micro optimize spanset.slice() to narrow range accordingly -1ms isn't significant, but seems not bad. revset #0: limit(0:9999, 100, 9000) 6) 0.001145 7) 0.000214 revset #3: last(0:9999, 100) 6) 0.000197 7) 0.000171
author Yuya Nishihara <yuya@tcha.org>
date Fri, 10 Apr 2015 00:14:16 +0900
parents 653d60455dbe
children 27ba0d8dc26c
line wrap: on
line diff
--- a/mercurial/smartset.py	Thu Apr 09 23:56:06 2015 +0900
+++ b/mercurial/smartset.py	Fri Apr 10 00:14:16 2015 +0900
@@ -1056,6 +1056,18 @@
             return x
         return None
 
+    def _slice(self, start, stop):
+        if self._hiddenrevs:
+            # unoptimized since all hidden revisions in range has to be scanned
+            return super(_spanset, self)._slice(start, stop)
+        if self._ascending:
+            x = min(self._start + start, self._end)
+            y = min(self._start + stop, self._end)
+        else:
+            x = max(self._end - stop, self._start)
+            y = max(self._end - start, self._start)
+        return _spanset(x, y, self._ascending, self._hiddenrevs)
+
     def __repr__(self):
         d = {False: '-', True: '+'}[self._ascending]
         return '<%s%s %d:%d>' % (type(self).__name__.lstrip('_'), d,