Revset-based implementation of log command
Patrick Mézard
patrick at mezard.eu
Thu Apr 12 14:52:09 CDT 2012
Hello,
I have an implementation of log command using the revset work done for graphlog, passing the test suite, here:
http://mezard.eu/hg/hg-does-it-look-good-for-you/
Most of the patches have been submitted for review, the remaining ones update log() to use the revset functions and add a simple benchmarking script. It executes a sequence of log queries on a repository using different hg versions, and measure the time to first line and total time. See below for runs on Mercurial and Mozilla repositories.
We can see that:
1- Globally, the revset version is at least marginally faster than the current one.
2- The exception is when we add or-ed predicates like "--user foo --user bar". The changelog is being read multiple times instead of once.
3- The revset version computes all revisions before displaying anything which explains the poor "first line" timings.
[2] could be fixed by cheating an creating a revset matching multiple predicated at once, like the prep() closure in commands.log().
[3] could be fixed by turning revset.match() into a generator. It is not clear which revset functions can operate on a "subset" generator rather than a list but the simple ones like user() definitely can. Also, I have no idea how much overhead this will add compared to the list version.
Comments?
On Mercurial repository:
first line total
* hg log -l 10
/Users/pmezard/bin/hg 0.145s 0.161s
/Users/pmezard/bin/hgdev 0.137s 0.146s
* hg log -u sstallion
/Users/pmezard/bin/hg 0.147s 1.399s
/Users/pmezard/bin/hgdev 1.038s 1.050s
* hg log -u sstallion -u qwerty360
/Users/pmezard/bin/hg 0.147s 1.452s
/Users/pmezard/bin/hgdev 1.940s 1.953s
* hg log -l 10 -u mezard
/Users/pmezard/bin/hg 0.145s 0.160s
/Users/pmezard/bin/hgdev 1.037s 1.050s
* hg log -b stable
/Users/pmezard/bin/hg 0.151s 1.446s
/Users/pmezard/bin/hgdev 1.030s 1.332s
* hg log --follow
/Users/pmezard/bin/hg 0.146s 2.606s
/Users/pmezard/bin/hgdev 0.185s 2.348s
* hg log --follow-first
/Users/pmezard/bin/hg 0.145s 1.636s
/Users/pmezard/bin/hgdev 0.162s 1.468s
* hg log --follow -r1000:5000
/Users/pmezard/bin/hg 0.139s 0.732s
/Users/pmezard/bin/hgdev 0.216s 0.731s
* hg log --follow -r5000:1000
/Users/pmezard/bin/hg 0.137s 0.737s
/Users/pmezard/bin/hgdev 0.151s 0.675s
* hg log --follow mercurial/commands.py -u mg -u pmezard
/Users/pmezard/bin/hg 0.178s 0.401s
/Users/pmezard/bin/hgdev 0.485s 0.532s
* hg log -b default --no-merge
/Users/pmezard/bin/hg 0.147s 2.197s
/Users/pmezard/bin/hgdev 0.969s 2.593s
* hg log -l 1000
/Users/pmezard/bin/hg 0.149s 0.318s
/Users/pmezard/bin/hgdev 0.140s 0.289s
On Mozilla repository:
* hg log -u rnewman
/Users/pmezard/bin/hg 0.269s 7.392s
/Users/pmezard/bin/hgdev 5.538s 5.634s
* hg log -u rnewman -u girard
/Users/pmezard/bin/hg 0.269s 7.702s
/Users/pmezard/bin/hgdev 10.938s 11.076s
* hg log -l 10
/Users/pmezard/bin/hg 0.272s 0.314s
/Users/pmezard/bin/hgdev 0.200s 0.211s
* hg log -l 10 -u rnewman
/Users/pmezard/bin/hg 0.272s 0.391s
/Users/pmezard/bin/hgdev 5.568s 5.606s
* hg log -b GECKO193a2_20100228_RELBRANCH
/Users/pmezard/bin/hg 2.375s 6.711s
/Users/pmezard/bin/hgdev 5.523s 5.563s
* hg log xulrunner
/Users/pmezard/bin/hg 5.899s 6.035s
/Users/pmezard/bin/hgdev 5.774s 5.878s
* hg log --follow xulrunner/build.mk
/Users/pmezard/bin/hg 0.452s 0.550s
/Users/pmezard/bin/hgdev 0.455s 0.577s
* hg log -u girard tools
/Users/pmezard/bin/hg 5.896s 6.059s
/Users/pmezard/bin/hgdev 5.870s 5.911s
* hg log -b COMM2000_20110314_RELBRANCH --copies
/Users/pmezard/bin/hg 2.259s 6.643s
/Users/pmezard/bin/hgdev 5.483s 5.520s
* hg log --follow
/Users/pmezard/bin/hg 0.276s 13.897s
/Users/pmezard/bin/hgdev 0.491s 12.466s
--
Patrick Mézard
More information about the Mercurial-devel
mailing list