comparison 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
comparison
equal deleted inserted replaced
323:4c7e3ba67213 324:283b294d1079
1 package org.tmatesoft.hg.test; 1 package org.tmatesoft.hg.test;
2
3 import static org.tmatesoft.hg.repo.HgRepository.TIP;
2 4
3 import java.io.File; 5 import java.io.File;
4 import java.util.ArrayList; 6 import java.util.ArrayList;
5 import java.util.Arrays; 7 import java.util.Arrays;
6 import java.util.HashMap; 8 import java.util.HashMap;
7 import java.util.LinkedList; 9 import java.util.LinkedList;
8 import java.util.List; 10 import java.util.List;
9 import java.util.Map; 11 import java.util.Map;
10 12
13 import org.junit.Assert;
11 import org.tmatesoft.hg.core.HgBadStateException; 14 import org.tmatesoft.hg.core.HgBadStateException;
12 import org.tmatesoft.hg.core.HgChangeset; 15 import org.tmatesoft.hg.core.HgChangeset;
13 import org.tmatesoft.hg.core.HgChangesetHandler; 16 import org.tmatesoft.hg.core.HgChangesetHandler;
14 import org.tmatesoft.hg.core.HgException; 17 import org.tmatesoft.hg.core.HgException;
15 import org.tmatesoft.hg.core.HgLogCommand; 18 import org.tmatesoft.hg.core.HgLogCommand;
38 MapTagsToFileRevisions m = new MapTagsToFileRevisions(); 41 MapTagsToFileRevisions m = new MapTagsToFileRevisions();
39 System.out.printf("Free mem: %,d\n", Runtime.getRuntime().freeMemory()); 42 System.out.printf("Free mem: %,d\n", Runtime.getRuntime().freeMemory());
40 // m.collectTagsPerFile(); 43 // m.collectTagsPerFile();
41 // m.manifestWalk(); 44 // m.manifestWalk();
42 // m.changelogWalk(); 45 // m.changelogWalk();
43 m.revisionMap(); 46 // m.revisionMap();
47 m.buildFile2ChangelogRevisionMap();
44 m = null; 48 m = null;
45 System.gc(); 49 System.gc();
46 System.out.printf("Free mem: %,d\n", Runtime.getRuntime().freeMemory()); 50 System.out.printf("Free mem: %,d\n", Runtime.getRuntime().freeMemory());
51 }
52
53 /*
54 * .hgtags, 261 revisions
55 * Approach 1: total 83, init: 0, iteration: 82
56 * Approach 2: total 225, init: 206, iteration: 19
57 * README, 465 revisions
58 * Approach 1: total 162, init: 0, iteration: 161
59 * Approach 2: total 231, init: 198, iteration: 32
60 * configure.in, 1109 revisions
61 * Approach 1: total 409, init: 1, iteration: 407
62 * Approach 2: total 277, init: 203, iteration: 74
63 */
64 private void buildFile2ChangelogRevisionMap() throws Exception {
65 final HgRepository repository = new HgLookup().detect(new File("/temp/hg/cpython"));
66 final HgChangelog clog = repository.getChangelog();
67 final HgDataFile fileNode = repository.getFileNode("configure.in");
68 // warm-up
69 HgChangelog.RevisionMap clogMap = clog.new RevisionMap().init();
70 HgDataFile.RevisionMap fileMap = fileNode.new RevisionMap().init();
71 //
72 final int latestRevision = fileNode.getLastRevision();
73 //
74 final long start_1 = System.nanoTime();
75 fileMap = fileNode.new RevisionMap().init();
76 final long start_1a = System.nanoTime();
77 final Map<Nodeid, Nodeid> changesetToNodeid_1 = new HashMap<Nodeid, Nodeid>();
78 for (int revision = 0; revision <= latestRevision; revision++) {
79 final Nodeid nodeId = fileMap.revision(revision);
80 // final Nodeid changesetId = fileNode.getChangesetRevision(nodeId);
81 int localCset = fileNode.getChangesetLocalRevision(revision);
82 final Nodeid changesetId = clog.getRevision(localCset);
83 changesetToNodeid_1.put(changesetId, nodeId);
84 }
85 final long end_1 = System.nanoTime();
86 //
87 final long start_2 = System.nanoTime();
88 clogMap = clog.new RevisionMap().init();
89 fileMap = fileNode.new RevisionMap().init();
90 final Map<Nodeid, Nodeid> changesetToNodeid_2 = new HashMap<Nodeid, Nodeid>();
91 final long start_2a = System.nanoTime();
92 for (int revision = 0; revision <= latestRevision; revision++) {
93 Nodeid nidFile = fileMap.revision(revision);
94 int localCset = fileNode.getChangesetLocalRevision(revision);
95 Nodeid nidCset = clogMap.revision(localCset);
96 changesetToNodeid_2.put(nidCset, nidFile);
97 }
98 final long end_2 = System.nanoTime();
99 Assert.assertEquals(changesetToNodeid_1, changesetToNodeid_2);
100 //
101 final long start_3 = System.nanoTime();
102 final Map<Nodeid, Nodeid> changesetToNodeid_3 = new HashMap<Nodeid, Nodeid>();
103 fileNode.walk(0, TIP, new HgDataFile.RevisionInspector() {
104
105 public void next(int localRevision, Nodeid revision, int linkedRevision) {
106 changesetToNodeid_3.put(clog.getRevision(linkedRevision), revision);
107 }
108 });
109 final long end_3 = System.nanoTime();
110 Assert.assertEquals(changesetToNodeid_1, changesetToNodeid_3);
111 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);
112 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);
113 System.out.printf("Approach 3: total %d\n", (end_3 - start_3)/1000000);
47 } 114 }
48 115
49 /* 116 /*
50 * Each 5000 revisions from cpython, total 15 revisions 117 * Each 5000 revisions from cpython, total 15 revisions
51 * Direct clog.getLocalRevision: ~260 ms 118 * Direct clog.getLocalRevision: ~260 ms