Mercurial > public > mercurial-scm > hg
comparison mercurial/branchmap.py @ 46360:1726a53a8494
reverse-branch-cache: switch to doubling allocating scheme
In preperation for updating the reverse-branch-cache incrementally
whenever a new changeset comes in, avoid bad performance on resize with
Python 3.7 (and likely other 3.x versions).
Differential Revision: https://phab.mercurial-scm.org/D9778
author | Joerg Sonnenberger <joerg@bec.de> |
---|---|
date | Fri, 15 Jan 2021 01:20:47 +0100 |
parents | c4b792fa109e |
children | 3e91d9978bec |
comparison
equal
deleted
inserted
replaced
46359:0600e8467101 | 46360:1726a53a8494 |
---|---|
564 _rbcnames = b'rbc-names' + _rbcversion | 564 _rbcnames = b'rbc-names' + _rbcversion |
565 _rbcrevs = b'rbc-revs' + _rbcversion | 565 _rbcrevs = b'rbc-revs' + _rbcversion |
566 # [4 byte hash prefix][4 byte branch name number with sign bit indicating open] | 566 # [4 byte hash prefix][4 byte branch name number with sign bit indicating open] |
567 _rbcrecfmt = b'>4sI' | 567 _rbcrecfmt = b'>4sI' |
568 _rbcrecsize = calcsize(_rbcrecfmt) | 568 _rbcrecsize = calcsize(_rbcrecfmt) |
569 _rbcmininc = 64 * _rbcrecsize | |
569 _rbcnodelen = 4 | 570 _rbcnodelen = 4 |
570 _rbcbranchidxmask = 0x7FFFFFFF | 571 _rbcbranchidxmask = 0x7FFFFFFF |
571 _rbccloseflag = 0x80000000 | 572 _rbccloseflag = 0x80000000 |
572 | 573 |
573 | 574 |
728 def _setcachedata(self, rev, node, branchidx): | 729 def _setcachedata(self, rev, node, branchidx): |
729 """Writes the node's branch data to the in-memory cache data.""" | 730 """Writes the node's branch data to the in-memory cache data.""" |
730 if rev == nullrev: | 731 if rev == nullrev: |
731 return | 732 return |
732 rbcrevidx = rev * _rbcrecsize | 733 rbcrevidx = rev * _rbcrecsize |
733 if len(self._rbcrevs) < rbcrevidx + _rbcrecsize: | 734 requiredsize = rbcrevidx + _rbcrecsize |
734 self._rbcrevs.extend( | 735 rbccur = len(self._rbcrevs) |
735 b'\0' | 736 if rbccur < requiredsize: |
736 * (len(self._repo.changelog) * _rbcrecsize - len(self._rbcrevs)) | 737 # bytearray doesn't allocate extra space at least in Python 3.7. |
737 ) | 738 # When multiple changesets are added in a row, precise resize would |
739 # result in quadratic complexity. Overallocate to compensate by | |
740 # use the classic doubling technique for dynamic arrays instead. | |
741 # If there was a gap in the map before, less space will be reserved. | |
742 self._rbcrevs.extend(b'\0' * max(_rbcmininc, requiredsize)) | |
738 pack_into(_rbcrecfmt, self._rbcrevs, rbcrevidx, node, branchidx) | 743 pack_into(_rbcrecfmt, self._rbcrevs, rbcrevidx, node, branchidx) |
739 self._rbcrevslen = min(self._rbcrevslen, rev) | 744 self._rbcrevslen = min(self._rbcrevslen, rev) |
740 | 745 |
741 tr = self._repo.currenttransaction() | 746 tr = self._repo.currenttransaction() |
742 if tr: | 747 if tr: |