Mercurial > hg
changeset 1533:3d11f81c9145
Reduce string duplication in compression code
This cuts down on string copies and allows buffers (instead of strings)
to be passed into the compression code
author | mason@suse.com |
---|---|
date | Fri, 11 Nov 2005 18:20:19 -0800 |
parents | 27077812fffb |
children | 80a3d6a0af71 |
files | mercurial/revlog.py |
diffstat | 1 files changed, 17 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlog.py Fri Nov 11 15:34:17 2005 -0800 +++ b/mercurial/revlog.py Fri Nov 11 18:20:19 2005 -0800 @@ -31,15 +31,15 @@ def compress(text): """ generate a possibly-compressed representation of text """ - if not text: return text + if not text: return ("", text) if len(text) < 44: - if text[0] == '\0': return text - return 'u' + text + if text[0] == '\0': return ("", text) + return ('u', text) bin = zlib.compress(text) if len(bin) > len(text): - if text[0] == '\0': return text - return 'u' + text - return bin + if text[0] == '\0': return ("", text) + return ('u', text) + return ("", bin) def decompress(bin): """ decompress the given input """ @@ -543,14 +543,16 @@ end = self.end(t) if not d: prev = self.revision(self.tip()) - d = self.diff(prev, text) + d = self.diff(prev, str(text)) data = compress(d) - dist = end - start + len(data) + l = len(data[1]) + len(data[0]) + dist = end - start + l # full versions are inserted when the needed deltas # become comparable to the uncompressed text if not n or dist > len(text) * 2: data = compress(text) + l = len(data[1]) + len(data[0]) base = n else: base = self.base(t) @@ -559,14 +561,17 @@ if t >= 0: offset = self.end(t) - e = (offset, len(data), base, link, p1, p2, node) + e = (offset, l, base, link, p1, p2, node) self.index.append(e) self.nodemap[node] = n entry = struct.pack(indexformat, *e) transaction.add(self.datafile, e[0]) - self.opener(self.datafile, "a").write(data) + f = self.opener(self.datafile, "a") + if data[0]: + f.write(data[0]) + f.write(data[1]) transaction.add(self.indexfile, n * len(entry)) self.opener(self.indexfile, "a").write(entry) @@ -801,7 +806,8 @@ # current size. if chain == prev: - cdelta = compress(delta) + tempd = compress(delta) + cdelta = tempd[0] + tempd[1] if chain != prev or (end - start + len(cdelta)) > measure * 2: # flush our writes here so we can read it in revision