Skip to content

Commit

Permalink
Separate capturing build operations from measuring their execution time
Browse files Browse the repository at this point in the history
  • Loading branch information
lptr committed Sep 18, 2020
1 parent 774e23a commit 8235eca
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ protected Duration getDuration(GradleBuildInvocationResult result) {
}
};

public static Sample<GradleBuildInvocationResult> sampleBuildOperation(String buildOperationDetailsClass) {
public static Sample<GradleBuildInvocationResult> sampleBuildOperationDuration(String buildOperationDetailsClass) {
return new TimeSample<GradleBuildInvocationResult>() {
@Override
public String getName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public List<Sample<? super GradleBuildInvocationResult>> samplesFor(InvocationSe
builder.add(GradleBuildInvocationResult.TIME_TO_TASK_EXECUTION);
}
scenario.getMeasuredBuildOperations().stream()
.map(GradleBuildInvocationResult::sampleBuildOperation)
.map(GradleBuildInvocationResult::sampleBuildOperationDuration)
.forEach(builder::add);
return builder.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public Map<String, Duration> getCumulativeBuildOperationTimes() {
private static Duration readCumulativeTimeFromDataFile(File dataFile) {
try {
try (Stream<String> lines = Files.lines(dataFile.toPath(), StandardCharsets.UTF_8)) {
return Duration.ofMillis(lines.mapToLong(Long::parseLong).sum());
return Duration.ofNanos((long) lines.mapToDouble(Double::parseDouble).sum() * 1000000);
}
} catch (IOException e) {
throw new RuntimeException("Could not read result from file.", e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;

@SuppressWarnings("unused")
public class BuildOperationTrace {
Expand Down Expand Up @@ -95,7 +96,7 @@ public BuildOperationDurationRecordingListener() throws ClassNotFoundException {
for (Map.Entry<String, File> entry : getParameters().getCapturedBuildOperations().get().entrySet()) {
String operationType = entry.getKey();
File outputFile = entry.getValue();
collectors.add(new BuildOperationCollector(Class.forName(operationType + "$Details"), outputFile));
collectors.add(new BuildOperationTimeCollector(Class.forName(operationType + "$Details"), outputFile));
}
}

Expand Down Expand Up @@ -126,24 +127,38 @@ public void close() throws IOException {
}
}

private static class BuildOperationCollector {
private final Class<?> detailsType;
private abstract static class BuildOperationCollector {
private final File outputFile;
private final AtomicLong buildOperationTime = new AtomicLong(0);
private final AtomicReference<Double> data = new AtomicReference<>(0d);

public BuildOperationCollector(Class<?> detailsType, File outputFile) {
this.detailsType = detailsType;
public BuildOperationCollector(File outputFile) {
this.outputFile = outputFile;
}

public void collect(Object details, OperationFinishEvent operationFinishEvent) {
if (detailsType.isAssignableFrom(details.getClass())) {
buildOperationTime.addAndGet(operationFinishEvent.getEndTime() - operationFinishEvent.getStartTime());
}
public abstract void collect(Object details, OperationFinishEvent operationFinishEvent);

protected void accumulate(double delta) {
data.accumulateAndGet(delta, Double::sum);
}

public void write() throws IOException {
Files.write(outputFile.toPath(), String.valueOf(buildOperationTime.longValue()).getBytes(StandardCharsets.UTF_8));
Files.write(outputFile.toPath(), String.valueOf(data.get().doubleValue()).getBytes(StandardCharsets.UTF_8));
}
}

private static class BuildOperationTimeCollector extends BuildOperationCollector {
private final Class<?> detailsType;

public BuildOperationTimeCollector(Class<?> detailsType, File outputFile) {
super(outputFile);
this.detailsType = detailsType;
}

@Override
public void collect(Object details, OperationFinishEvent operationFinishEvent) {
if (detailsType.isAssignableFrom(details.getClass())) {
accumulate(operationFinishEvent.getEndTime() - operationFinishEvent.getStartTime());
}
}
}
}

0 comments on commit 8235eca

Please sign in to comment.