diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerActivity.kt
index 130f0a0..a32d2e7 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/PagerActivity.kt
@@ -17,42 +17,75 @@
 package androidx.compose.integration.macrobenchmark.target
 
 import android.os.Bundle
+import android.webkit.WebView
+import android.webkit.WebViewClient
 import androidx.activity.ComponentActivity
 import androidx.activity.compose.setContent
+import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.grid.GridCells
+import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
 import androidx.compose.foundation.pager.HorizontalPager
 import androidx.compose.foundation.pager.PageSize
+import androidx.compose.foundation.pager.PagerScope
+import androidx.compose.foundation.pager.PagerState
 import androidx.compose.foundation.pager.rememberPagerState
-import androidx.compose.material.Text
+import androidx.compose.material3.Button
+import androidx.compose.material3.Card
+import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.semantics.contentDescription
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.viewinterop.AndroidView
+import kotlinx.coroutines.launch
 
 class PagerActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-
-        val itemCount = intent.getIntExtra(ExtraItemCount, 3000)
+        val benchmarkType = intent.getStringExtra(BenchmarkType.Key)
+        val enableTab = intent.getBooleanExtra(BenchmarkType.Tab, false)
 
         setContent {
-            val pagerState = rememberPagerState { itemCount }
-            Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                HorizontalPager(
-                    modifier =
-                        Modifier.height(400.dp)
-                            .semantics { contentDescription = "Pager" }
-                            .background(Color.White),
-                    state = pagerState,
-                    pageSize = PageSize.Fill
-                ) {
-                    PagerItem(it)
+            val pagerState = rememberPagerState { ItemCount }
+
+            Column(modifier = Modifier.fillMaxSize()) {
+                if (enableTab) {
+                    val scope = rememberCoroutineScope()
+                    Button(
+                        modifier = Modifier.semantics { contentDescription = "Next" },
+                        onClick = {
+                            scope.launch {
+                                pagerState.animateScrollToPage(pagerState.currentPage + 1)
+                            }
+                        }
+                    ) {
+                        Text("Next Page")
+                    }
+                }
+                when (benchmarkType) {
+                    BenchmarkType.Grid -> BenchmarkPagerOfGrids(pagerState)
+                    BenchmarkType.List -> BenchmarkPagerOfLists(pagerState)
+                    BenchmarkType.WebView -> BenchmarkPagerOfWebViews(pagerState)
+                    BenchmarkType.FullScreenImage -> BenchmarkPagerOfFullScreenImages(pagerState)
+                    BenchmarkType.FixedSizeImage -> BenchmarkPagerOfFixedSizeImages(pagerState)
+                    BenchmarkType.ListOfPager -> BenchmarkListOfPager()
+                    else -> throw IllegalStateException("Benchmark Type not known ")
                 }
             }
         }
@@ -60,14 +93,139 @@
         launchIdlenessTracking()
     }
 
+    @Composable
+    fun BenchmarkPagerOfGrids(pagerState: PagerState) {
+        FullSizePager(pagerState) {
+            LazyVerticalGrid(GridCells.Fixed(4)) {
+                items(200) {
+                    Card(modifier = Modifier.fillMaxWidth().height(64.dp).padding(8.dp)) {
+                        Text(it.toString())
+                    }
+                }
+            }
+        }
+    }
+
+    @Composable
+    fun BenchmarkPagerOfLists(pagerState: PagerState) {
+        FullSizePager(pagerState) {
+            LazyColumn(modifier = Modifier.fillMaxWidth()) {
+                items(200) {
+                    Card(modifier = Modifier.fillMaxWidth().height(64.dp).padding(8.dp)) {
+                        Text(it.toString())
+                    }
+                }
+            }
+        }
+    }
+
+    @Composable
+    fun BenchmarkPagerOfWebViews(pagerState: PagerState) {
+        FullSizePager(pagerState) {
+            AndroidView(
+                modifier = Modifier.fillMaxSize(),
+                factory = { context ->
+                    WebView(context).apply {
+                        settings.javaScriptEnabled = true
+                        webViewClient = WebViewClient()
+
+                        settings.loadWithOverviewMode = true
+                        settings.useWideViewPort = true
+                        settings.setSupportZoom(true)
+                    }
+                },
+                update = { webView -> webView.loadUrl("https://www.google.com/") }
+            )
+        }
+    }
+
+    @Composable
+    fun BenchmarkPagerOfFullScreenImages(pagerState: PagerState) {
+        FullSizePager(pagerState) { page ->
+            val pageImage = Images[(page - ItemCount / 2).floorMod(5)]
+            Image(
+                contentScale = ContentScale.Crop,
+                modifier = Modifier.fillMaxSize(),
+                painter = painterResource(pageImage.second),
+                contentDescription = stringResource(pageImage.third)
+            )
+        }
+    }
+
+    @Composable
+    fun BenchmarkPagerOfFixedSizeImages(pagerState: PagerState) {
+        FixedSizePager(pagerState) { page ->
+            Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+                val pageImage = Images[(page - ItemCount / 2).floorMod(5)]
+                Image(
+                    contentScale = ContentScale.Crop,
+                    modifier = Modifier.height(200.dp).fillMaxWidth(),
+                    painter = painterResource(pageImage.second),
+                    contentDescription = stringResource(pageImage.third)
+                )
+            }
+        }
+    }
+
+    @Composable
+    fun FullSizePager(pagerState: PagerState, content: @Composable PagerScope.(Int) -> Unit) {
+        HorizontalPager(
+            modifier = Modifier.semantics { contentDescription = "Pager" }.background(Color.White),
+            state = pagerState,
+            pageSize = PageSize.Fill,
+            pageContent = content
+        )
+    }
+
+    @Composable
+    fun FixedSizePager(pagerState: PagerState, content: @Composable PagerScope.(Int) -> Unit) {
+        HorizontalPager(
+            modifier = Modifier.semantics { contentDescription = "Pager" }.background(Color.White),
+            state = pagerState,
+            pageSize = PageSize.Fixed(200.dp),
+            pageSpacing = 10.dp,
+            pageContent = content
+        )
+    }
+
+    @Composable
+    fun BenchmarkListOfPager() {
+        LazyColumn(Modifier.semantics { contentDescription = "List" }) {
+            items(ItemCount * ItemCount) {
+                FixedSizePager(rememberPagerState { ItemCount }) {
+                    Box(Modifier.size(200.dp)) { Text("Page ${it.toString()}") }
+                }
+            }
+        }
+    }
+
     companion object {
-        const val ExtraItemCount = "ITEM_COUNT"
+        const val ItemCount = 100
+
+        object BenchmarkType {
+            val Key = "BenchmarkType"
+            val Tab = "EnableTab"
+            val Grid = "Pager of Grids"
+            val List = "Pager of List"
+            val WebView = "Pager of WebViews"
+            val FullScreenImage = "Pager of Full Screen Images"
+            val FixedSizeImage = "Pager of Fixed Size Images"
+            val ListOfPager = "Pager Inside A List"
+        }
+
+        val Images =
+            listOf(
+                Triple(0, R.drawable.carousel_image_1, R.string.carousel_image_1_description),
+                Triple(1, R.drawable.carousel_image_2, R.string.carousel_image_2_description),
+                Triple(2, R.drawable.carousel_image_3, R.string.carousel_image_3_description),
+                Triple(3, R.drawable.carousel_image_4, R.string.carousel_image_4_description),
+                Triple(4, R.drawable.carousel_image_5, R.string.carousel_image_5_description),
+            )
     }
 }
 
-@Composable
-private fun PagerItem(index: Int) {
-    Box(modifier = Modifier.fillMaxSize().background(Color.Black)) {
-        Text(text = index.toString(), color = Color.White)
+private fun Int.floorMod(other: Int): Int =
+    when (other) {
+        0 -> this
+        else -> this - floorDiv(other) * other
     }
-}
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_1.jpg b/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_1.jpg
new file mode 100644
index 0000000..b02612e
--- /dev/null
+++ b/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_1.jpg
Binary files differ
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_2.jpg b/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_2.jpg
new file mode 100644
index 0000000..73162bb
--- /dev/null
+++ b/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_2.jpg
Binary files differ
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_3.jpg b/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_3.jpg
new file mode 100644
index 0000000..d31f632
--- /dev/null
+++ b/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_3.jpg
Binary files differ
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_4.jpg b/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_4.jpg
new file mode 100644
index 0000000..8362062
--- /dev/null
+++ b/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_4.jpg
Binary files differ
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_5.jpg b/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_5.jpg
new file mode 100644
index 0000000..f5eb364
--- /dev/null
+++ b/compose/integration-tests/macrobenchmark-target/src/main/res/drawable-nodpi/carousel_image_5.jpg
Binary files differ
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/res/values/strings.xml b/compose/integration-tests/macrobenchmark-target/src/main/res/values/strings.xml
index 19b2ab5..88f7fac 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/res/values/strings.xml
+++ b/compose/integration-tests/macrobenchmark-target/src/main/res/values/strings.xml
@@ -26,4 +26,9 @@
     <string name="io_settings_tos" translation_description="Open link to terms of service.">Terms of service</string>
     <string name="io_settings_privacy_policy" translation_description="Open link to privacy policy.">Privacy policy</string>
     <string name="io_settings_oss_licenses" translation_description="Open link to open source licenses.">Open sources licenses</string>
+    <string name="carousel_image_1_description">A racecar</string>
+    <string name="carousel_image_2_description">Dotonburi, Osaka</string>
+    <string name="carousel_image_3_description">The Grand Canyon</string>
+    <string name="carousel_image_4_description">A rock structure with its reflection mirrored over the sea</string>
+    <string name="carousel_image_5_description">A car on a long stretch of desert road</string>
 </resources>
diff --git a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerBenchmark.kt b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerBenchmark.kt
index 35b7f99..3ca318e 100644
--- a/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/main/java/androidx/compose/integration/macrobenchmark/PagerBenchmark.kt
@@ -14,10 +14,14 @@
  * limitations under the License.
  */
 
+@file:OptIn(ExperimentalMetricApi::class)
+
 package androidx.compose.integration.macrobenchmark
 
 import android.content.Intent
 import androidx.benchmark.macro.CompilationMode
+import androidx.benchmark.macro.ExperimentalMetricApi
+import androidx.benchmark.macro.FrameTimingGfxInfoMetric
 import androidx.benchmark.macro.FrameTimingMetric
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
@@ -26,7 +30,6 @@
 import androidx.test.uiautomator.Direction
 import androidx.test.uiautomator.UiDevice
 import androidx.test.uiautomator.Until
-import androidx.testutils.createCompilationParams
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -47,22 +50,167 @@
     }
 
     @Test
-    fun scroll() {
+    fun pager_of_grids_gesture_scroll() {
         benchmarkRule.measureRepeated(
             packageName = PackageName,
-            metrics = listOf(FrameTimingMetric()),
+            metrics = listOf(FrameTimingGfxInfoMetric()),
             compilationMode = compilationMode,
-            iterations = 10,
+            iterations = 5,
             setupBlock = {
                 val intent = Intent()
                 intent.action = Action
+                intent.putExtra(BenchmarkType.Key, BenchmarkType.Grid)
+                startActivityAndWait(intent)
+            }
+        ) {
+            val pager = device.findObject(By.desc(ContentDescription))
+            // Setting a gesture margin is important otherwise gesture nav is triggered.
+            pager.setGestureMargin(device.displayWidth / 5)
+            for (i in 1..EventRepeatCount) {
+                // From center we scroll 2/3 of it which is 1/3 of the screen.
+                pager.swipe(Direction.LEFT, 1.0f)
+                device.wait(Until.findObject(By.desc(ComposeIdle)), 3000)
+            }
+        }
+    }
+
+    @Test
+    fun pager_of_grids_animated_scroll() {
+        benchmarkRule.measureRepeated(
+            packageName = PackageName,
+            metrics = listOf(FrameTimingGfxInfoMetric()),
+            compilationMode = compilationMode,
+            iterations = 5,
+            setupBlock = {
+                val intent = Intent()
+                intent.action = Action
+                intent.putExtra(BenchmarkType.Key, BenchmarkType.Grid)
+                intent.putExtra(BenchmarkType.Tab, true)
+                startActivityAndWait(intent)
+            }
+        ) {
+            val nextButton = device.findObject(By.desc(NextDescription))
+            repeat(EventRepeatCount) {
+                nextButton.click()
+                device.wait(Until.findObject(By.desc(ComposeIdle)), 3000)
+            }
+        }
+    }
+
+    @Test
+    fun pager_of_lists_gesture_scroll() {
+        benchmarkRule.measureRepeated(
+            packageName = PackageName,
+            metrics = listOf(FrameTimingGfxInfoMetric()),
+            compilationMode = compilationMode,
+            iterations = 5,
+            setupBlock = {
+                val intent = Intent()
+                intent.action = Action
+                intent.putExtra(BenchmarkType.Key, BenchmarkType.List)
+                startActivityAndWait(intent)
+            }
+        ) {
+            val pager = device.findObject(By.desc(ContentDescription))
+            // Setting a gesture margin is important otherwise gesture nav is triggered.
+            pager.setGestureMargin(device.displayWidth / 5)
+            for (i in 1..EventRepeatCount) {
+                // From center we scroll 2/3 of it which is 1/3 of the screen.
+                pager.swipe(Direction.LEFT, 1.0f)
+                device.wait(Until.findObject(By.desc(ComposeIdle)), 3000)
+            }
+        }
+    }
+
+    @Test
+    fun pager_of_lists_animated_scroll() {
+        benchmarkRule.measureRepeated(
+            packageName = PackageName,
+            metrics = listOf(FrameTimingGfxInfoMetric()),
+            compilationMode = compilationMode,
+            iterations = 5,
+            setupBlock = {
+                val intent = Intent()
+                intent.action = Action
+                intent.putExtra(BenchmarkType.Key, BenchmarkType.List)
+                intent.putExtra(BenchmarkType.Tab, true)
+                startActivityAndWait(intent)
+            }
+        ) {
+            val nextButton = device.findObject(By.desc(NextDescription))
+            repeat(EventRepeatCount) {
+                nextButton.click()
+                device.wait(Until.findObject(By.desc(ComposeIdle)), 3000)
+            }
+        }
+    }
+
+    @Test
+    fun pager_of_webviews_gesture_scroll() {
+        benchmarkRule.measureRepeated(
+            packageName = PackageName,
+            metrics = listOf(FrameTimingGfxInfoMetric()),
+            compilationMode = compilationMode,
+            iterations = 5,
+            setupBlock = {
+                val intent = Intent()
+                intent.action = Action
+                intent.putExtra(BenchmarkType.Key, BenchmarkType.WebView)
+                startActivityAndWait(intent)
+            }
+        ) {
+            val pager = device.findObject(By.desc(ContentDescription))
+            // Setting a gesture margin is important otherwise gesture nav is triggered.
+            pager.setGestureMargin(device.displayWidth / 5)
+            for (i in 1..EventRepeatCount) {
+                // From center we scroll 2/3 of it which is 1/3 of the screen.
+                pager.swipe(Direction.LEFT, 1.0f)
+                device.wait(Until.findObject(By.desc(ComposeIdle)), 3000)
+            }
+        }
+    }
+
+    @Test
+    fun pager_of_webviews_animated_scroll() {
+        benchmarkRule.measureRepeated(
+            packageName = PackageName,
+            metrics = listOf(FrameTimingGfxInfoMetric()),
+            compilationMode = compilationMode,
+            iterations = 5,
+            setupBlock = {
+                val intent = Intent()
+                intent.action = Action
+                intent.putExtra(BenchmarkType.Key, BenchmarkType.WebView)
+                intent.putExtra(BenchmarkType.Tab, true)
+                startActivityAndWait(intent)
+            }
+        ) {
+            val nextButton = device.findObject(By.desc(NextDescription))
+            repeat(EventRepeatCount) {
+                nextButton.click()
+                device.wait(Until.findObject(By.desc(ComposeIdle)), 3000)
+            }
+        }
+    }
+
+    @Test
+    fun pager_of_images_full_page_gesture_scroll() {
+        benchmarkRule.measureRepeated(
+            packageName = PackageName,
+            metrics = listOf(FrameTimingGfxInfoMetric()),
+            compilationMode = compilationMode,
+            iterations = 5,
+            setupBlock = {
+                val intent = Intent()
+                intent.putExtra(BenchmarkType.Key, BenchmarkType.FullScreenImage)
+                intent.action = Action
                 startActivityAndWait(intent)
             }
         ) {
             val pager = device.findObject(By.desc(ContentDescription))
             // Setting a gesture margin is important otherwise gesture nav is triggered.
             pager.setGestureMargin(device.displayWidth / 5)
-            for (i in 1..10) {
+            for (i in 1..EventRepeatCount) {
                 // From center we scroll 2/3 of it which is 1/3 of the screen.
                 pager.swipe(Direction.LEFT, 1.0f)
                 device.wait(Until.findObject(By.desc(ComposeIdle)), 3000)
@@ -70,15 +218,124 @@
         }
     }
 
+    @Test
+    fun pager_of_images_full_page_animated_scroll() {
+        benchmarkRule.measureRepeated(
+            packageName = PackageName,
+            metrics = listOf(FrameTimingGfxInfoMetric()),
+            compilationMode = compilationMode,
+            iterations = 5,
+            setupBlock = {
+                val intent = Intent()
+                intent.putExtra(BenchmarkType.Key, BenchmarkType.FullScreenImage)
+                intent.putExtra(BenchmarkType.Tab, true)
+                intent.action = Action
+                startActivityAndWait(intent)
+            }
+        ) {
+            val nextButton = device.findObject(By.desc(NextDescription))
+            repeat(EventRepeatCount) {
+                nextButton.click()
+                device.wait(Until.findObject(By.desc(ComposeIdle)), 3000)
+            }
+        }
+    }
+
+    @Test
+    fun pager_of_images_fixed_size_page_gesture_scroll() {
+        benchmarkRule.measureRepeated(
+            packageName = PackageName,
+            metrics = listOf(FrameTimingMetric(), FrameTimingGfxInfoMetric()),
+            compilationMode = compilationMode,
+            iterations = 5,
+            setupBlock = {
+                val intent = Intent()
+                intent.action = Action
+                intent.putExtra(BenchmarkType.Key, BenchmarkType.FixedSizeImage)
+                startActivityAndWait(intent)
+            }
+        ) {
+            val pager = device.findObject(By.desc(ContentDescription))
+            // Setting a gesture margin is important otherwise gesture nav is triggered.
+            pager.setGestureMargin(device.displayWidth / 5)
+            for (i in 1..EventRepeatCount) {
+                // From center we scroll 2/3 of it which is 1/3 of the screen.
+                pager.swipe(Direction.LEFT, 1.0f)
+                device.wait(Until.findObject(By.desc(ComposeIdle)), 3000)
+            }
+        }
+    }
+
+    @Test
+    fun pager_of_images_fixed_size_page_animated_scroll() {
+        benchmarkRule.measureRepeated(
+            packageName = PackageName,
+            metrics = listOf(FrameTimingGfxInfoMetric()),
+            compilationMode = compilationMode,
+            iterations = 5,
+            setupBlock = {
+                val intent = Intent()
+                intent.action = Action
+                intent.putExtra(BenchmarkType.Key, BenchmarkType.FixedSizeImage)
+                intent.putExtra(BenchmarkType.Tab, true)
+                startActivityAndWait(intent)
+            }
+        ) {
+            val nextButton = device.findObject(By.desc(NextDescription))
+            repeat(EventRepeatCount) {
+                nextButton.click()
+                device.wait(Until.findObject(By.desc(ComposeIdle)), 3000)
+            }
+        }
+    }
+
+    @Test
+    fun list_of_pagers_gesture_scroll() {
+        benchmarkRule.measureRepeated(
+            packageName = PackageName,
+            metrics = listOf(FrameTimingGfxInfoMetric()),
+            compilationMode = compilationMode,
+            iterations = 5,
+            setupBlock = {
+                val intent = Intent()
+                intent.action = Action
+                intent.putExtra(BenchmarkType.Key, BenchmarkType.ListOfPager)
+                startActivityAndWait(intent)
+            }
+        ) {
+            val pager = device.findObject(By.desc("List"))
+            // Setting a gesture margin is important otherwise gesture nav is triggered.
+            pager.setGestureMargin(device.displayHeight / 5)
+            for (i in 1..EventRepeatCount) {
+                // From center we scroll 2/3 of it which is 1/3 of the screen.
+                pager.swipe(Direction.UP, 1.0f)
+                device.wait(Until.findObject(By.desc(ComposeIdle)), 3000)
+            }
+        }
+    }
+
     companion object {
         private const val PackageName = "androidx.compose.integration.macrobenchmark.target"
         private const val Action =
             "androidx.compose.integration.macrobenchmark.target.LAZY_PAGER_ACTIVITY"
         private const val ContentDescription = "Pager"
+        private const val NextDescription = "Next"
         private const val ComposeIdle = "COMPOSE-IDLE"
+        private const val EventRepeatCount = 10
+
+        object BenchmarkType {
+            val Key = "BenchmarkType"
+            val Tab = "EnableTab"
+            val Grid = "Pager of Grids"
+            val List = "Pager of List"
+            val WebView = "Pager of WebViews"
+            val FullScreenImage = "Pager of Full Screen Images"
+            val FixedSizeImage = "Pager of Fixed Size Images"
+            val ListOfPager = "Pager Inside A List"
+        }
 
         @Parameterized.Parameters(name = "compilation={0}")
         @JvmStatic
-        fun parameters() = createCompilationParams()
+        fun parameters() = listOf(arrayOf(CompilationMode.Full()))
     }
 }
