[PATCH 3 of 3] revlog: optimize _chunkraw when startrev==endrev
Gregory Szorc
gregory.szorc at gmail.com
Tue Nov 1 21:25:47 EDT 2016
# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1477244433 25200
# Sun Oct 23 10:40:33 2016 -0700
# Node ID 4c96a177e4ff6a63156ec8cf49483a78e4437756
# Parent 0c41c0cb9b1ef7df40a30672927229ac195b1c92
revlog: optimize _chunkraw when startrev==endrev
In many cases, _chunkraw() is called with startrev==endrev. When
this is true, we can avoid an extra index lookup and some other
minor operations.
On the mozilla-unified repo, `hg perfrevlogchunks -c` says this
has the following impact:
! read w/ reused fd
! wall 0.371846 comb 0.370000 user 0.350000 sys 0.020000 (best of 27)
! wall 0.337930 comb 0.330000 user 0.300000 sys 0.030000 (best of 30)
! read batch w/ reused fd
! wall 0.014952 comb 0.020000 user 0.000000 sys 0.020000 (best of 197)
! wall 0.014866 comb 0.010000 user 0.000000 sys 0.010000 (best of 196)
So, we've gone from ~25x slower than batch to ~22.5% slower.
At this point, there's probably not much else we can do except
implement an optimized function in the index itself, including in C.
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -1113,9 +1113,12 @@ class revlog(object):
# (functions are expensive).
index = self.index
istart = index[startrev]
- iend = index[endrev]
start = int(istart[0] >> 16)
- end = int(iend[0] >> 16) + iend[1]
+ if startrev == endrev:
+ end = start + istart[1]
+ else:
+ iend = index[endrev]
+ end = int(iend[0] >> 16) + iend[1]
if self._inline:
start += (startrev + 1) * self._io.size
More information about the Mercurial-devel
mailing list