Skip to content

Commit 36dc1bb

Browse files
committed
fix: analysis results for threading time and total commits
Previously, the "number of total commits" and the "runtime with multithreading" where fields of AnalysisResult. This made every analysis have at least these results, event if they never use multithreading. Now, multithreading runtime is only recorded for multi-threaded analysis (but not for the single sub-analysis which are single-threaded).
1 parent 57a90fe commit 36dc1bb

6 files changed

Lines changed: 52 additions & 35 deletions

File tree

src/main/java/org/variantsync/diffdetective/analysis/Analysis.java

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.variantsync.diffdetective.diff.git.GitDiffer;
2121
import org.variantsync.diffdetective.diff.git.PatchDiff;
2222
import org.variantsync.diffdetective.diff.result.CommitDiffResult;
23-
import org.variantsync.diffdetective.diff.result.DiffError;
2423
import org.variantsync.diffdetective.metadata.Metadata;
2524
import org.variantsync.diffdetective.parallel.ScheduledTasksIterator;
2625
import org.variantsync.diffdetective.util.*;
@@ -70,6 +69,38 @@ public class Analysis {
7069
protected final Path outputDir;
7170
protected Path outputFile;
7271
protected final AnalysisResult result;
72+
73+
/**
74+
* The effective runtime in seconds that we have when using multithreading.
75+
*/
76+
public final static class TotalNumberOfCommitsResult extends SimpleMetadata<Integer, TotalNumberOfCommitsResult> {
77+
public final static ResultKey<TotalNumberOfCommitsResult> KEY = new ResultKey<>(TotalNumberOfCommitsResult.class.getName());
78+
79+
public TotalNumberOfCommitsResult() {
80+
super(
81+
0,
82+
MetadataKeys.TOTAL_COMMITS,
83+
Integer::sum,
84+
Integer::parseInt
85+
);
86+
}
87+
}
88+
89+
/**
90+
* The effective runtime in seconds that we have when using multithreading.
91+
*/
92+
public final static class RuntimeWithMultithreadingResult extends SimpleMetadata<Double, RuntimeWithMultithreadingResult> {
93+
public final static ResultKey<RuntimeWithMultithreadingResult> KEY = new ResultKey<>(RuntimeWithMultithreadingResult.class.getName());
94+
95+
public RuntimeWithMultithreadingResult() {
96+
super(
97+
0.0,
98+
MetadataKeys.RUNTIME_WITH_MULTITHREADING,
99+
Double::sum,
100+
Double::parseDouble
101+
);
102+
}
103+
}
73104

74105
/**
75106
* The repository this analysis is run on.
@@ -294,9 +325,8 @@ public static AnalysisResult forSingleCommit(final String commitHash, final Anal
294325

295326
final double runtime = clock.getPassedSeconds();
296327
Logger.info("<<< done in {}", Clock.printPassedSeconds(runtime));
297-
298-
result.runtimeWithMultithreadingInSeconds = -1;
299-
result.totalCommits = 1;
328+
329+
result.get(TotalNumberOfCommitsResult.KEY).value++;
300330

301331
exportMetadata(analysis.getOutputDir(), result);
302332
return result;
@@ -367,6 +397,7 @@ public static AnalysisResult forEachCommit(
367397
) {
368398
var analysis = analysisFactory.get();
369399
analysis.differ = new GitDiffer(analysis.getRepository());
400+
analysis.result.append(RuntimeWithMultithreadingResult.KEY, new RuntimeWithMultithreadingResult());
370401

371402
final Clock clock = new Clock();
372403

@@ -408,8 +439,8 @@ public static AnalysisResult forEachCommit(
408439
final double runtime = clock.getPassedSeconds();
409440
Logger.info("<<< done in {}", Clock.printPassedSeconds(runtime));
410441

411-
analysis.getResult().runtimeWithMultithreadingInSeconds = runtime;
412-
analysis.getResult().totalCommits = numberOfTotalCommits.invocationCount().get();
442+
analysis.getResult().get(RuntimeWithMultithreadingResult.KEY).value = runtime;
443+
// analysis.getResult().get(TotalNumberOfCommitsResult.KEY).value = numberOfTotalCommits.invocationCount().get();
413444

414445
exportMetadata(analysis.getOutputDir(), analysis.getResult());
415446
return analysis.getResult();
@@ -432,10 +463,11 @@ public Analysis(
432463
this.hooks = hooks;
433464
this.repository = repository;
434465
this.outputDir = outputDir;
435-
this.result = new AnalysisResult();
436-
437-
this.result.repoName = repository.getRepositoryName();
466+
467+
this.result = new AnalysisResult(repository.getRepositoryName());
438468
this.result.taskName = taskName;
469+
this.result.append(TotalNumberOfCommitsResult.KEY, new TotalNumberOfCommitsResult());
470+
439471
for (var hook : hooks) {
440472
hook.initializeResults(this);
441473
}
@@ -540,6 +572,8 @@ protected void processCommit() throws Exception {
540572
runReverseHook(patchHook, Hooks::endPatch);
541573
}
542574
}
575+
576+
getResult().get(TotalNumberOfCommitsResult.KEY).value++;
543577
}
544578

545579
protected void processPatch() throws Exception {

src/main/java/org/variantsync/diffdetective/analysis/AnalysisResult.java

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,6 @@ public final class AnalysisResult implements Metadata<AnalysisResult> {
3838
*/
3939
public String repoName = NO_REPO;
4040
public String taskName;
41-
/**
42-
* The effective runtime in seconds that we have when using multithreading.
43-
*/
44-
public double runtimeWithMultithreadingInSeconds = 0;
45-
/**
46-
* The total number of commits in the observed history of the given repository.
47-
*/
48-
public int totalCommits = 0;
4941
public final MergeMap<DiffError, Integer> diffErrors = new MergeMap<>(new HashMap<>(), Integer::sum);
5042

5143
private final Map<String, Metadata<?>> results = new HashMap<>();
@@ -106,8 +98,6 @@ public <T extends Metadata<T>> void append(ResultKey<T> resultKey, T value) {
10698
return ar + "; " + br;
10799
});
108100
a.taskName = Metadata.mergeEqual(a.taskName, b.taskName);
109-
a.runtimeWithMultithreadingInSeconds += b.runtimeWithMultithreadingInSeconds;
110-
a.totalCommits += b.totalCommits;
111101
a.diffErrors.append(b.diffErrors);
112102
b.results.forEach((key, value) -> a.unsafeAppend(key, value));
113103
};
@@ -147,12 +137,11 @@ public LinkedHashMap<String, Object> snapshot() {
147137
LinkedHashMap<String, Object> snap = new LinkedHashMap<>();
148138
snap.put(MetadataKeys.TASKNAME, taskName);
149139
snap.put(MetadataKeys.REPONAME, repoName);
150-
snap.put(MetadataKeys.RUNTIME_WITH_MULTITHREADING, runtimeWithMultithreadingInSeconds);
151-
snap.put(MetadataKeys.TOTAL_COMMITS, totalCommits);
152140

153141
var statistics = get(StatisticsAnalysis.RESULT);
142+
var globals = get(Analysis.TotalNumberOfCommitsResult.KEY);
154143
if (statistics != null) {
155-
snap.put(MetadataKeys.FILTERED_COMMITS, totalCommits - statistics.processedCommits - statistics.emptyCommits - statistics.failedCommits);
144+
snap.put(MetadataKeys.FILTERED_COMMITS, globals.value - statistics.processedCommits - statistics.emptyCommits - statistics.failedCommits);
156145
}
157146

158147
for (var result : results.values()) {
@@ -168,14 +157,6 @@ public void setFromSnapshot(LinkedHashMap<String, String> snap) {
168157
repoName = snap.get(MetadataKeys.REPONAME);
169158
taskName = snap.get(MetadataKeys.TASKNAME);
170159

171-
String runtime = snap.get(MetadataKeys.RUNTIME_WITH_MULTITHREADING);
172-
if (runtime.endsWith("s")) {
173-
runtime = runtime.substring(0, runtime.length() - 1);
174-
}
175-
runtimeWithMultithreadingInSeconds = Double.parseDouble(runtime);
176-
177-
totalCommits = Integer.parseInt(snap.get(MetadataKeys.TOTAL_COMMITS));
178-
179160
for (var entry : snap.entrySet()) {
180161
String key = entry.getKey();
181162
if (entry.getKey().startsWith(ERROR_BEGIN)) {

src/main/java/org/variantsync/diffdetective/analysis/StatisticsAnalysis.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class StatisticsAnalysis implements Analysis.Hooks {
2121

2222
/**
2323
* Invariant:
24-
* {@link Result#emptyCommits} + {@link Result#failedCommits} + {@link Result#processedCommits} - {@link FilterAnalysis filteredCommits} = {@link AnalysisResult#totalCommits}
24+
* {@link Result#emptyCommits} + {@link Result#failedCommits} + {@link Result#processedCommits} - {@link FilterAnalysis filteredCommits} = {@link Analysis.TotalNumberOfCommitsResult#value}
2525
*/
2626
public static final class Result implements Metadata<Result> {
2727
/**

src/main/java/org/variantsync/diffdetective/tablegen/MiningResultAccumulator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public static void main(final String[] args) throws IOException, ParseException
165165
"total",
166166
"",
167167
"--",
168-
ultimateResult.totalCommits + ""
168+
ultimateResult.get(Analysis.TotalNumberOfCommitsResult.KEY).value + ""
169169
),
170170
ultimateResult,
171171
FindMedianCommitTime.getResultOfDirectory(inputPath)

src/main/java/org/variantsync/diffdetective/tablegen/styles/ShortTable.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.variantsync.diffdetective.tablegen.styles;
22

33
import org.apache.commons.lang3.function.TriFunction;
4+
import org.variantsync.diffdetective.analysis.Analysis;
45
import org.variantsync.diffdetective.analysis.StatisticsAnalysis;
56
import org.variantsync.diffdetective.editclass.EditClass;
67
import org.variantsync.diffdetective.editclass.proposed.ProposedEditClasses;
@@ -77,7 +78,7 @@ private static List<ColumnDefinition> columns(final ShortTable t, final TriFunct
7778
final List<ColumnDefinition> cols = new ArrayList<>(List.of(
7879
col("Name", LEFT, row -> row.dataset().name().toLowerCase(Locale.US)),
7980
col("Domain", LEFT_DASH, row -> row.dataset().domain()),
80-
col("\\#total\\\\ commits", RIGHT, row -> t.makeReadable(row.results().totalCommits)),
81+
col("\\#total\\\\ commits", RIGHT, row -> t.makeReadable(row.results().get(Analysis.TotalNumberOfCommitsResult.KEY).value)),
8182
col("\\#processed commits", RIGHT, row -> t.makeReadable(row.get(StatisticsAnalysis.RESULT).processedCommits)),
8283
col("\\#diffs", RIGHT, row -> t.makeReadable(row.get(StatisticsAnalysis.RESULT).processedPatches)),
8384
col("\\#artifact nodes", RIGHT_DASH, row -> t.makeReadable(row
@@ -149,7 +150,7 @@ public List<? extends Row> sortAndFilter(final List<ContentRow> rows, final Cont
149150
final List<Row> res;
150151

151152
if (filtered) {
152-
final Comparator<ContentRow> larger = (a, b) -> -Integer.compare(a.results().totalCommits, b.results().totalCommits);
153+
final Comparator<ContentRow> larger = (a, b) -> -Integer.compare(a.results().get(Analysis.TotalNumberOfCommitsResult.KEY).value, b.results().get(Analysis.TotalNumberOfCommitsResult.KEY).value);
153154
res = rows.stream()
154155
.sorted(larger)
155156
.limit(4)

src/main/java/org/variantsync/diffdetective/tablegen/styles/Table1.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.variantsync.diffdetective.tablegen.styles;
22

3+
import org.variantsync.diffdetective.analysis.Analysis;
34
import org.variantsync.diffdetective.analysis.StatisticsAnalysis;
45
import org.variantsync.diffdetective.editclass.EditClass;
56
import org.variantsync.diffdetective.editclass.proposed.ProposedEditClasses;
@@ -34,7 +35,7 @@ public Table1() {
3435
this.columnDefinitions.addAll(List.of(
3536
col("Name", LEFT, row -> row.dataset().name()),
3637
col("Domain", LEFT, row -> row.dataset().domain()),
37-
col("\\#total commits", RIGHT_DASH, row -> makeReadable(row.results().totalCommits)),
38+
col("\\#total commits", RIGHT_DASH, row -> makeReadable(row.results().get(Analysis.TotalNumberOfCommitsResult.KEY).value)),
3839
col("\\#processed commits", RIGHT, row -> makeReadable(row.get(StatisticsAnalysis.RESULT).processedCommits)),
3940
col("\\#diffs", RIGHT, row -> makeReadable(row.get(StatisticsAnalysis.RESULT).processedPatches))
4041
));

0 commit comments

Comments
 (0)