comparison mercurial/obsolete.py @ 24019:26fbf07482b2

_fm1readmarkers: generate list in C This moves perfloadmarkers from ! result: 63866 ! wall 0.239217 comb 0.250000 user 0.240000 sys 0.010000 (best of 42) to ! result: 63866 ! wall 0.218795 comb 0.210000 user 0.210000 sys 0.000000 (best of 46)
author Martin von Zweigbergk <martinvonz@google.com>
date Tue, 27 Jan 2015 09:22:59 -0500
parents 26d6a6a78c1d
children e0e6dd806b23
comparison
equal deleted inserted replaced
24018:26d6a6a78c1d 24019:26fbf07482b2
283 _fm1parentshift = 14 283 _fm1parentshift = 14
284 _fm1parentmask = (_fm1parentnone << _fm1parentshift) 284 _fm1parentmask = (_fm1parentnone << _fm1parentshift)
285 _fm1metapair = 'BB' 285 _fm1metapair = 'BB'
286 _fm1metapairsize = _calcsize('BB') 286 _fm1metapairsize = _calcsize('BB')
287 287
288 def _fm1readmarkers(data, off): 288 def _fm1purereadmarkers(data, off):
289 # make some global constants local for performance 289 # make some global constants local for performance
290 noneflag = _fm1parentnone 290 noneflag = _fm1parentnone
291 sha2flag = usingsha256 291 sha2flag = usingsha256
292 sha1size = _fm1nodesha1size 292 sha1size = _fm1nodesha1size
293 sha2size = _fm1nodesha256size 293 sha2size = _fm1nodesha256size
299 unpack = _unpack 299 unpack = _unpack
300 300
301 # Loop on markers 301 # Loop on markers
302 stop = len(data) - _fm1fsize 302 stop = len(data) - _fm1fsize
303 ufixed = util.unpacker(_fm1fixed) 303 ufixed = util.unpacker(_fm1fixed)
304
305 fast = getattr(parsers, 'fm1readmarker', None)
306 if fast is not None:
307 while off <= stop:
308 ret = fast(data, off)
309 yield ret[1:]
310 off += ret[0]
311 return
312 304
313 while off <= stop: 305 while off <= stop:
314 # read fixed part 306 # read fixed part
315 o1 = off + fsize 307 o1 = off + fsize
316 t, secs, tz, flags, numsuc, numpar, nummeta, prec = ufixed(data[off:o1]) 308 t, secs, tz, flags, numsuc, numpar, nummeta, prec = ufixed(data[off:o1])
401 data = [_pack(format, *data)] 393 data = [_pack(format, *data)]
402 for key, value in metadata: 394 for key, value in metadata:
403 data.append(key) 395 data.append(key)
404 data.append(value) 396 data.append(value)
405 return ''.join(data) 397 return ''.join(data)
398
399 def _fm1readmarkers(data, off):
400 native = getattr(parsers, 'fm1readmarkers', None)
401 if not native:
402 return _fm1purereadmarkers(data, off)
403 stop = len(data) - _fm1fsize
404 return native(data, off, stop)
406 405
407 # mapping to read/write various marker formats 406 # mapping to read/write various marker formats
408 # <version> -> (decoder, encoder) 407 # <version> -> (decoder, encoder)
409 formats = {_fm0version: (_fm0readmarkers, _fm0encodeonemarker), 408 formats = {_fm0version: (_fm0readmarkers, _fm0encodeonemarker),
410 _fm1version: (_fm1readmarkers, _fm1encodeonemarker)} 409 _fm1version: (_fm1readmarkers, _fm1encodeonemarker)}