# androidx.benchmark.junit4

*** ** * ** ***

## Classes

|---|---|
| `https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/AndroidBenchmarkRunner` | Instrumentation runner for benchmarks, used to increase stability of measurements and minimize interference. |
| `https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/BenchmarkRule` | JUnit rule for benchmarking code on an Android device. |
| `https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/BenchmarkRule.Scope` | Handle used for controlling measurement during `https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/package-summary#(androidx.benchmark.junit4.BenchmarkRule).measureRepeated(kotlin.Function1)`. |
| `https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/PerfettoTraceRule` | Add this rule to record a Perfetto trace for each test on Android Lollipop (API 21)+ devices. |

## Extension functions summary

|---|---|
| `inline https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/BenchmarkRule.https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/package-summary#(androidx.benchmark.junit4.BenchmarkRule).measureRepeated(kotlin.Function1)(crossinline block: https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/BenchmarkRule.Scope.() -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html)` Benchmark a block of code. |
| `inline https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/BenchmarkRule.https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/package-summary#(androidx.benchmark.junit4.BenchmarkRule).measureRepeatedOnMainThread(kotlin.Function1)(crossinline block: https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/BenchmarkRule.Scope.() -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html)` Benchmark a block of code, which runs on the main thread, and can safely interact with UI. |

## Extension functions

### BenchmarkRule.measureRepeated

Artifact: [androidx.benchmark:benchmark-junit4](https://developer.android.com/jetpack/androidx/releases/benchmark) [View Source](https://cs.android.com/search?q=file:androidx/benchmark/junit4/BenchmarkRule.kt+function:measureRepeated) Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/benchmark#1.0.0)

```
inline fun BenchmarkRule.measureRepeated(crossinline block: BenchmarkRule.Scope.() -> Unit): Unit
```

Benchmark a block of code.

```kotlin
import androidx.benchmark.junit4.BenchmarkRule
import androidx.benchmark.junit4.measureRepeated
import androidx.test.ext.junit.runners.AndroidJUnit4

@RunWith(AndroidJUnit4::class)
class MyBenchmark {
    @get:Rule val benchmarkRule = BenchmarkRule()

    @Test
    fun measureWork() {
        benchmarkRule.measureRepeated { doSomeWork() }
    }
}
```

| Parameters |
|---|---|
| `crossinline block: https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/BenchmarkRule.Scope.() -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | The block of code to benchmark. |

### BenchmarkRule.measureRepeatedOnMainThread

Artifact: [androidx.benchmark:benchmark-junit4](https://developer.android.com/jetpack/androidx/releases/benchmark) [View Source](https://cs.android.com/search?q=file:androidx/benchmark/junit4/BenchmarkRule.kt+function:measureRepeatedOnMainThread) Added in [1.3.0](https://developer.android.com/jetpack/androidx/releases/benchmark#1.3.0)

```
inline fun BenchmarkRule.measureRepeatedOnMainThread(crossinline block: BenchmarkRule.Scope.() -> Unit): Unit
```

Benchmark a block of code, which runs on the main thread, and can safely interact with UI.

While `@UiThreadRule` works for a standard test, it doesn't work for benchmarks of arbitrary duration, as they may run for much more than 5 seconds and suffer ANRs, especially in continuous runs.

```kotlin
import androidx.benchmark.junit4.BenchmarkRule
import androidx.benchmark.junit4.measureRepeated
import androidx.benchmark.junit4.measureRepeatedOnMainThread
import androidx.test.ext.junit.runners.AndroidJUnit4

@RunWith(AndroidJUnit4::class)
class MainThreadBenchmark {
    @get:Rule val benchmarkRule = BenchmarkRule()

    @Test
    fun measureWork() {
        benchmarkRule.measureRepeatedOnMainThread {
            // this block is run on the main thread
            doSomeWorkOnMainThread()
        }
    }
}
```

| Parameters |
|---|---|
| `crossinline block: https://developer.android.com/reference/kotlin/androidx/benchmark/junit4/BenchmarkRule.Scope.() -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | The block of code to benchmark. |

| Throws |
|---|---|
| `https://developer.android.com/reference/java/lang/Throwable.html` | when an exception is thrown on the main thread. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-state-exception/index.html` | if a hard deadline is exceeded while the block is running on the main thread. |