bundle2: inline changegroup.readexactly()
Profiling reveals this loop is pretty tight. Literally any
function call elimination can make a big difference.
This commit inlines the relatively trivial changegroup.readexactly()
method inside the loop.
The results with `hg perfbundleread` on a bundle of the Firefox repo
speak for themselves:
! read(8k)
! wall 0.679730 comb 0.680000 user 0.140000 sys 0.540000 (best of 15)
! read(16k)
! wall 0.577228 comb 0.570000 user 0.080000 sys 0.490000 (best of 17)
! read(32k)
! wall 0.516060 comb 0.520000 user 0.040000 sys 0.480000 (best of 20)
! read(128k)
! wall 0.496378 comb 0.490000 user 0.010000 sys 0.480000 (best of 20)
! bundle2 iterparts()
! wall 3.460903 comb 3.460000 user 2.760000 sys 0.700000 (best of 3)
! wall 3.056811 comb 3.050000 user 2.340000 sys 0.710000 (best of 4)
! bundle2 iterparts() seekable
! wall 4.312722 comb 4.310000 user 3.480000 sys 0.830000 (best of 3)
! wall 4.007676 comb 4.000000 user 3.170000 sys 0.830000 (best of 3)
! bundle2 part seek()
! wall 6.754764 comb 6.740000 user 3.970000 sys 2.770000 (best of 3)
! wall 6.267110 comb 6.250000 user 3.480000 sys 2.770000 (best of 3)
! bundle2 part read(8k)
! wall 3.668004 comb 3.660000 user 2.960000 sys 0.700000 (best of 3)
! wall 3.404164 comb 3.400000 user 2.650000 sys 0.750000 (best of 3)
! bundle2 part read(16k)
! wall 3.489196 comb 3.480000 user 2.750000 sys 0.730000 (best of 3)
! wall 3.197972 comb 3.200000 user 2.490000 sys 0.710000 (best of 4)
! bundle2 part read(32k)
! wall 3.388569 comb 3.380000 user 2.640000 sys 0.740000 (best of 3)
! wall 3.060557 comb 3.060000 user 2.340000 sys 0.720000 (best of 4)
! bundle2 part read(128k)
! wall 3.276415 comb 3.270000 user 2.560000 sys 0.710000 (best of 4)
! wall 2.952209 comb 2.950000 user 2.230000 sys 0.720000 (best of 4)
Differential Revision: https://phab.mercurial-scm.org/D1392
Test adding .hgeol
$ cat >> $HGRCPATH <<EOF
> [diff]
> git = 1
> EOF
$ seteol () {
> if [ $1 = "LF" ]; then
> EOL='\n'
> else
> EOL='\r\n'
> fi
> }
$ makerepo () {
> echo
> echo "# ==== setup repository ===="
> echo '% hg init'
> hg init repo
> cd repo
> printf "first\nsecond\nthird\n" > a.txt
> hg commit -d '100 0' --addremove -m 'LF commit'
> cd ..
> }
$ dotest () {
> seteol $1
> echo
> echo "% hg clone repo repo-$1"
> hg clone repo repo-$1
> cd repo-$1
> cat > .hg/hgrc <<EOF
> [extensions]
> eol =
> [eol]
> native = LF
> EOF
> cat > .hgeol <<EOF
> [patterns]
> **.txt = native
> [repository]
> native = $1
> EOF
> echo '% hg add .hgeol'
> hg add .hgeol
> echo '% hg status'
> hg status
> echo '% hg commit'
> hg commit -d '200 0' -m 'Added .hgeol file'
> echo '% hg status'
> hg status
> echo '% hg tip -p'
> hg tip -p
> cd ..
> rm -r repo-$1
> }
$ makerepo
# ==== setup repository ====
% hg init
adding a.txt
$ dotest LF
% hg clone repo repo-LF
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
% hg add .hgeol
% hg status
A .hgeol
% hg commit
% hg status
% hg tip -p
changeset: 1:33503edb53b0
tag: tip
user: test
date: Thu Jan 01 00:03:20 1970 +0000
summary: Added .hgeol file
diff --git a/.hgeol b/.hgeol
new file mode 100644
--- /dev/null
+++ b/.hgeol
@@ -0,0 +1,4 @@
+[patterns]
+**.txt = native
+[repository]
+native = LF
$ dotest CRLF
% hg clone repo repo-CRLF
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
% hg add .hgeol
% hg status
M a.txt
A .hgeol
% hg commit
% hg status
% hg tip -p
changeset: 1:6e64eaa9eb23
tag: tip
user: test
date: Thu Jan 01 00:03:20 1970 +0000
summary: Added .hgeol file
diff --git a/.hgeol b/.hgeol
new file mode 100644
--- /dev/null
+++ b/.hgeol
@@ -0,0 +1,4 @@
+[patterns]
+**.txt = native
+[repository]
+native = CRLF
diff --git a/a.txt b/a.txt
--- a/a.txt
+++ b/a.txt
@@ -1,3 +1,3 @@
-first
-second
-third
+first\r (esc)
+second\r (esc)
+third\r (esc)
$ rm -r repo