Mercurial > public > mercurial-scm > hg-stable
diff tests/test-fastannotate-perfhack.t @ 39238:1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
I made as few changes as I could to get the tests to pass, but this
was a bit involved due to some churn in the blame code since someone
last gave fastannotate any TLC.
There's still follow-up work here to rip out support for old versions
of hg and to integrate the protocol with modern standards.
Some performance numbers (all on my 2016 MacBook Pro with a 2.6Ghz i7):
Mercurial mercurial/manifest.py
traditional blame
time: real 1.050 secs (user 0.990+0.000 sys 0.060+0.000)
build cache
time: real 5.900 secs (user 5.720+0.000 sys 0.110+0.000)
fastannotate
time: real 0.120 secs (user 0.100+0.000 sys 0.020+0.000)
Mercurial mercurial/localrepo.py
traditional blame
time: real 3.330 secs (user 3.220+0.000 sys 0.070+0.000)
build cache
time: real 30.610 secs (user 30.190+0.000 sys 0.230+0.000)
fastannotate
time: real 0.180 secs (user 0.160+0.000 sys 0.020+0.000)
mozilla-central dom/ipc/ContentParent.cpp
traditional blame
time: real 7.640 secs (user 7.210+0.000 sys 0.380+0.000)
build cache
time: real 98.650 secs (user 97.000+0.000 sys 0.950+0.000)
fastannotate
time: real 1.580 secs (user 1.340+0.000 sys 0.240+0.000)
mozilla-central dom/base/nsDocument.cpp
traditional blame
time: real 17.110 secs (user 16.490+0.000 sys 0.500+0.000)
build cache
time: real 399.750 secs (user 394.520+0.000 sys 2.610+0.000)
fastannotate
time: real 1.780 secs (user 1.530+0.000 sys 0.240+0.000)
So building the cache is expensive (but might be faster with xdiff
enabled), but the blame results are *way* faster.
Differential Revision: https://phab.mercurial-scm.org/D3994
author | Augie Fackler <augie@google.com> |
---|---|
date | Mon, 30 Jul 2018 22:50:00 -0400 |
parents | |
children | 7116fc614cfc |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-fastannotate-perfhack.t Mon Jul 30 22:50:00 2018 -0400 @@ -0,0 +1,182 @@ + $ cat >> $HGRCPATH << EOF + > [extensions] + > fastannotate= + > [fastannotate] + > perfhack=1 + > EOF + + $ HGMERGE=true; export HGMERGE + + $ hg init repo + $ cd repo + +a simple merge case + + $ echo 1 > a + $ hg commit -qAm 'append 1' + $ echo 2 >> a + $ hg commit -m 'append 2' + $ echo 3 >> a + $ hg commit -m 'append 3' + $ hg up 1 -q + $ cat > a << EOF + > 0 + > 1 + > 2 + > EOF + $ hg commit -qm 'insert 0' + $ hg merge 2 -q + $ echo 4 >> a + $ hg commit -m merge + $ hg log -G -T '{rev}: {desc}' + @ 4: merge + |\ + | o 3: insert 0 + | | + o | 2: append 3 + |/ + o 1: append 2 + | + o 0: append 1 + + $ hg fastannotate a + 3: 0 + 0: 1 + 1: 2 + 2: 3 + 4: 4 + $ hg fastannotate -r 0 a + 0: 1 + $ hg fastannotate -r 1 a + 0: 1 + 1: 2 + $ hg fastannotate -udnclf a + test 3 d641cb51f61e Thu Jan 01 00:00:00 1970 +0000 a:1: 0 + test 0 4994017376d3 Thu Jan 01 00:00:00 1970 +0000 a:1: 1 + test 1 e940cb6d9a06 Thu Jan 01 00:00:00 1970 +0000 a:2: 2 + test 2 26162a884ba6 Thu Jan 01 00:00:00 1970 +0000 a:3: 3 + test 4 3ad7bcd2815f Thu Jan 01 00:00:00 1970 +0000 a:5: 4 + $ hg fastannotate --linear a + 3: 0 + 0: 1 + 1: 2 + 4: 3 + 4: 4 + +incrementally updating + + $ hg fastannotate -r 0 a --debug + fastannotate: a: using fast path (resolved fctx: True) + 0: 1 + $ hg fastannotate -r 0 a --debug --rebuild + fastannotate: a: 1 new changesets in the main branch + 0: 1 + $ hg fastannotate -r 1 a --debug + fastannotate: a: 1 new changesets in the main branch + 0: 1 + 1: 2 + $ hg fastannotate -r 3 a --debug + fastannotate: a: 1 new changesets in the main branch + 3: 0 + 0: 1 + 1: 2 + $ hg fastannotate -r 4 a --debug + fastannotate: a: 1 new changesets in the main branch + 3: 0 + 0: 1 + 1: 2 + 2: 3 + 4: 4 + $ hg fastannotate -r 1 a --debug + fastannotate: a: using fast path (resolved fctx: True) + 0: 1 + 1: 2 + +rebuild happens automatically if unable to update + + $ hg fastannotate -r 2 a --debug + fastannotate: a: cache broken and deleted + fastannotate: a: 3 new changesets in the main branch + 0: 1 + 1: 2 + 2: 3 + +config option "fastannotate.mainbranch" + + $ hg fastannotate -r 1 --rebuild --config fastannotate.mainbranch=tip a --debug + fastannotate: a: 4 new changesets in the main branch + 0: 1 + 1: 2 + $ hg fastannotate -r 4 a --debug + fastannotate: a: using fast path (resolved fctx: True) + 3: 0 + 0: 1 + 1: 2 + 2: 3 + 4: 4 + +rename + + $ hg mv a b + $ cat > b << EOF + > 0 + > 11 + > 3 + > 44 + > EOF + $ hg commit -m b -q + $ hg fastannotate -ncf --long-hash b + 3 d641cb51f61e331c44654104301f8154d7865c89 a: 0 + 5 d44dade239915bc82b91e4556b1257323f8e5824 b: 11 + 2 26162a884ba60e8c87bf4e0d6bb8efcc6f711a4e a: 3 + 5 d44dade239915bc82b91e4556b1257323f8e5824 b: 44 + $ hg fastannotate -r 26162a884ba60e8c87bf4e0d6bb8efcc6f711a4e a + 0: 1 + 1: 2 + 2: 3 + +fastannotate --deleted + + $ hg fastannotate --deleted -nf b + 3 a: 0 + 5 b: 11 + 0 a: -1 + 1 a: -2 + 2 a: 3 + 5 b: 44 + 4 a: -4 + $ hg fastannotate --deleted -r 3 -nf a + 3 a: 0 + 0 a: 1 + 1 a: 2 + +file and directories with ".l", ".m" suffixes + + $ cd .. + $ hg init repo2 + $ cd repo2 + + $ mkdir a.l b.m c.lock a.l.hg b.hg + $ for i in a b c d d.l d.m a.l/a b.m/a c.lock/a a.l.hg/a b.hg/a; do + > echo $i > $i + > done + $ hg add . -q + $ hg commit -m init + $ hg fastannotate a.l/a b.m/a c.lock/a a.l.hg/a b.hg/a d.l d.m a b c d + 0: a + 0: a.l.hg/a + 0: a.l/a + 0: b + 0: b.hg/a + 0: b.m/a + 0: c + 0: c.lock/a + 0: d + 0: d.l + 0: d.m + +empty file + + $ touch empty + $ hg commit -A empty -m empty + $ hg fastannotate empty