comparison mercurial/pure/parsers.py @ 45936:0ce15a8c7b8b

revlog: store new index entries as binary For a pure-Python unbundle of the current NetBSD test repository, this results in a 10% peak RSS reduction. Using the C revlog index, it shows 25% peak RSS reduction. This is a direct result of avoiding at least 8 objects per new changeset or 200 Bytes+ on AMD64. Differential Revision: https://phab.mercurial-scm.org/D9162
author Joerg Sonnenberger <joerg@bec.de>
date Tue, 06 Oct 2020 03:25:15 +0200
parents 7baf5f798ba9
children 89a2afe31e82
comparison
equal deleted inserted replaced
45935:eccbfa7e19c0 45936:0ce15a8c7b8b
92 return self._lgt + len(self._extra) 92 return self._lgt + len(self._extra)
93 93
94 def append(self, tup): 94 def append(self, tup):
95 if '_nodemap' in vars(self): 95 if '_nodemap' in vars(self):
96 self._nodemap[tup[7]] = len(self) 96 self._nodemap[tup[7]] = len(self)
97 self._extra.append(tup) 97 data = _pack(indexformatng, *tup)
98 self._extra.append(data)
98 99
99 def _check_index(self, i): 100 def _check_index(self, i):
100 if not isinstance(i, int): 101 if not isinstance(i, int):
101 raise TypeError(b"expecting int indexes") 102 raise TypeError(b"expecting int indexes")
102 if i < 0 or i >= len(self): 103 if i < 0 or i >= len(self):
105 def __getitem__(self, i): 106 def __getitem__(self, i):
106 if i == -1: 107 if i == -1:
107 return nullitem 108 return nullitem
108 self._check_index(i) 109 self._check_index(i)
109 if i >= self._lgt: 110 if i >= self._lgt:
110 return self._extra[i - self._lgt] 111 data = self._extra[i - self._lgt]
111 index = self._calculate_index(i) 112 else:
112 r = struct.unpack(indexformatng, self._data[index : index + indexsize]) 113 index = self._calculate_index(i)
113 if i == 0: 114 data = self._data[index : index + indexsize]
114 e = list(r) 115 r = _unpack(indexformatng, data)
115 type = gettype(e[0]) 116 if self._lgt and i == 0:
116 e[0] = offset_type(0, type) 117 r = (offset_type(0, gettype(r[0])),) + r[1:]
117 return tuple(e)
118 return r 118 return r
119 119
120 120
121 class IndexObject(BaseIndexObject): 121 class IndexObject(BaseIndexObject):
122 def __init__(self, data): 122 def __init__(self, data):