Mercurial > public > mercurial-scm > hg
comparison mercurial/phases.py @ 51514:4ee50d98d35c stable
phases: update the phase set as we go during retract boundary
Apparently iterating over the `changed_revs` dictionary is very expensive.
On mozilla-try-2019-02-18, a perf::unbundle call with a 10 000 changesets
bundle gives give use the following timing.
e57d4b868a3e: 4.6 seconds
ac1c75188440: 102.5 seconds
prev-changeset: 30.0 seconds
this-changeset: 4.6 seconds
So, the performance regression is gone.
Once again: thanks to marvelous Python!
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 25 Mar 2024 02:09:15 +0100 |
parents | e0f92bd98c24 |
children | 231a92eb1936 |
comparison
equal
deleted
inserted
replaced
51513:e0f92bd98c24 | 51514:4ee50d98d35c |
---|---|
867 replaced_roots = set() # older roots replaced by this call | 867 replaced_roots = set() # older roots replaced by this call |
868 currentroots = self._phaseroots[targetphase] | 868 currentroots = self._phaseroots[targetphase] |
869 start = min(new_revs) | 869 start = min(new_revs) |
870 end = len(cl) | 870 end = len(cl) |
871 rev_phases = [None] * (end - start) | 871 rev_phases = [None] * (end - start) |
872 | |
873 this_phase_set = self._phasesets[targetphase] | |
872 for r in range(start, end): | 874 for r in range(start, end): |
873 | 875 |
874 # gather information about the current_rev | 876 # gather information about the current_rev |
875 r_phase = phase(repo, r) | 877 r_phase = phase(repo, r) |
876 p_phase = None # phase inherited from parents | 878 p_phase = None # phase inherited from parents |
891 if r in new_revs and r_phase < targetphase: | 893 if r in new_revs and r_phase < targetphase: |
892 if p_phase is None or p_phase < targetphase: | 894 if p_phase is None or p_phase < targetphase: |
893 new_roots.add(r) | 895 new_roots.add(r) |
894 rev_phases[r - start] = targetphase | 896 rev_phases[r - start] = targetphase |
895 changed_revs[r] = r_phase | 897 changed_revs[r] = r_phase |
898 this_phase_set.add(r) | |
896 elif p_phase is None: | 899 elif p_phase is None: |
897 rev_phases[r - start] = r_phase | 900 rev_phases[r - start] = r_phase |
898 else: | 901 else: |
899 if p_phase > r_phase: | 902 if p_phase > r_phase: |
900 rev_phases[r - start] = p_phase | 903 rev_phases[r - start] = p_phase |
901 else: | 904 else: |
902 rev_phases[r - start] = r_phase | 905 rev_phases[r - start] = r_phase |
903 if p_phase == targetphase: | 906 if p_phase == targetphase: |
904 if p_phase > r_phase: | 907 if p_phase > r_phase: |
905 changed_revs[r] = r_phase | 908 changed_revs[r] = r_phase |
909 this_phase_set.add(r) | |
906 elif r in currentroots: | 910 elif r in currentroots: |
907 replaced_roots.add(r) | 911 replaced_roots.add(r) |
908 sets = self._phasesets | 912 sets = self._phasesets |
909 sets[targetphase].update(changed_revs) | |
910 if targetphase > draft: | 913 if targetphase > draft: |
911 for r, old in changed_revs.items(): | 914 for r, old in changed_revs.items(): |
912 if old > public: | 915 if old > public: |
913 sets[old].discard(r) | 916 sets[old].discard(r) |
914 | 917 |