先推荐一个作者的开源项目 最快的Json解析方式 参考
benchmark数据参考
benchmark的例子 可以参考json-benchmark
应用基准分析 是衡量时间维度的框架,是App界的鲁大师跑分,常用于耗时判断,冷启动,热启动,框架对比 预热对比等方面
开局一张图 下面再编
今天要做的是Microbenchmark
集成方式
第一步创建一个benchmark module
解析工程结构
我们创建好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对象 下面再讲 这里放过,再看看项目的依赖情况
最主要的配置就是
benchmark-junit4
这个要测试就必须 停掉调试功能,这个项目也是默认模板给我们配置好的
<application
android:debuggable="false"
tools:ignore="HardcodedDebugMode"
tools:replace="android:debuggable"/>
配置错误
基准库会检测以下条件是否得到满足,确保项目和环境设置达到发布性能:
Debuggable
已设为false
。- 正在使用的是物理设备,而不是模拟器。
- 如果设备启用了 root 权限,时钟已被锁定。
- 设备的电池电量充足。
如果上述任一项检查失败,基准将抛出错误以避免不准确的测量结果。
如需抑制这些显示为警告的错误,同时阻止它们抛出错误并中止基准,请将您需抑制的错误类型以逗号分隔列表的形式传递给插桩参数 androidx.benchmark.suppressErrors
:
testInstrumentationRunnerArgument 'androidx.benchmark.suppressErrors', 'EMULATOR,LOW_BATTERY,DEBUGGABLE'
一切准备妥当,下面就执行helloworld
Hello World
运行case
这里我们就可以从时间维度上得到衡量标准, 以及简单的对象开闭数量上做出评判
那这里就有疑问了,和我们普通的
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()
到此我们可以看出 插桩采样的概念了
在计算次数 用了多种模式和参数共同计算出最大次数
次数的区间 在[1,1000000] 百万级别