Mercurial > hg
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): |