##// END OF EJS Templates
revlog: use struct.Struct instances for slight performance wins...
Alex Gaynor -
r33392:ac644661 default
parent child Browse files
Show More
@@ -44,8 +44,6 b' from . import ('
44
44
45 parsers = policy.importmod(r'parsers')
45 parsers = policy.importmod(r'parsers')
46
46
47 _pack = struct.pack
48 _unpack = struct.unpack
49 # Aliased for performance.
47 # Aliased for performance.
50 _zlibdecompress = zlib.decompress
48 _zlibdecompress = zlib.decompress
51
49
@@ -171,11 +169,13 b' def hash(text, p1, p2):'
171 # 20 bytes: parent 1 nodeid
169 # 20 bytes: parent 1 nodeid
172 # 20 bytes: parent 2 nodeid
170 # 20 bytes: parent 2 nodeid
173 # 20 bytes: nodeid
171 # 20 bytes: nodeid
174 indexformatv0 = ">4l20s20s20s"
172 indexformatv0 = struct.Struct(">4l20s20s20s")
173 indexformatv0_pack = indexformatv0.pack
174 indexformatv0_unpack = indexformatv0.unpack
175
175
176 class revlogoldio(object):
176 class revlogoldio(object):
177 def __init__(self):
177 def __init__(self):
178 self.size = struct.calcsize(indexformatv0)
178 self.size = indexformatv0.size
179
179
180 def parseindex(self, data, inline):
180 def parseindex(self, data, inline):
181 s = self.size
181 s = self.size
@@ -186,7 +186,7 b' class revlogoldio(object):'
186 while off + s <= l:
186 while off + s <= l:
187 cur = data[off:off + s]
187 cur = data[off:off + s]
188 off += s
188 off += s
189 e = _unpack(indexformatv0, cur)
189 e = indexformatv0_unpack(cur)
190 # transform to revlogv1 format
190 # transform to revlogv1 format
191 e2 = (offset_type(e[0], 0), e[1], -1, e[2], e[3],
191 e2 = (offset_type(e[0], 0), e[1], -1, e[2], e[3],
192 nodemap.get(e[4], nullrev), nodemap.get(e[5], nullrev), e[6])
192 nodemap.get(e[4], nullrev), nodemap.get(e[5], nullrev), e[6])
@@ -204,7 +204,7 b' class revlogoldio(object):'
204 raise RevlogError(_('index entry flags need revlog version 1'))
204 raise RevlogError(_('index entry flags need revlog version 1'))
205 e2 = (getoffset(entry[0]), entry[1], entry[3], entry[4],
205 e2 = (getoffset(entry[0]), entry[1], entry[3], entry[4],
206 node(entry[5]), node(entry[6]), entry[7])
206 node(entry[5]), node(entry[6]), entry[7])
207 return _pack(indexformatv0, *e2)
207 return indexformatv0_pack(*e2)
208
208
209 # index ng:
209 # index ng:
210 # 6 bytes: offset
210 # 6 bytes: offset
@@ -216,8 +216,11 b' class revlogoldio(object):'
216 # 4 bytes: parent 1 rev
216 # 4 bytes: parent 1 rev
217 # 4 bytes: parent 2 rev
217 # 4 bytes: parent 2 rev
218 # 32 bytes: nodeid
218 # 32 bytes: nodeid
219 indexformatng = ">Qiiiiii20s12x"
219 indexformatng = struct.Struct(">Qiiiiii20s12x")
220 versionformat = ">I"
220 indexformatng_pack = indexformatng.pack
221 versionformat = struct.Struct(">I")
222 versionformat_pack = versionformat.pack
223 versionformat_unpack = versionformat.unpack
221
224
222 # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte
225 # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte
223 # signed integer)
226 # signed integer)
@@ -225,7 +228,7 b' versionformat = ">I"'
225
228
226 class revlogio(object):
229 class revlogio(object):
227 def __init__(self):
230 def __init__(self):
228 self.size = struct.calcsize(indexformatng)
231 self.size = indexformatng.size
229
232
230 def parseindex(self, data, inline):
233 def parseindex(self, data, inline):
231 # call the C implementation to parse the index data
234 # call the C implementation to parse the index data
@@ -233,9 +236,9 b' class revlogio(object):'
233 return index, getattr(index, 'nodemap', None), cache
236 return index, getattr(index, 'nodemap', None), cache
234
237
235 def packentry(self, entry, node, version, rev):
238 def packentry(self, entry, node, version, rev):
236 p = _pack(indexformatng, *entry)
239 p = indexformatng_pack(*entry)
237 if rev == 0:
240 if rev == 0:
238 p = _pack(versionformat, version) + p[4:]
241 p = versionformat_pack(version) + p[4:]
239 return p
242 return p
240
243
241 class revlog(object):
244 class revlog(object):
@@ -335,7 +338,7 b' class revlog(object):'
335 indexdata = f.read()
338 indexdata = f.read()
336 f.close()
339 f.close()
337 if len(indexdata) > 0:
340 if len(indexdata) > 0:
338 v = struct.unpack(versionformat, indexdata[:4])[0]
341 v = versionformat_unpack(indexdata[:4])[0]
339 self._initempty = False
342 self._initempty = False
340 except IOError as inst:
343 except IOError as inst:
341 if inst.errno != errno.ENOENT:
344 if inst.errno != errno.ENOENT:
General Comments 0
You need to be logged in to leave comments. Login now