Mercurial > public > mercurial-scm > hg
comparison mercurial/revlogutils/debug.py @ 51071:5b5cb6b833b0
debug-delta-chain: actually skip unrequested computation
Doing quick test on mozilla-unified show we can run up to 2? faster by skipping
some of these computation.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 19 Sep 2023 02:20:49 +0200 |
parents | 752e380c5702 |
children | df50a1592e0c |
comparison
equal
deleted
inserted
replaced
51070:752e380c5702 | 51071:5b5cb6b833b0 |
---|---|
719 self._generaldelta = revlog.delta_config.general_delta | 719 self._generaldelta = revlog.delta_config.general_delta |
720 self._chain_size_cache = {} | 720 self._chain_size_cache = {} |
721 # security to avoid crash on corrupted revlogs | 721 # security to avoid crash on corrupted revlogs |
722 self._total_revs = len(self._index) | 722 self._total_revs = len(self._index) |
723 | 723 |
724 def revinfo(self, rev): | 724 def revinfo(self, rev, size_info=True, dist_info=True, sparse_info=True): |
725 e = self._index[rev] | 725 e = self._index[rev] |
726 compsize = e[constants.ENTRY_DATA_COMPRESSED_LENGTH] | 726 compsize = e[constants.ENTRY_DATA_COMPRESSED_LENGTH] |
727 uncompsize = e[constants.ENTRY_DATA_UNCOMPRESSED_LENGTH] | 727 uncompsize = e[constants.ENTRY_DATA_UNCOMPRESSED_LENGTH] |
728 | 728 |
729 base = e[constants.ENTRY_DELTA_BASE] | 729 base = e[constants.ENTRY_DELTA_BASE] |
786 deltatype = b'base' | 786 deltatype = b'base' |
787 else: | 787 else: |
788 deltatype = b'prev' | 788 deltatype = b'prev' |
789 | 789 |
790 chain = self._revlog._deltachain(rev)[0] | 790 chain = self._revlog._deltachain(rev)[0] |
791 chain_size = 0 | 791 |
792 for iter_rev in reversed(chain): | 792 data = { |
793 cached = self._chain_size_cache.get(iter_rev) | |
794 if cached is not None: | |
795 chain_size += cached | |
796 break | |
797 e = self._index[iter_rev] | |
798 chain_size += e[constants.ENTRY_DATA_COMPRESSED_LENGTH] | |
799 self._chain_size_cache[rev] = chain_size | |
800 | |
801 return { | |
802 'p1': p1, | 793 'p1': p1, |
803 'p2': p2, | 794 'p2': p2, |
804 'compressed_size': compsize, | 795 'compressed_size': compsize, |
805 'uncompressed_size': uncompsize, | 796 'uncompressed_size': uncompsize, |
806 'deltatype': deltatype, | 797 'deltatype': deltatype, |
807 'chain': chain, | 798 'chain': chain, |
808 'chain_size': chain_size, | |
809 } | 799 } |
800 | |
801 if size_info or dist_info or sparse_info: | |
802 chain_size = 0 | |
803 for iter_rev in reversed(chain): | |
804 cached = self._chain_size_cache.get(iter_rev) | |
805 if cached is not None: | |
806 chain_size += cached | |
807 break | |
808 e = self._index[iter_rev] | |
809 chain_size += e[constants.ENTRY_DATA_COMPRESSED_LENGTH] | |
810 self._chain_size_cache[rev] = chain_size | |
811 data['chain_size'] = chain_size | |
812 | |
813 return data | |
810 | 814 |
811 | 815 |
812 def debug_delta_chain( | 816 def debug_delta_chain( |
813 revlog, | 817 revlog, |
814 revs=None, | 818 revs=None, |
846 revlog_size = len(r) | 850 revlog_size = len(r) |
847 all_revs = sorted(rev for rev in revs if rev < revlog_size) | 851 all_revs = sorted(rev for rev in revs if rev < revlog_size) |
848 | 852 |
849 chainbases = {} | 853 chainbases = {} |
850 for rev in all_revs: | 854 for rev in all_revs: |
851 info = auditor.revinfo(rev) | 855 info = auditor.revinfo( |
856 rev, | |
857 size_info=size_info, | |
858 dist_info=dist_info, | |
859 sparse_info=sparse_info, | |
860 ) | |
852 comp = info['compressed_size'] | 861 comp = info['compressed_size'] |
853 uncomp = info['uncompressed_size'] | 862 uncomp = info['uncompressed_size'] |
854 chain = info['chain'] | 863 chain = info['chain'] |
855 chainbase = chain[0] | 864 chainbase = chain[0] |
856 chainid = chainbases.setdefault(chainbase, len(chainbases) + 1) | 865 chainid = chainbases.setdefault(chainbase, len(chainbases) + 1) |
857 basestart = start(chainbase) | 866 if dist_info: |
858 revstart = start(rev) | 867 basestart = start(chainbase) |
859 lineardist = revstart + comp - basestart | 868 revstart = start(rev) |
860 chainsize = info['chain_size'] | 869 lineardist = revstart + comp - basestart |
861 extradist = lineardist - chainsize | 870 extradist = lineardist - info['chain_size'] |
862 try: | 871 try: |
863 prevrev = chain[-2] | 872 prevrev = chain[-2] |
864 except IndexError: | 873 except IndexError: |
865 prevrev = -1 | 874 prevrev = -1 |
866 | 875 |
867 if uncomp != 0: | 876 if size_info: |
868 chainratio = float(chainsize) / float(uncomp) | 877 chainsize = info['chain_size'] |
869 else: | 878 if uncomp != 0: |
870 chainratio = chainsize | 879 chainratio = float(chainsize) / float(uncomp) |
871 | 880 else: |
872 if chainsize != 0: | 881 chainratio = chainsize |
873 extraratio = float(extradist) / float(chainsize) | 882 |
874 else: | 883 if dist_info: |
875 extraratio = extradist | 884 if chainsize != 0: |
885 extraratio = float(extradist) / float(chainsize) | |
886 else: | |
887 extraratio = extradist | |
876 | 888 |
877 # label, display-format, data-key, value | 889 # label, display-format, data-key, value |
878 entry = [ | 890 entry = [ |
879 (b'rev', b'%7d', 'rev', rev), | 891 (b'rev', b'%7d', 'rev', rev), |
880 (b'p1', b'%7d', 'p1', info['p1']), | 892 (b'p1', b'%7d', 'p1', info['p1']), |
900 (b'extradist', b'%9d', 'extradist', extradist), | 912 (b'extradist', b'%9d', 'extradist', extradist), |
901 (b'extraratio', b'%10.5f', 'extraratio', extraratio), | 913 (b'extraratio', b'%10.5f', 'extraratio', extraratio), |
902 ] | 914 ] |
903 ) | 915 ) |
904 if withsparseread and sparse_info: | 916 if withsparseread and sparse_info: |
917 chainsize = info['chain_size'] | |
905 readsize = 0 | 918 readsize = 0 |
906 largestblock = 0 | 919 largestblock = 0 |
907 srchunks = 0 | 920 srchunks = 0 |
908 | 921 |
909 for revschunk in deltautil.slicechunk(r, chain): | 922 for revschunk in deltautil.slicechunk(r, chain): |