Android 应用基准分析

先推荐一个作者的开源项目 最快的Json解析方式 参考
benchmark数据参考

benchmark的例子 可以参考json-benchmark

应用基准分析 是衡量时间维度的框架,是App界的鲁大师跑分,常用于耗时判断,冷启动,热启动,框架对比 预热对比等方面

开局一张图 下面再编

Android 应用基准分析_第1张图片今天要做的是Microbenchmark


集成方式

第一步创建一个benchmark module

Android 应用基准分析_第2张图片

Android 应用基准分析_第3张图片

解析工程结构

Android 应用基准分析_第4张图片

我们创建好module之后 会为我们创建一个case模板,是基于AndroidJunit4的

/**
 * Benchmark, which will execute on an Android device.
 *
 * The body of [BenchmarkRule.measureRepeated] is measured in a loop, and Studio will
 * output the result. Modify your code to see how it affects performance.
 */
@RunWith(AndroidJUnit4::class)
class ExampleBenchmark {

    @get:Rule
    val benchmarkRule = BenchmarkRule()

    @Test
    fun log() {
        benchmarkRule.measureRepeated {
            Log.d("LogBenchmark", "the cost of writing this log method will be measured")
        }
    }
}

主角对象BenchmarkRule对象 下面再讲 这里放过,再看看项目的依赖情况
Android 应用基准分析_第5张图片

最主要的配置就是 

benchmark-junit4

这个要测试就必须 停掉调试功能,这个项目也是默认模板给我们配置好的

Android 应用基准分析_第6张图片

配置错误

基准库会检测以下条件是否得到满足,确保项目和环境设置达到发布性能:

  • Debuggable 已设为 false
  • 正在使用的是物理设备,而不是模拟器。
  • 如果设备启用了 root 权限,时钟已被锁定。
  • 设备的电池电量充足。

如果上述任一项检查失败,基准将抛出错误以避免不准确的测量结果。

如需抑制这些显示为警告的错误,同时阻止它们抛出错误并中止基准,请将您需抑制的错误类型以逗号分隔列表的形式传递给插桩参数 androidx.benchmark.suppressErrors

testInstrumentationRunnerArgument 'androidx.benchmark.suppressErrors', 'EMULATOR,LOW_BATTERY,DEBUGGABLE'

Android 应用基准分析_第7张图片

一切准备妥当,下面就执行helloworld

Hello World

运行case 

Android 应用基准分析_第8张图片

Android 应用基准分析_第9张图片

这里我们就可以从时间维度上得到衡量标准, 以及简单的对象开闭数量上做出评判

那这里就有疑问了,和我们普通的

SystemClock.elapsedRealtimeNanos()

做减法有什么区别?

这里就要了解BenchmarkRule的实现了

BenchmarkRule
 

public inline fun BenchmarkRule.measureRepeated(crossinline block: BenchmarkRule.Scope.() -> Unit) {
    // Note: this is an extension function to discourage calling from Java.

    // Extract members to locals, to ensure we check #applied, and we don't hit accessors
    val localState = getState()
    val localScope = scope

    while (localState.keepRunningInline()) {
        block(localScope)
    }
}

这里貌似是一个状态控制的死循环

找到getState() 

BenchmarkState()

Android 应用基准分析_第10张图片

Android 应用基准分析_第11张图片

Android 应用基准分析_第12张图片

到此我们可以看出 插桩采样的概念了

Android 应用基准分析_第13张图片

在计算次数 用了多种模式和参数共同计算出最大次数

次数的区间 在[1,1000000] 百万级别

你可能感兴趣的:(测试,性能优化)