perf: add threading capability to perfbdiff
Since we are releasing the GIL during diffing, it is interesting to see how a
thread pool would perform on diffing. We add a new `--threads` argument to
commands. Synchronizing the thread pool is a bit complex because we want to be
able to reuse it from one run to another.
On my computer (i7 with 4 cores + hyperthreading), I get the following data for
about 12000 revisions:
threads wall comb wall gain comb overhead
none 31.596715 31.59 0.00% 0.00%
1 31.621228 31.62 -0.08% 0.09%
2 16.406202 32.8 48.08% 3.83%
3 11.598334 34.76 63.29% 10.03%
4 9.205421 36.77 70.87% 16.40%
5 8.517604 42.51 73.04% 34.57%
6 7.94645 47.58 74.85% 50.62%
7 7.434972 51.92 76.47% 64.36%
8 7.070638 55.34 77.62% 75.18%
Compared to the feature disabled (threads=0), the overhead is negligible with
the threading code (threads=1), and the gain is already 48% with two threads.
#require test-repo
$ . "$TESTDIR/helpers-testrepo.sh"
$ cat <<'EOF' > scanhelptopics.py
> from __future__ import absolute_import, print_function
> import re
> import sys
> if sys.platform == "win32":
> import os, msvcrt
> msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
> topics = set()
> topicre = re.compile(r':hg:`help ([a-z0-9\-.]+)`')
> for fname in sys.argv:
> with open(fname) as f:
> topics.update(m.group(1) for m in topicre.finditer(f.read()))
> for s in sorted(topics):
> print(s)
> EOF
$ cd "$TESTDIR"/..
Check if ":hg:`help TOPIC`" is valid:
(use "xargs -n1 -t" to see which help commands are executed)
$ testrepohg files 'glob:{hgdemandimport,hgext,mercurial}/**/*.py' \
> | sed 's|\\|/|g' \
> | xargs $PYTHON "$TESTTMP/scanhelptopics.py" \
> | xargs -n1 hg help > /dev/null