From 974003888a16b30ec1b1543a46804fa7566c8672 Mon Sep 17 00:00:00 2001 From: Charles Lombardo Date: Fri, 9 Dec 2022 12:13:34 -0500 Subject: Android: Baseline profile generation This creates a new benchmark module that is responsible for generating baseline profiles and testing them. As part of this commit a baseline-prof.txt file has been included to speed up launch times with the app in its current state. Later, profile generation can be automated and keep up with the app as it changes. --- .../dolphin/benchmark/BaselineProfileGenerator.kt | 43 ++++++++++++++++++++++ .../java/com/dolphin/benchmark/StartupBenchmark.kt | 40 ++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 Source/Android/benchmark/src/main/java/com/dolphin/benchmark/BaselineProfileGenerator.kt create mode 100644 Source/Android/benchmark/src/main/java/com/dolphin/benchmark/StartupBenchmark.kt (limited to 'Source/Android/benchmark/src/main/java/com') diff --git a/Source/Android/benchmark/src/main/java/com/dolphin/benchmark/BaselineProfileGenerator.kt b/Source/Android/benchmark/src/main/java/com/dolphin/benchmark/BaselineProfileGenerator.kt new file mode 100644 index 0000000000..366a22ab6a --- /dev/null +++ b/Source/Android/benchmark/src/main/java/com/dolphin/benchmark/BaselineProfileGenerator.kt @@ -0,0 +1,43 @@ +package com.dolphin.benchmark + +import androidx.benchmark.macro.ExperimentalBaselineProfilesApi +import androidx.benchmark.macro.junit4.BaselineProfileRule +import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner +import androidx.test.uiautomator.UiSelector +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@OptIn(ExperimentalBaselineProfilesApi::class) +@RunWith(AndroidJUnit4ClassRunner::class) +class BaselineProfileGenerator { + + @get:Rule + val rule = BaselineProfileRule() + + @Test + fun generate() = rule.collectBaselineProfile( + packageName = "org.dolphinemu.dolphinemu.benchmark", + profileBlock = { + pressHome() + startActivityAndWait() + + // Dismiss analytics dialog due to issue with finding button + device.pressBack() + + // Navigate through activities that don't require games + // TODO: Make all activities testable without having games available + // TODO: Use resource strings to support more languages + + // Navigate to the Settings Activity + val settings = device.findObject(UiSelector().description("Settings")) + settings.clickAndWaitForNewWindow(30_000) + + // Go through settings and to the User Data Activity + val config = device.findObject(UiSelector().textContains("Config")) + config.click() + val userData = device.findObject(UiSelector().textContains("User Data")) + userData.clickAndWaitForNewWindow(30_000) + }, + ) +} diff --git a/Source/Android/benchmark/src/main/java/com/dolphin/benchmark/StartupBenchmark.kt b/Source/Android/benchmark/src/main/java/com/dolphin/benchmark/StartupBenchmark.kt new file mode 100644 index 0000000000..5ae5d40f6b --- /dev/null +++ b/Source/Android/benchmark/src/main/java/com/dolphin/benchmark/StartupBenchmark.kt @@ -0,0 +1,40 @@ +package com.dolphin.benchmark + +import androidx.benchmark.macro.BaselineProfileMode +import androidx.benchmark.macro.CompilationMode +import androidx.benchmark.macro.StartupMode +import androidx.benchmark.macro.StartupTimingMetric +import androidx.benchmark.macro.junit4.MacrobenchmarkRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class StartupBenchmark { + @get:Rule + val benchmarkRule = MacrobenchmarkRule() + + @Test + fun startupBaselineProfileDisabled() = startup( + CompilationMode.Partial(baselineProfileMode = BaselineProfileMode.Disable, warmupIterations = 1) + ) + + @Test + fun startupBaselineProfile() = startup( + CompilationMode.Partial(baselineProfileMode = BaselineProfileMode.Require, warmupIterations = 1) + ) + + private fun startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated( + packageName = "org.dolphinemu.dolphinemu.benchmark", + metrics = listOf(StartupTimingMetric()), + iterations = 10, + compilationMode = compilationMode, + startupMode = StartupMode.COLD, + setupBlock = { + pressHome() + } + ) { + startActivityAndWait() + } +} -- cgit v1.2.3