Mercurial > hg-stable
changeset 31379:906be86990c4
rbc: use struct unpack_from and pack_into instead of unpack and pack
These functions were introduced in Python 2.5 and are faster and simpler than
the old ones ... mainly because we can avoid intermediate buffers:
$ python -m timeit -s "_rbcrecfmt='>4sI'" -s 's = "x"*10000' -s 'from struct import unpack' 'unpack(_rbcrecfmt, buffer(s, 16, 8))'
1000000 loops, best of 3: 0.543 usec per loop
$ python -m timeit -s "_rbcrecfmt='>4sI'" -s 's = "x"*10000' -s 'from struct import unpack_from' 'unpack_from(_rbcrecfmt, s, 16)'
1000000 loops, best of 3: 0.323 usec per loop
$ python -m timeit -s "from array import array" -s "_rbcrecfmt='>4sI'" -s "s = array('c')" -s 's.fromstring("x"*10000)' -s 'from struct import pack' -s "rec = array('c')" 'rec.fromstring(pack(_rbcrecfmt, "asdf", 7))'
1000000 loops, best of 3: 0.364 usec per loop
$ python -m timeit -s "from array import array" -s "_rbcrecfmt='>4sI'" -s "s = array('c')" -s 's.fromstring("x"*10000)' -s 'from struct import pack_into' -s "rec = array('c')" -s 'rec.fromstring("x"*100)' 'pack_into(_rbcrecfmt, rec, 0, "asdf", 7)'
1000000 loops, best of 3: 0.229 usec per loop
author | Mads Kiilerich <madski@unity3d.com> |
---|---|
date | Wed, 19 Oct 2016 02:46:35 +0200 |
parents | b6f5af372c0c |
children | 7dd2f51f38ac |
files | mercurial/branchmap.py |
diffstat | 1 files changed, 4 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/branchmap.py Sun Mar 12 15:27:02 2017 -0400 +++ b/mercurial/branchmap.py Wed Oct 19 02:46:35 2016 +0200 @@ -23,8 +23,8 @@ ) calcsize = struct.calcsize -pack = struct.pack -unpack = struct.unpack +pack_into = struct.pack_into +unpack_from = struct.unpack_from def _filename(repo): """name of a branchcache file for a given repo or repoview""" @@ -406,8 +406,7 @@ # fast path: extract data from cache, use it if node is matching reponode = changelog.node(rev)[:_rbcnodelen] - cachenode, branchidx = unpack( - _rbcrecfmt, util.buffer(self._rbcrevs, rbcrevidx, _rbcrecsize)) + cachenode, branchidx = unpack_from(_rbcrecfmt, self._rbcrevs, rbcrevidx) close = bool(branchidx & _rbccloseflag) if close: branchidx &= _rbcbranchidxmask @@ -451,12 +450,11 @@ def _setcachedata(self, rev, node, branchidx): """Writes the node's branch data to the in-memory cache data.""" rbcrevidx = rev * _rbcrecsize - rec = bytearray(pack(_rbcrecfmt, node, branchidx)) if len(self._rbcrevs) < rbcrevidx + _rbcrecsize: self._rbcrevs.extend('\0' * (len(self._repo.changelog) * _rbcrecsize - len(self._rbcrevs))) - self._rbcrevs[rbcrevidx:rbcrevidx + _rbcrecsize] = rec + pack_into(_rbcrecfmt, self._rbcrevs, rbcrevidx, node, branchidx) self._rbcrevslen = min(self._rbcrevslen, rev) tr = self._repo.currenttransaction()