Add resource size tracking to benchmarks
Fixed: b/368282141
Change-Id: Ia71c179a29b6aeb9706ca2e30cca4df43c4a2e10
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java
index 752726b..bb462ed 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkConfig.java
@@ -186,6 +186,11 @@
return this;
}
+ public Builder measureResourceSize() {
+ metrics.add(BenchmarkMetric.ResourceSize);
+ return this;
+ }
+
public Builder measureWarmup() {
measureWarmup = true;
return this;
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java
index 22fbf4a..55d34c2 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingle.java
@@ -35,8 +35,9 @@
private final LongList codeSizeResults = new LongArrayList();
private final LongList instructionCodeSizeResults = new LongArrayList();
private final LongList composableInstructionCodeSizeResults = new LongArrayList();
- private final LongList dex2OatSizeResult = new LongArrayList();
+ private final LongList dex2OatSizeResults = new LongArrayList();
private final List<Int2ReferenceMap<SegmentInfo>> dexSegmentsSizeResults = new ArrayList<>();
+ private final LongList resourceSizeResults = new LongArrayList();
public BenchmarkResultsSingle(String name, Set<BenchmarkMetric> metrics) {
this.name = name;
@@ -63,14 +64,18 @@
return dexSegmentsSizeResults;
}
- public LongList getDex2OatSizeResult() {
- return dex2OatSizeResult;
+ public LongList getDex2OatSizeResults() {
+ return dex2OatSizeResults;
}
public LongList getRuntimeResults() {
return runtimeResults;
}
+ public LongList getResourceSizeResults() {
+ return resourceSizeResults;
+ }
+
@Override
public void addRuntimeResult(long result) {
verifyMetric(BenchmarkMetric.RunTimeRaw, metrics.contains(BenchmarkMetric.RunTimeRaw), true);
@@ -114,12 +119,14 @@
public void addDex2OatSizeResult(long result) {
verifyMetric(
BenchmarkMetric.Dex2OatCodeSize, metrics.contains(BenchmarkMetric.Dex2OatCodeSize), true);
- dex2OatSizeResult.add(result);
+ dex2OatSizeResults.add(result);
}
@Override
public void addResourceSizeResult(long result) {
- addCodeSizeResult(result);
+ verifyMetric(
+ BenchmarkMetric.ResourceSize, true, metrics.contains(BenchmarkMetric.ResourceSize));
+ resourceSizeResults.add(result);
}
@Override
@@ -133,8 +140,9 @@
assertTrue(codeSizeResults.isEmpty());
assertTrue(instructionCodeSizeResults.isEmpty());
assertTrue(composableInstructionCodeSizeResults.isEmpty());
- assertTrue(dex2OatSizeResult.isEmpty());
+ assertTrue(dex2OatSizeResults.isEmpty());
assertTrue(dexSegmentsSizeResults.isEmpty());
+ assertTrue(resourceSizeResults.isEmpty());
}
@Override
@@ -179,7 +187,7 @@
verifyMetric(
BenchmarkMetric.Dex2OatCodeSize,
isBenchmarkingCodeSize() && metrics.contains(BenchmarkMetric.Dex2OatCodeSize),
- !dex2OatSizeResult.isEmpty());
+ !dex2OatSizeResults.isEmpty());
}
private void printRunTime(long duration) {
@@ -213,6 +221,10 @@
System.out.println(BenchmarkResults.prettyMetric(name, BenchmarkMetric.Dex2OatCodeSize, bytes));
}
+ private void printResourceSize(long bytes) {
+ System.out.println(BenchmarkResults.prettyMetric(name, BenchmarkMetric.ResourceSize, bytes));
+ }
+
@Override
public void printResults(ResultMode mode, boolean failOnCodeSizeDifferences) {
verifyConfigAndResults();
@@ -235,7 +247,8 @@
failOnCodeSizeDifferences,
result -> printDexSegmentSize(section, result));
}
- printCodeSizeResults(dex2OatSizeResult, failOnCodeSizeDifferences, this::printDex2OatSize);
+ printCodeSizeResults(dex2OatSizeResults, failOnCodeSizeDifferences, this::printDex2OatSize);
+ printCodeSizeResults(resourceSizeResults, failOnCodeSizeDifferences, this::printResourceSize);
}
private static void printCodeSizeResults(
diff --git a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingleAdapter.java b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingleAdapter.java
index 7e62cfc..6ae91ef 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingleAdapter.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/BenchmarkResultsSingleAdapter.java
@@ -54,8 +54,8 @@
resultObject,
"oat_code_size",
iteration,
- result.getDex2OatSizeResult(),
- i -> result.getDex2OatSizeResult().getLong(i));
+ result.getDex2OatSizeResults(),
+ i -> result.getDex2OatSizeResults().getLong(i));
addPropertyIfValueDifferentFromRepresentative(
resultObject,
"runtime",
@@ -63,6 +63,13 @@
result.getRuntimeResults(),
i -> result.getRuntimeResults().getLong(i));
resultsArray.add(resultObject);
+ addPropertyIfValueDifferentFromRepresentative(
+ resultObject,
+ "resource_size",
+ iteration,
+ result.getResourceSizeResults(),
+ i -> result.getResourceSizeResults().getLong(i));
+ resultsArray.add(resultObject);
}
JsonObject benchmarkObject = new JsonObject();
diff --git a/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java b/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java
index 706ad2b..dc7a609 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/appdumps/AppDumpBenchmarkBuilder.java
@@ -164,6 +164,9 @@
.measureComposableInstructionCodeSize()
.measureDexSegmentsCodeSize()
.measureDex2OatCodeSize();
+ if (enableResourceShrinking) {
+ builder.measureResourceSize();
+ }
}
return builder.build();
}
@@ -181,50 +184,26 @@
ThrowableConsumer<? super R8PartialTestBuilder> configuration,
ThrowableConsumer<? super R8PartialTestCompileResult> compileResultConsumer) {
verify();
- return BenchmarkConfig.builder()
- .setName(name)
- .setTarget(BenchmarkTarget.R8)
- .setSuite(BenchmarkSuite.OPENSOURCE_BENCHMARKS)
- .setMethod(runR8WithPartialShrinking(this, configuration, compileResultConsumer))
- .setFromRevision(fromRevision)
- .addDependency(dumpDependency)
- .measureRunTime()
- .measureCodeSize()
- .measureInstructionCodeSize()
- .measureComposableInstructionCodeSize()
- .measureDexSegmentsCodeSize()
- .measureDex2OatCodeSize()
- // TODO(b/373550435): Update dex2oat to enable checking absence of verification errors
- // on SystemUI.
- .setEnableDex2OatVerification(!name.equals("SystemUIAppPartialShrinking"))
- .setTimeout(10, TimeUnit.MINUTES)
- .build();
- }
-
- public BenchmarkConfig buildR8WithResourceShrinking(
- ThrowableConsumer<? super R8FullTestBuilder> configuration) {
- verify();
BenchmarkConfig.Builder builder =
BenchmarkConfig.builder()
.setName(name)
.setTarget(BenchmarkTarget.R8)
.setSuite(BenchmarkSuite.OPENSOURCE_BENCHMARKS)
- .setMethod(runR8(this, configuration))
+ .setMethod(runR8WithPartialShrinking(this, configuration, compileResultConsumer))
.setFromRevision(fromRevision)
.addDependency(dumpDependency)
- // TODO(b/368282141): Also measure resource size.
.measureRunTime()
+ .measureCodeSize()
+ .measureInstructionCodeSize()
+ .measureComposableInstructionCodeSize()
+ .measureDexSegmentsCodeSize()
+ .measureDex2OatCodeSize()
// TODO(b/373550435): Update dex2oat to enable checking absence of verification errors
// on SystemUI.
- .setEnableDex2OatVerification(!name.equals("SystemUIApp"))
+ .setEnableDex2OatVerification(!name.equals("SystemUIAppPartialShrinking"))
.setTimeout(10, TimeUnit.MINUTES);
- if (!runtimeOnly) {
- builder
- .measureCodeSize()
- .measureInstructionCodeSize()
- .measureComposableInstructionCodeSize()
- .measureDexSegmentsCodeSize()
- .measureDex2OatCodeSize();
+ if (enableResourceShrinking) {
+ builder.measureResourceSize();
}
return builder.build();
}
@@ -386,14 +365,18 @@
.apply(
r -> {
try {
- // TODO(b/368282141): Also emit resource size.
r.benchmarkCompile(results)
.benchmarkCodeSize(results)
.benchmarkInstructionCodeSize(results)
.benchmarkDexSegmentsCodeSize(results)
.benchmarkDex2OatCodeSize(
results,
- environment.getConfig().isDex2OatVerificationEnabled());
+ environment.getConfig().isDex2OatVerificationEnabled())
+ .applyIf(
+ environment
+ .getConfig()
+ .containsMetric(BenchmarkMetric.ResourceSize),
+ cr -> cr.benchmarkResourceSize(results));
} catch (CompilationFailedException e) {
if (!(e.getCause() instanceof AbortBenchmarkException)) {
throw e;
@@ -468,6 +451,11 @@
.benchmarkDex2OatCodeSize(
results,
environment.getConfig().isDex2OatVerificationEnabled())
+ .applyIf(
+ environment
+ .getConfig()
+ .containsMetric(BenchmarkMetric.ResourceSize),
+ cr -> cr.benchmarkResourceSize(results))
.apply(compileResultConsumer));
});
}
diff --git a/src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java b/src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java
index 11ffbcd..ff81615 100644
--- a/src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java
+++ b/src/test/testbase/java/com/android/tools/r8/benchmarks/BenchmarkMetric.java
@@ -10,7 +10,8 @@
ComposableInstructionCodeSize,
DexSegmentsCodeSize,
Dex2OatCodeSize,
- StartupTime;
+ StartupTime,
+ ResourceSize;
public String getDartType() {
return "Metric." + name();