From aee0b5268fe8627ee9413e6d0ccbc9a273cf466c Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 10 Jul 2023 19:39:06 -0400 Subject: [PATCH] Improve conversation open benchmark test. --- .../org/signal/benchmark/setup/TestMessages.kt | 2 ++ .../java/org/signal/benchmark/setup/TestUsers.kt | 2 +- .../conversation/ConversationFragment.java | 2 -- .../securesms/util/SignalLocalMetrics.java | 12 ++++++++++++ .../thoughtcrime/securesms/util/SignalTrace.kt | 10 ++++++++-- .../benchmark/BaselineProfileGenerator.kt | 3 +-- .../benchmark/ConversationBenchmarks.kt | 16 ++++++++++++++-- 7 files changed, 38 insertions(+), 9 deletions(-) diff --git a/app/src/benchmark/java/org/signal/benchmark/setup/TestMessages.kt b/app/src/benchmark/java/org/signal/benchmark/setup/TestMessages.kt index debfece9bd..98f8c68d54 100644 --- a/app/src/benchmark/java/org/signal/benchmark/setup/TestMessages.kt +++ b/app/src/benchmark/java/org/signal/benchmark/setup/TestMessages.kt @@ -148,6 +148,7 @@ object TestMessages { 1024, 1024, Optional.empty(), + Optional.empty(), Optional.of("/not-there.jpg"), false, false, @@ -169,6 +170,7 @@ object TestMessages { 1024, 1024, Optional.empty(), + Optional.empty(), Optional.of("/not-there.aac"), true, false, diff --git a/app/src/benchmark/java/org/signal/benchmark/setup/TestUsers.kt b/app/src/benchmark/java/org/signal/benchmark/setup/TestUsers.kt index ddc9aab88c..3c5e896a11 100644 --- a/app/src/benchmark/java/org/signal/benchmark/setup/TestUsers.kt +++ b/app/src/benchmark/java/org/signal/benchmark/setup/TestUsers.kt @@ -65,7 +65,7 @@ object TestUsers { ).blockingGet() ServiceResponseProcessor.DefaultProcessor(response).resultOrThrow - SignalStore.kbsValues().optOut() + SignalStore.svr().optOut() RegistrationUtil.maybeMarkRegistrationComplete() SignalDatabase.recipients.setProfileName(Recipient.self().id, ProfileName.fromParts("Tester", "McTesterson")) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 476bfa943a..51841fdb6f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -292,7 +292,6 @@ public class ConversationFragment extends LoggingFragment implements Multiselect this.locale = Locale.getDefault(); startupStopwatch = new Stopwatch("conversation-open"); SignalLocalMetrics.ConversationOpen.start(); - SignalTrace.beginSection("ConversationOpen"); } @Override @@ -405,7 +404,6 @@ public class ConversationFragment extends LoggingFragment implements Multiselect startupStopwatch.stop(TAG); SignalLocalMetrics.ConversationOpen.onRenderFinished(); listener.onFirstRender(); - SignalTrace.endSection(); return Unit.INSTANCE; }); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java b/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java index 930271d9d9..1c82d65563 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java @@ -82,29 +82,41 @@ public final class SignalLocalMetrics { private static String id; public static void start() { + SignalTrace.beginSection("6-ConversationOpen"); id = NAME + "-" + System.currentTimeMillis(); LocalMetrics.getInstance().start(id, NAME); + SignalTrace.beginSection("1-ConversationOpen-ViewModel-Init"); } public static void onMetadataLoadStarted() { + SignalTrace.endSection(); LocalMetrics.getInstance().split(id, SPLIT_VIEWMODEL_INIT); + SignalTrace.beginSection("2-ConversationOpen-Metadata-Loaded"); } public static void onMetadataLoaded() { + SignalTrace.endSection(); LocalMetrics.getInstance().split(id, SPLIT_METADATA_LOADED); + SignalTrace.beginSection("3-ConversationOpen-Data-Loaded"); } public static void onDataLoaded() { + SignalTrace.endSection(); LocalMetrics.getInstance().split(id, SPLIT_DATA_LOADED); + SignalTrace.beginSection("4-ConversationOpen-Data-Posted"); } public static void onDataPostedToMain() { + SignalTrace.endSection(); LocalMetrics.getInstance().split(id, SPLIT_DATA_POSTED); + SignalTrace.beginSection("5-ConversationOpen-Render"); } public static void onRenderFinished() { + SignalTrace.endSection(); LocalMetrics.getInstance().split(id, SPLIT_RENDER); LocalMetrics.getInstance().end(id); + SignalTrace.endSection(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SignalTrace.kt b/app/src/main/java/org/thoughtcrime/securesms/util/SignalTrace.kt index 5aad2057fd..99a0cb3336 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SignalTrace.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SignalTrace.kt @@ -1,15 +1,21 @@ package org.thoughtcrime.securesms.util import org.thoughtcrime.securesms.BuildConfig +import java.util.concurrent.Executors import androidx.tracing.Trace as AndroidTrace object SignalTrace { + + private val executor by lazy(LazyThreadSafetyMode.NONE) { + Executors.newSingleThreadExecutor() + } + @JvmStatic fun beginSection(methodName: String) { if (!BuildConfig.TRACING_ENABLED) { return } - AndroidTrace.beginSection(methodName) + executor.execute { AndroidTrace.beginSection(methodName) } } @JvmStatic @@ -17,6 +23,6 @@ object SignalTrace { if (!BuildConfig.TRACING_ENABLED) { return } - AndroidTrace.endSection() + executor.execute { AndroidTrace.endSection() } } } diff --git a/benchmark/src/main/java/org/thoughtcrime/benchmark/BaselineProfileGenerator.kt b/benchmark/src/main/java/org/thoughtcrime/benchmark/BaselineProfileGenerator.kt index d10e04b192..cd86fc3941 100644 --- a/benchmark/src/main/java/org/thoughtcrime/benchmark/BaselineProfileGenerator.kt +++ b/benchmark/src/main/java/org/thoughtcrime/benchmark/BaselineProfileGenerator.kt @@ -2,8 +2,6 @@ package org.thoughtcrime.benchmark -import android.content.ComponentName -import android.content.Intent import androidx.benchmark.macro.ExperimentalBaselineProfilesApi import androidx.benchmark.macro.junit4.BaselineProfileRule import androidx.test.uiautomator.By @@ -18,6 +16,7 @@ import org.junit.Test * - start the app * - open a conversation */ +@OptIn(ExperimentalBaselineProfilesApi::class) class BaselineProfileGenerator { @get:Rule val baselineProfileRule = BaselineProfileRule() diff --git a/benchmark/src/main/java/org/thoughtcrime/benchmark/ConversationBenchmarks.kt b/benchmark/src/main/java/org/thoughtcrime/benchmark/ConversationBenchmarks.kt index 7e6c9d3988..61aaabd84a 100644 --- a/benchmark/src/main/java/org/thoughtcrime/benchmark/ConversationBenchmarks.kt +++ b/benchmark/src/main/java/org/thoughtcrime/benchmark/ConversationBenchmarks.kt @@ -1,5 +1,7 @@ package org.thoughtcrime.benchmark +import android.Manifest +import android.os.Build import androidx.benchmark.macro.CompilationMode import androidx.benchmark.macro.ExperimentalMetricApi import androidx.benchmark.macro.TraceSectionMetric @@ -22,7 +24,14 @@ class ConversationBenchmarks { var setup = false benchmarkRule.measureRepeated( packageName = "org.thoughtcrime.securesms", - metrics = listOf(TraceSectionMetric("ConversationOpen")), + metrics = listOf( + TraceSectionMetric("6-ConversationOpen"), + TraceSectionMetric("1-ConversationOpen-ViewModel-Init"), + TraceSectionMetric("2-ConversationOpen-Metadata-Loaded"), + TraceSectionMetric("3-ConversationOpen-Data-Loaded"), + TraceSectionMetric("4-ConversationOpen-Data-Posted"), + TraceSectionMetric("5-ConversationOpen-Render"), + ), iterations = 10, compilationMode = CompilationMode.Partial(), setupBlock = { @@ -31,10 +40,13 @@ class ConversationBenchmarks { setup = true } killProcess() + if (Build.VERSION.SDK_INT >= 33) { + device.executeShellCommand("pm grant $packageName ${Manifest.permission.POST_NOTIFICATIONS}") + } startActivityAndWait() device.waitForIdle() }) { - device.findObject(By.textContains("Buddy")).click(); + device.findObject(By.textContains("Buddy")).click() device.wait(Until.hasObject(By.textContains("Signal message")), 10_000L) device.wait(Until.hasObject(By.textContains("Test")), 5_000L) }