Mercurial > public > mercurial-scm > hg
comparison mercurial/revset.py @ 51573:de5bf3fe0233
revset: stop serializing node when using "%ln"
Turning hundred of thousand of node from node to hex and back can be slow? what
about we stop doing it?
In many case were we are using node id we should be using revision id. However
this is not a good reason to have a stupidly slow implementation of "%ln".
This caught my attention again because the phase discovery during push make an
extensive use of "%ln" or huge set. In absolute, that phase discovery probably
should use "%ld" and need to improves its algorithmic complexity, but improving
"%ln" seems simple and long overdue. This greatly speeds up `hg push` on
repository with many drafts.
Here are some relevant poulpe benchmarks:
### data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.push
# bin-env-vars.hg.flavor = default
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.explicit-rev = all-out-heads
# benchmark.variants.issue6528 = disabled
# benchmark.variants.protocol = ssh
# benchmark.variants.reuse-external-delta-parent = default
## benchmark.variants.revs = any-1-extra-rev
before: 44.235070
after: 20.416329 (-53.85%, -23.82)
## benchmark.variants.revs = any-100-extra-rev
before: 49.234697
after: 26.519829 (-46.14%, -22.71)
### benchmark.name = hg.command.bundle
# bin-env-vars.hg.flavor = default
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.revs = all
# benchmark.variants.type = none-streamv2
## data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog
before: 10.138396
after: 7.750458 (-23.55%, -2.39)
## data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog
before: 1.263859
after: 0.700229 (-44.60%, -0.56)
## data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog
before: 399.484481
after: 346.5089 (-13.26%, -52.98)
## data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog
before: 4.540080
after: 3.401700 (-25.07%, -1.14)
## data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog
before: 2.975765
after: 1.870798 (-37.13%, -1.10)
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 05 Apr 2024 11:05:54 +0200 |
parents | 18c8c18993f0 |
children | f4733654f144 |
comparison
equal
deleted
inserted
replaced
51572:f610d705c3ca | 51573:de5bf3fe0233 |
---|---|
147 return subset & x | 147 return subset & x |
148 else: | 148 else: |
149 return x & subset | 149 return x & subset |
150 | 150 |
151 | 151 |
152 def raw_node_set(repo, subset, x, order): | |
153 """argument is a list of nodeid, resolve and use them""" | |
154 nodes = _ordered_node_set(repo, x) | |
155 if order == followorder: | |
156 return subset & nodes | |
157 else: | |
158 return nodes & subset | |
159 | |
160 | |
161 def _ordered_node_set(repo, nodes): | |
162 if not nodes: | |
163 return baseset() | |
164 to_rev = repo.changelog.index.rev | |
165 return baseset([to_rev(r) for r in nodes]) | |
166 | |
167 | |
152 def rangeset(repo, subset, x, y, order): | 168 def rangeset(repo, subset, x, y, order): |
153 m = getset(repo, fullreposet(repo), x) | 169 m = getset(repo, fullreposet(repo), x) |
154 n = getset(repo, fullreposet(repo), y) | 170 n = getset(repo, fullreposet(repo), y) |
155 | 171 |
156 if not m or not n: | 172 if not m or not n: |
2770 b"func": func, | 2786 b"func": func, |
2771 b"ancestor": ancestorspec, | 2787 b"ancestor": ancestorspec, |
2772 b"parent": parentspec, | 2788 b"parent": parentspec, |
2773 b"parentpost": parentpost, | 2789 b"parentpost": parentpost, |
2774 b"smartset": rawsmartset, | 2790 b"smartset": rawsmartset, |
2791 b"nodeset": raw_node_set, | |
2775 } | 2792 } |
2776 | 2793 |
2777 relations = { | 2794 relations = { |
2778 b"g": generationsrel, | 2795 b"g": generationsrel, |
2779 b"generations": generationsrel, | 2796 b"generations": generationsrel, |