util.chunkbuffer: special case reading everything
The new code results in simpler logic within the while loop. It is also
faster since we avoid performing operations on the queue and buf
collections. However, there shouldn't be any super hot loops for this
since the whole point of chunkbuffer is to avoid reading large amounts
of data at once. This does, however, make it easier to optimize
chunkbuffer in a subsequent patch.
--- a/mercurial/util.py Mon Oct 05 07:13:35 2015 +0200
+++ b/mercurial/util.py Mon Oct 05 16:28:12 2015 -0700
@@ -1292,10 +1292,13 @@
Returns less than L bytes if the iterator runs dry.
If size parameter is omitted, read everything"""
+ if l is None:
+ return ''.join(self.iter)
+
left = l
buf = []
queue = self._queue
- while left is None or left > 0:
+ while left > 0:
# refill the queue
if not queue:
target = 2**18
@@ -1308,9 +1311,8 @@
break
chunk = queue.popleft()
- if left is not None:
- left -= len(chunk)
- if left is not None and left < 0:
+ left -= len(chunk)
+ if left < 0:
queue.appendleft(chunk[left:])
buf.append(chunk[:left])
else: