Mercurial > hg4j
diff test/org/tmatesoft/hg/test/MapTagsToFileRevisions.java @ 324:283b294d1079
Explore alternatives to access file-changelog combined history
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Mon, 03 Oct 2011 06:47:20 +0200 |
parents | b9592e21176a |
children | d42a45a2c9d6 |
line wrap: on
line diff
--- a/test/org/tmatesoft/hg/test/MapTagsToFileRevisions.java Fri Sep 30 08:44:48 2011 +0200 +++ b/test/org/tmatesoft/hg/test/MapTagsToFileRevisions.java Mon Oct 03 06:47:20 2011 +0200 @@ -1,5 +1,7 @@ package org.tmatesoft.hg.test; +import static org.tmatesoft.hg.repo.HgRepository.TIP; + import java.io.File; import java.util.ArrayList; import java.util.Arrays; @@ -8,6 +10,7 @@ import java.util.List; import java.util.Map; +import org.junit.Assert; import org.tmatesoft.hg.core.HgBadStateException; import org.tmatesoft.hg.core.HgChangeset; import org.tmatesoft.hg.core.HgChangesetHandler; @@ -40,11 +43,75 @@ // m.collectTagsPerFile(); // m.manifestWalk(); // m.changelogWalk(); - m.revisionMap(); +// m.revisionMap(); + m.buildFile2ChangelogRevisionMap(); m = null; System.gc(); System.out.printf("Free mem: %,d\n", Runtime.getRuntime().freeMemory()); } + + /* + * .hgtags, 261 revisions + * Approach 1: total 83, init: 0, iteration: 82 + * Approach 2: total 225, init: 206, iteration: 19 + * README, 465 revisions + * Approach 1: total 162, init: 0, iteration: 161 + * Approach 2: total 231, init: 198, iteration: 32 + * configure.in, 1109 revisions + * Approach 1: total 409, init: 1, iteration: 407 + * Approach 2: total 277, init: 203, iteration: 74 + */ + private void buildFile2ChangelogRevisionMap() throws Exception { + final HgRepository repository = new HgLookup().detect(new File("/temp/hg/cpython")); + final HgChangelog clog = repository.getChangelog(); + final HgDataFile fileNode = repository.getFileNode("configure.in"); + // warm-up + HgChangelog.RevisionMap clogMap = clog.new RevisionMap().init(); + HgDataFile.RevisionMap fileMap = fileNode.new RevisionMap().init(); + // + final int latestRevision = fileNode.getLastRevision(); + // + final long start_1 = System.nanoTime(); + fileMap = fileNode.new RevisionMap().init(); + final long start_1a = System.nanoTime(); + final Map<Nodeid, Nodeid> changesetToNodeid_1 = new HashMap<Nodeid, Nodeid>(); + for (int revision = 0; revision <= latestRevision; revision++) { + final Nodeid nodeId = fileMap.revision(revision); +// final Nodeid changesetId = fileNode.getChangesetRevision(nodeId); + int localCset = fileNode.getChangesetLocalRevision(revision); + final Nodeid changesetId = clog.getRevision(localCset); + changesetToNodeid_1.put(changesetId, nodeId); + } + final long end_1 = System.nanoTime(); + // + final long start_2 = System.nanoTime(); + clogMap = clog.new RevisionMap().init(); + fileMap = fileNode.new RevisionMap().init(); + final Map<Nodeid, Nodeid> changesetToNodeid_2 = new HashMap<Nodeid, Nodeid>(); + final long start_2a = System.nanoTime(); + for (int revision = 0; revision <= latestRevision; revision++) { + Nodeid nidFile = fileMap.revision(revision); + int localCset = fileNode.getChangesetLocalRevision(revision); + Nodeid nidCset = clogMap.revision(localCset); + changesetToNodeid_2.put(nidCset, nidFile); + } + final long end_2 = System.nanoTime(); + Assert.assertEquals(changesetToNodeid_1, changesetToNodeid_2); + // + final long start_3 = System.nanoTime(); + final Map<Nodeid, Nodeid> changesetToNodeid_3 = new HashMap<Nodeid, Nodeid>(); + fileNode.walk(0, TIP, new HgDataFile.RevisionInspector() { + + public void next(int localRevision, Nodeid revision, int linkedRevision) { + changesetToNodeid_3.put(clog.getRevision(linkedRevision), revision); + } + }); + final long end_3 = System.nanoTime(); + Assert.assertEquals(changesetToNodeid_1, changesetToNodeid_3); + System.out.printf("Approach 1: total %d, init: %d, iteration: %d\n", (end_1 - start_1)/1000000, (start_1a - start_1)/1000000, (end_1 - start_1a)/1000000); + System.out.printf("Approach 2: total %d, init: %d, iteration: %d\n", (end_2 - start_2)/1000000, (start_2a - start_2)/1000000, (end_2 - start_2a)/1000000); + System.out.printf("Approach 3: total %d\n", (end_3 - start_3)/1000000); + } /* * Each 5000 revisions from cpython, total 15 revisions