@@ -21,42 +21,67 @@ import androidx.benchmark.macro.ExperimentalMetricApi
2121import androidx.benchmark.macro.FrameTimingMetric
2222import androidx.benchmark.macro.MacrobenchmarkScope
2323import androidx.benchmark.macro.Metric
24- import androidx.benchmark.macro.StartupMode
2524import androidx.benchmark.macro.TraceSectionMetric
2625import androidx.test.ext.junit.runners.AndroidJUnit4
2726import androidx.test.filters.LargeTest
2827import androidx.test.uiautomator.By
28+ import androidx.test.uiautomator.BySelector
2929import androidx.test.uiautomator.Until
3030import org.junit.Test
3131import org.junit.runner.RunWith
3232
3333@LargeTest
3434@RunWith(AndroidJUnit4 ::class )
3535@OptIn(ExperimentalMetricApi ::class )
36- class AccelerateHeavyScreenBenchmark : AbstractBenchmark (StartupMode .COLD ) {
37-
38- @Test
39- fun accelerateHeavyScreenCompilationFull () = benchmark(CompilationMode .Full ())
40-
41- override val metrics: List <Metric > =
42- listOf (
43- FrameTimingMetric (),
44- TraceSectionMetric (" ImagePlaceholder" , TraceSectionMetric .Mode .Sum ),
45- TraceSectionMetric (" PublishDate.registerReceiver" , TraceSectionMetric .Mode .Sum ),
46- TraceSectionMetric (" ItemTag" , TraceSectionMetric .Mode .Sum )
47- )
48-
49- override fun MacrobenchmarkScope.measureBlock () {
50- pressHome()
51- startTaskActivity(" accelerate_heavy" )
52-
53- device.wait(Until .hasObject(By .res(" list_of_items" )), 5_000 )
54- val feed = device.findObject(By .res(" list_of_items" ))
55- feed.setGestureMargin(device.displayWidth / 5 )
56-
57- repeat(2 ) {
58- feed.drag(Point (feed.visibleCenter.x, feed.visibleBounds.top))
59- Thread .sleep(500 )
60- }
36+ class AccelerateHeavyScreenBenchmark : AbstractBenchmark (
37+ // This benchmark tests scrolling from an already started activity in the setup phase, we don't
38+ // want the activity to be started in the measure phase.
39+ startupMode = null ,
40+ iterations = 10
41+ ) {
42+
43+ @Test
44+ fun accelerateHeavyScreenCompilationFull () = benchmark(CompilationMode .Full ())
45+
46+ override val metrics: List <Metric > =
47+ listOf (
48+ FrameTimingMetric (),
49+ TraceSectionMetric (" ImagePlaceholder" , TraceSectionMetric .Mode .Sum ),
50+ TraceSectionMetric (" PublishDate.registerReceiver" , TraceSectionMetric .Mode .Sum ),
51+ TraceSectionMetric (" ItemTag" , TraceSectionMetric .Mode .Sum )
52+ )
53+
54+ private var isFirstSetup = true
55+
56+ override fun MacrobenchmarkScope.setupBlock () {
57+ if (isFirstSetup) {
58+ isFirstSetup = false
59+ startActivity()
60+ // Perform a warmup round that will trigger the initial loading of images to avoid having
61+ // a first iteration that's significantly slower than other iterations
62+ measureBlock()
63+ }
64+ finishActivity()
65+ startActivity()
66+ }
67+
68+ private fun MacrobenchmarkScope.startActivity () {
69+ startTaskActivity(" accelerate_heavy" )
70+ device.wait(Until .hasObject(By .res(" list_of_items" )), 5_000 )
71+ }
72+
73+ private fun MacrobenchmarkScope.finishActivity () {
74+ device.pressBack()
75+ device.wait(Until .gone(By .res(" list_of_items" )), 2_000 )
76+ }
77+
78+ override fun MacrobenchmarkScope.measureBlock () {
79+ val feed = device.findObject(By .res(" list_of_items" ))
80+
81+ repeat(2 ) {
82+ feed.drag(Point (feed.visibleCenter.x, feed.visibleBounds.top))
83+ // Enough time for scroll to settle.
84+ Thread .sleep(1000 )
6185 }
86+ }
6287}
0 commit comments