Mercurial > hg4j
diff src/org/tmatesoft/hg/repo/Revlog.java @ 600:46f29b73e51e
Utilize RevisionLookup to speed-up getRevisionIndex of both manifest and changelog
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Fri, 03 May 2013 17:03:31 +0200 |
parents | dd4f6311af52 |
children | 8143c1f77d45 |
line wrap: on
line diff
--- a/src/org/tmatesoft/hg/repo/Revlog.java Fri May 03 15:29:26 2013 +0200 +++ b/src/org/tmatesoft/hg/repo/Revlog.java Fri May 03 17:03:31 2013 +0200 @@ -30,6 +30,7 @@ import org.tmatesoft.hg.internal.Experimental; import org.tmatesoft.hg.internal.IntMap; import org.tmatesoft.hg.internal.Preview; +import org.tmatesoft.hg.internal.RevisionLookup; import org.tmatesoft.hg.internal.RevlogStream; import org.tmatesoft.hg.util.Adaptable; import org.tmatesoft.hg.util.ByteChannel; @@ -53,8 +54,10 @@ private final HgRepository repo; protected final RevlogStream content; + protected final boolean useRevisionLookup; + protected RevisionLookup revisionLookup; - protected Revlog(HgRepository hgRepo, RevlogStream contentStream) { + protected Revlog(HgRepository hgRepo, RevlogStream contentStream, boolean needRevisionLookup) { if (hgRepo == null) { throw new IllegalArgumentException(); } @@ -63,12 +66,14 @@ } repo = hgRepo; content = contentStream; + useRevisionLookup = needRevisionLookup; } // invalid Revlog protected Revlog(HgRepository hgRepo) { repo = hgRepo; content = null; + useRevisionLookup = false; } public final HgRepository getRepo() { @@ -145,13 +150,24 @@ * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> */ public final int getRevisionIndex(Nodeid nid) throws HgRuntimeException { - int revision = content.findRevisionIndex(nid); +// final long t1 = System.nanoTime(); + int revision; + if (useRevisionLookup) { + if (revisionLookup == null) { + revisionLookup = RevisionLookup.createFor(content); + } + revision = revisionLookup.findIndex(nid); + } else { + revision = content.findRevisionIndex(nid); + } if (revision == BAD_REVISION) { // using toString() to identify revlog. HgDataFile.toString includes path, HgManifest and HgChangelog instances // are fine with default (class name) // Perhaps, more tailored description method would be suitable here throw new HgInvalidRevisionException(String.format("Can't find revision %s in %s", nid.shortNotation(), this), nid, null); } +// final long t2 = System.nanoTime(); +// System.out.printf("\tgetRevisionIndex(%s): %d us\n", nid.shortNotation(), (t2-t1)/1000); return revision; }