Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 3157:4fe41a9e4591
optimize revlog.lookup when passed hex(node)[:...]
Instead of converting each node from the filenode to a hex form,
convert the arg to a bin form.
For a revlog with 26711 entries, doing 100 lookup:
before: ~18s
after : ~13s
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Sun, 24 Sep 2006 13:52:27 +0200 |
parents | d01e4cb2f5f2 |
children | 7240f9e47144 |
comparison
equal
deleted
inserted
replaced
3156:d01e4cb2f5f2 | 3157:4fe41a9e4591 |
---|---|
761 if rev < 0: rev = self.count() + rev | 761 if rev < 0: rev = self.count() + rev |
762 if rev < 0 or rev >= self.count(): raise ValueError | 762 if rev < 0 or rev >= self.count(): raise ValueError |
763 return self.node(rev) | 763 return self.node(rev) |
764 except (ValueError, OverflowError): | 764 except (ValueError, OverflowError): |
765 pass | 765 pass |
766 # hex(node)[:...] | 766 try: |
767 node = None | 767 # hex(node)[:...] |
768 for n in self.nodemap: | 768 if len(id) % 2 == 0: |
769 if hex(n).startswith(id): | 769 bin_id = bin(id) |
770 if node is not None: | 770 else: |
771 raise RevlogError(_("Ambiguous identifier")) | 771 bin_id = bin(id[:-1]) |
772 node = n | 772 node = None |
773 if node is not None: | 773 for n in self.nodemap: |
774 return node | 774 if n.startswith(bin_id) and hex(n).startswith(id): |
775 if node is not None: | |
776 raise RevlogError(_("Ambiguous identifier")) | |
777 node = n | |
778 if node is not None: | |
779 return node | |
780 except TypeError: | |
781 pass | |
775 | 782 |
776 # might need fixing if we change hash lengths | 783 # might need fixing if we change hash lengths |
777 if len(id) == 20 and id in self.nodemap: | 784 if len(id) == 20 and id in self.nodemap: |
778 # node | 785 # node |
779 return id | 786 return id |