Android 应用基准分析

先推荐一个作者的开源项目 最快的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:Ruleval benchmarkRule = BenchmarkRule()@Testfun log() {benchmarkRule.measureRepeated {Log.d("LogBenchmark", "the cost of writing this log method will be measured")}}
}

主角对象BenchmarkRule对象 下面再讲 这里放过,再看看项目的依赖情况

最主要的配置就是 

benchmark-junit4

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

<applicationandroid: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 accessorsval localState = getState()val localScope = scopewhile (localState.keepRunningInline()) {block(localScope)}
}

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

找到getState() 

BenchmarkState()

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/286046.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细教程 - 从零开发 Vue 鸿蒙harmonyOS应用 第七节-—— 鸿蒙应用进程通信深度剖析

一、简介 1.1 进程通信的重要性 不同进程间需要通过通信来协作完成任务良好的IPC机制是构建模块化应用的必要手段 1.2 鸿蒙采用的RPC机制 鸿蒙应用进程通信采用了轻量级RPC,流程如下: 客户端发送请求数据到服务器进程服务器调用函数处理请求,并返回响应客户端获取并处理响应…

Educational Codeforces Round 160 (Rated for Div. 2)(D 动态规划)

关于如何思考DP这件事...这题还是比较好的 思路&#xff1a;考虑为当前共有 i 个数且以为结尾&#xff0c;能够形成的字段的个数。要想求出&#xff0c;只需要知道的前一个数可以是什么&#xff0c;这样就能够进行状态转移了。 首先定义是前方第一个比小的数。 1、首先考虑比…

搭建知识付费平台?明理信息科技为你提供全程解决方案

明理信息科技saas知识付费平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和维护…

在Java中高效使用Lambda表达式和流(Streams)的技巧

Java中如何高效使用Lambda表达式和流&#xff08;Streams&#xff09;的技巧 1. 简介 在Java中&#xff0c;Lambda表达式和流&#xff08;Streams&#xff09;是Java 8引入的两个强大的特性。Lambda表达式为Java添加了一种简洁的方式来实现函数式编程&#xff0c;而流提供了一…

为什么是60R+60R+电容,而不是直接用120R?

我们经常会在CAN通讯中看到如下所示的设计&#xff1a;CAN终端电阻不直接用120欧姆&#xff0c;而是用两个60欧姆串联&#xff0c;并且在两个电阻中间用一个小电容接地。 所以为什么这么做呢&#xff1f;难道说用一颗电阻不好吗&#xff1f;还可以节省点一些布局空间。 存在即…

【OpenGL/WebGL】Shader中如何获取摄像机视口的宽高

一、需求背景 在有些需求中&#xff0c;物体的大小是随着摄像机的视口的大小而变化的。如下图中&#xff0c;蓝色小方块&#xff0c;随着不断放大&#xff0c;其大小有个最大值&#xff0c;并不会无限放大。 这种实现的原理是在Shader中&#xff0c;不断根据摄像机近平面尺寸大…

使用kali进行抓包以及aircrack-ng跑包和hashcat跑包

文章目录 一、连接无线网卡二、抓取TCP握手包三、aircrack-ng跑包和hashcat跑包1.aircrack2.Hashcat 四、其他 环境&#xff1a; VMware Workstation 16 Pro kali-linux-2023.1 64位 python3.9.13 RT3070-USB无线网卡 一、连接无线网卡 1.首先按下winr打开运行窗口 2.输入…

JDK各个版本特性讲解-JDK9特性

JDK各个版本特性讲解-JDK9特性 一、JDK版本特性二、JDK9特性讲解1. JDK9特性概述2. JDK9的改变3. JDK和JRE目录变化4. 语法层次改变4.1 钻石操作符号语法升级4.2 try结构语法升级4.3 下划线命名标识符的使用限制 5. API层次的改变5.1 接口中的私有方法5.2 String底层存储结构变…

【SpringCloudAlibaba】Sentinel熔断限流工具的使用

一、前言 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维…

MATLAB求解微积分(代码+详细解读)

大多数实际工程问题常常简化为微分方程&#xff0c;其求解显地至关重要。 符号微积分 极限 % matlab提供的求极限函数limit(),其调用格式为 % y limit(fun,x,x0) % fun为要求解的函数&#xff0c;x为函数自变量&#xff0c;x0为函数自变量的取值&#xff0c;x趋近于x0 clc;…

STM32----HAL库函数

1.STM32系统框架 1.1 Cortex-M内核&芯片 1.2 F1系统框架 4个主动单元4个被动单元 AHB&#xff1a;高级高性能总线 APH&#xff1a;高级外围总线 其中 1 为 主动单元 &#xff0c; 2为被动单元 总线时钟频率&…

Matlab智能优化算法学习笔记(一)——粒子群算法、模拟退火算法、遗传算法、蚁群算法

文章目录 粒子群算法△ matlab工具箱粒子群函数○ 代码○○ 手搓代码实现粒子群优化 2个变量&#xff08;xy&#xff09;的粒子群优化尝试 定义函数 绘制网格图&#xff08;用来可视化过程&#xff09; 参数初始化&#xff0c;绘制粒子初始位置 开始迭代过程并绘图 获取结果并绘…