Instrument的使用
可以看到 Instruments 功能很多,这里先介绍一下我们在开发中常用到的几种:CPU 性能测试、图形性能测试、内存性能测试。本文主要介绍Time Profiler、Core Animation、Leaks的简单实用。
工具通过Xcode工具栏中Product->Profile(command+i)可以启动,启动后界面如下:
在开始进行应用程序性能分析的时候,建议使用真机测试,数据会更可靠。毕竟模拟器运行在Mac上,Mac上的CPU和手机的CPU是不一样的。
应用程序运行一定要发布配置 而不是调试配置。
###1.Time Profiler 时间分析工具
用来检测应用CPU的使用情况.可以看到应用程序中各个方法正在消耗CPU时间。
1.选择 Time Profiler,并点击 Choose按钮。
2.选择正确的设备和应用程序
3.点击红色按钮运行后,就能得到 CPU 性能的结果
4.勾选右边Call Tree中Separate Thread和Hide System Libraries两个选项后,可以看到对应的代码执行耗时
5.双击方法,可以看到代码详情
其中[dateDetector matchesInString]耗时是122x,x既耗时单位这里为ms毫秒.当然如果直接在Instrument找到问题觉得不方便修改,可以直接点击右上方Xcode按钮会直接定位Xcode对应调用方法入口.这样很容易能够快速定位代码占用CPU最多的方法.也可以打开Xcode快速修改并重新运行Profile来看修改后耗时前后对比.简单便捷。
####这里对右侧call tree选项有必要做一下说明[官方user guide翻译]:
Separate By Thread
线程分离,只有这样才能在调用路径中能够清晰看到占用CPU最大的线程.
Invert Call Tree
从上到下跟踪堆栈信息.这个选项可以快捷的看到方法调用路径最深方法占用CPU耗时,比如FuncA{FunB{FunC}},勾选后堆栈以C->B->A把调用层级最深的C显示最外面.
Hide Missing Symbols
如果dSYM无法找到你的APP或者调用系统框架的话,那么表中将看到调用方法名只能看到16进制的数值,勾选这个选项则可以隐藏这些符号,便于简化分析数据.
Hide System Libraries
这个就更有用了,勾选后耗时调用路径只会显示app耗时的代码,性能分析普遍我们都比较关系自己代码的耗时而不是系统的.基本是必选项.注意有些代码耗时也会纳入系统层级,可以进行勾选前后前后对执行路径进行比对会非常有用.
2.Core Animation
评估图形性能
1.选择 Core Animation,并点击 Choose按钮。
2.选择正确的设备和应用程序
3.点击红色按钮运行后,随着我们操作 App,就能得到数据
在右下角面板的 Settings 区域,我们可以看到多个 Debug Options:
注:xcode9.3以后,debug Options在路径为:Xcode->Debug->View Debugging->Rendering中选择
Color Blended Layers
这个选项选项基于渲染程度对屏幕中的混合区域进行绿到红的高亮显示,越红表示性能越差,会对帧率等指标造成较大的影响。红色通常是由于多个半透明图层叠加引起。
Color Hits Green and Misses Red
当 UIView.layer.shouldRasterize = YES时,耗时的图片绘制会被缓存,并当做一个简单的扁平图片来呈现。这时候,如果页面的其他区块(比如 UITableViewCell 的复用)使用缓存直接命中,就显示绿色,反之,如果不命中,这时就显示红色。红色越多,性能越差。因为栅格化生成缓存的过程是有开销的,如果缓存能被大量命中和有效使用,则总体上会降低开销,反之则意味着要频繁生成新的缓存,这会让性能问题雪上加霜。
Color Copied Images
对于 GPU 不支持的色彩格式的图片只能由 CPU 来处理,把这样的图片标为蓝色。蓝色越多,性能越差。因为,我们不希望在滚动视图的时候,由 CPU 来处理图片,这样可能会对主线程造成阻塞。
Color Immediately
通常 Core Animation Instruments 以每毫秒 10 次的频率更新图层调试颜色。对某些效果来说,这显然太慢了。这个选项就可以用来设置每帧都更新(可能会影响到渲染性能,而且会导致帧率测量不准,所以不要一直都设置它)。
Color Misaligned Images
这个选项检查了图片是否被缩放,以及像素是否对齐。被放缩的图片会被标记为黄色,像素不对齐则会标注为紫色。黄色、紫色越多,性能越差。
Color Offscreen-Rendered Yellow
这个选项会把那些离屏渲染的图层显示为黄色。黄色越多,性能越差。这些显示为黄色的图层很可能需要用 shadowPath 或者 shouldRasterize 来优化。
Color OpenGL Fast Path Blue
这个选项会把任何直接使用 OpenGL 绘制的图层显示为蓝色。蓝色越多,性能越好。如果仅仅使用 UIKit 或者 Core Animation 的 API,那么不会有任何效果。如果使用 GLKView 或者 CAEAGLLayer,那如果不显示蓝色块的话就意味着你正在强制 CPU 渲染额外的纹理,而不是绘制到屏幕。
Flash Updated Regions
这个选项会把重绘的内容显示为黄色。不该出现的黄色越多,性能越差。通常我们希望只是更新的部分被标记完黄色。
###3.Leaks
1.选择 Leaks,并点击 Choose按钮。
2.选择正确的设备和应用程序
3.点击红色按钮运行后,随着我们操作 App,就能得到数据
4.可在下图这个位置选择,展示的不同模式
5.在Call Trees模式下,在Settings 中勾选 Invert Call Tree 或 Hide System Libraries,或其他选项可以过滤显示的数据。
6.出现内存泄露的情况
7.选中上图的Leak Checks 一栏
8.然后点击导航栏切换到“Call Tree”模式
9.勾选右边的详细窗口 Display Settings中的 Call Tree中 Separate by Thread和 Hide System Libraries两个选项,Hide System Libraries作用是隐藏系统函数。能方便的看到程序中代码所在的位置。
10.勾选之后,双击一下就会来到内存泄漏的地方
Instrument的使用相关推荐
- Java字节码instrument研究
MyAgent项目 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- java.lang.instrument 学习(一)
[+] 转自:http://jiangbo.me/blog/2012/02/21/Java-lang-instrument/ Instrumentation介绍: Java Instrumentati ...
- [转]java.lang.instrument 学习(一)
[转]java.lang.instrument 学习(一) 收藏 sunyh 发表于 10个月前 阅读 40 收藏 3 点赞 1 评论 0 转自:http://jiangbo.me/blog/201 ...
- java.lang.Instrument 动态修改替换类代码
java.lang.Instrument 动态修改替换类代码 | java.lang.Instrument包是在JDK5引入的,程序员通过修改方法的字节码实现动态修改类代码. 这通常是在类的main方 ...
- java.lang.Instrument 代理Agent使用
原文出处: 陶邦仁 java.lang.Instrument包是在JDK5引入的,程序员通过修改方法的字节码实现动态修改类代码.这通常是在类的main方法调用之前进行预处理的操作,通过java指定该类 ...
- java入参为方法_Java命令注入原理结合Java Instrument技术(FreeBuf首发)
一.前言 命令注入:恶意用户构造恶意请求,对一些执行系统命令的功能点进行构造注入,从而达到执行命令的效果. 二.演示环境搭建 这里采用springboot+swagger搭建一个模拟的web环境:启动 ...
- java 上溯_java中Instrument的上溯造型
继承最值得注意的地方就是它没有为新类提供方法.继承是对新类和基础类之间的关系的一种表达.可这样总结该关系:"新类属于现有类的一种类型". 这种表达并不仅仅是对继承的一种形象化解释, ...
- java Instrument修改字节码实现aop功能
Agent工程2个类: public class MyAgent {/*** 该方法在main方法之前运行,与main方法运行在同一个JVM中* 并被同一个System ClassLoader装载* ...
- 定义一个Instrument(乐器)类,并使用共有的play()方法,再分别定义子类 管乐器 打击乐器 弦乐器,使用重写play方法,实现每种乐器的独特play方式。
package Extends; public class Instrument { public void play(){ System.out.println("使用乐器!") ...
- 【JVM】字节码与ASM字节码增强、Instrument实现类的动态重加载
目录 字节码与ASM字节码增强 什么是字节码? 字节码结构 操作数栈与字节码 字节码增强 ASM 运行时类加载 Instrument JPDA与JVMTI instrument实现热加载的过程 字节码 ...
最新文章
- 【图论专题】最小生成树的扩展应用
- 3月Win 10美占有率超20% 免费升级是否延长受关注
- css聊天布局,CSS实现聊天布局
- Linux下history命令详解---转载
- 二级联动菜单(javascript)
- bzoj4665小w的喜糖 dp+容斥
- python观察日志(part19)--关于iPython中的In[]和Out[]
- 高安全性同态加密算法_坏的同态性教程
- UNIX(多线程):23---线程池注意事项和常见问题
- win7 IE11卸载后无法上网
- 从一个点云里面创建一个深度图
- LeetCode刷题(2)
- Sigmod/Softmax变换
- android侧边栏点击,侧边菜单栏 android-menudrawer
- kubernetes视频教程笔记 (15)-RC、RS和Deployment的关联
- 【PMP】PMBOK 笔记 第10章 项目沟通管理
- 设计一个求直角三角形斜边长的函数
- 手把手教你实现嵌入式SNMP代理第1部分-熊健-专题视频课程
- php抢票程序,HTML实现抢票功能(设定时间打开抢票的页面)
- @RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解