Mercurial > hg4j
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 |