IOS性能调优系列:使用Time Profiler发现性能瓶颈
硬广:《IOS性能调优系列》第五篇,预计会有二十多篇,持续更新,欢迎关注。
之前四篇都是关注于内存方面,分析了内存泄漏、僵尸对象、内存分配,本篇介绍Time Profiler工具的使用,开始真正的“性能”调优之旅。
Time Profiler还有之前介绍过的Leaks、Allocations工具,被戏称为Instruments的救命三招,是当应用遇到问题时首先应当使用的三个工具。
Time Profiler帮助我们分析代码的执行时间,找出导致程序变慢的原因,告诉我们“时间都去哪儿了?”。
在使用Time Profiler之前,先看看原始的性能分析方法。
原始的性能分析方法
这种分析方法估计是很多开发人员第一时间想到的,写个单元测试,在开始和结束的地方记录时间。
示例代码:
NSDate *stDate = [NSDate date];
for(int i = 0; i < 999; i++)
{
// do something
}
NSDate *endDate = [NSDate date];
NSLog(@"time:%f", [endDate timeIntervalSinceDate:stDate]);
通过计算时差,可以算出中间消耗的时间,通过这种办法可以一部分一部分的对可能出现性能瓶颈的代码进行分析。
这种方法的缺点有以下亮点:
1、测试效率太低,很多性能瓶颈是很难预估到的,需要从上层到下层进行逐步排除;
2、无法对界面渲染的效率进行测试,找出界面性能瓶颈;
3、NSLog的分析不够精确,可能在模拟器上由于开发设备性能速度快,无法明显区分出性能瓶颈。
这也是使用Time Profiler工具的优势,能以极高的效率找出性能瓶颈。
使用Time Profiler的性能分析方法
Time Profiler分析原理:它按照固定的时间间隔来跟踪每一个线程的堆栈信息,通过统计比较时间间隔之间的堆栈状态,来推算某个方法执行了多久,并获得一个近似值。其实从根本上来说与我们的原始分析方法异曲同工,只不过其将各个方法消耗的时间统计起来。
和使用 Instruments的其他工具一样,点击XCode的Product菜单Profile启动Instruments:
选择Time Profiler工具开始测试,这时会自动启动模拟器和Time Profiler录制。
先进行一些App的操作,让Time Profiler收集足够的数据,尤其是你觉得那些有性能瓶颈的地方。
4、5、6所标记的面板是需要关注的:
4是扩展面板,用来跟踪显示堆栈;5是详细地面板,可以从这里看到cpu运行的时间都消耗在哪里;6是选项面板,可以用来设置Time Profiler的运行参数。
通过对应用的操作,可以在详细面板中看到那些最耗时的操作是哪些,并可以逐行展开查看:
图标为黑色头像的就是Time Profiler给我们的提示,有可能存在性能瓶颈的地方,可以逐渐向下展开,找到产生的根本原因。
比如我们通过分析,发现[CMTool getNewsTimeFromLong]这个时间格式化函数可能需要优化。
当然这里只是举一个例子,性能调优应该首先从整体到细节的顺序进行,才能收到最明显的效果。
Time Profiler参数设置
这里边几个选项的含义如下:
Separate by Thread: 每个线程应该分开考虑。只有这样你才能揪出那些大量占用CPU的"重"线程
Invert Call Tree: 从上倒下跟踪堆栈,这意味着你看到的表中的方法,将已从第0帧开始取样,这通常你是想要的,只有这样你才能看到CPU中话费时间最深的方法.也就是说FuncA{FunB{FunC}} 勾选此项后堆栈以C->B-A 把调用层级最深的C显示在最外面
Hide Missing Symbols: 如果dSYM无法找到你的app或者系统框架的话,那么表中看不到方法名只能看到十六进制的数值,如果勾线此项可以隐藏这些符号,便于简化数据
Hide System Libraries: 勾选此项你会显示你app的代码,这是非常有用的. 因为通常你只关心cpu花在自己代码上的时间不是系统上的
Show Obj-C Only: 只显示oc代码 ,如果你的程序是像OpenGl这样的程序,不要勾选侧向因为他有可能是C++的
Flatten Recursion: 递归函数, 每个堆栈跟踪一个条目
Top Functions: 一个函数花费的时间直接在该函数中的总和,以及在函数调用该函数所花费的时间的总时间。因此,如果函数A调用B,那么A的时间报告在A花费的时间加上B花费的时间,这非常真有用,因为它可以让你每次下到调用堆栈时挑最大的时间数字,归零在你最耗时的方法。
上面的参数在实践中合理设置,也没有什么太多技巧,就是通过数据的隐藏、显示让我们更关注于想找到的数据。
天下应用,唯快不破!尤其是手机应用,更应该注意用户体验和响应速度。
记录,为更好的自己!
转载于:https://www.cnblogs.com/ym123/p/4324335.html
IOS性能调优系列:使用Time Profiler发现性能瓶颈相关推荐
- IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
硬广:<IOS性能调优系列>第四篇,预计会有二十多篇,持续更新,欢迎关注. 前两篇<IOS性能调优系列:Analyze静态分析>.<IOS性能调优系列:使用Instrum ...
- 小布老师视频教程----oracle 9i 性能调优系列培训(全)
oracle 9i 性能调优系列培训(全)第01讲:Chapter 01--Overview of Oracle9i Database Performance Tuning 第02讲:Chapter ...
- jvm原理及性能调优系列(jvm调优)
jvm原理及性能调优系列(jvm调优) JVM设置: 1.设置合适的最大堆内存(新生代和老生代的最大和值)和最小堆内存(jvm启动时占用的操作系统内存大小),及设置好堆的比例分配. 2.设置合适的新生 ...
- 肝了 15000 字性能调优系列专题(JVM、MySQL、Nginx and Tomcat),看不完先收藏
前言 性能调优,无疑是个庞大的话题,也是很多项目中非常重要的一环,性能调优难做是众所周知的,毕竟性能调优涵盖的面实在是太多了,在这里我就大概的讲一下企业中最常用的四种调优--JVM 调优.MySQL ...
- Spark性能调优系列:Spark参数配置大全(官网资料)
Spark参数配置大全 Spark提供了三个位置来配置系统 Spark属性控制大多数应用程序参数,可以使用SparkConf对象或Java系统属性来设置. 通过conf/spark-env.sh每个节 ...
- iOS性能调优利器——Instruments的使用
最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...
- 一款性能调优神器,1分钟定位性能瓶颈!!!
来源:https://zhenbianshu.github.io 前言 工具的进化一直是人类生产力进步的标志,合理使用工具能大大提高我们的工作效率,遇到问题时,合理使用工具更能加快问题排查的进度.这 ...
- 数据库性能调优之始: analyze统计信息
摘要:本文简单介绍一下什么是统计信息.统计信息记录了什么.为什么要收集统计信息.怎么收集统计信息以及什么时候收集统计信息. 1 WHY:为什么需要统计信息 1.1 query执行流程 下图描述了Gau ...
- 十八般武艺玩转GaussDB(DWS)性能调优:Plan hint运用
摘要:本文介绍GaussDB(DWS)另一种可以人工干预计划生成的功能--plan hint. 前言 数据库的使用者在书写SQL语句时,会根据自己已知的情况尽力写出性能很高的SQL语句.但是当需要写大 ...
最新文章
- MATLAB-矩阵相关计算(1)
- gmail头像_Gmail与Google+进一步整合:可显示好友头像
- 5.3 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接---三次握手、tcp连接释放---四次握手)
- android gsensor 坐标,MTK Android G sensor 原理,配置,调试
- 软件项目管理第三课—如何应对投标书的软件功能报价
- Golang:无惧makefile
- 数值运算pythonmopn_Python SciPy库——拟合与插值
- qt checkbox 选中事件_Qt基础知识学习
- JavaBean与Map相互转换
- php 中访问常量,php 中的常量
- Android万能布局检查器UI Automator Viewer使用教程、环境配置和Mac无法打开问题解决(uiautomatorviewer,android studio,layer,查看,错误)
- Java对中文字符串按照拼音排序的思索
- Java 读取excel文件并导入数据库
- innodb_io_capacity、innodb_io_capacity_max 的影响
- Kubernetes 二进制安装详细步骤
- World Locking Tools for Unity (五)安装部分
- 第 7 章网络可扩展性
- 苏州企业研发费用精准统计难点分析
- matlab如何igbt开关频率,IGBT的开关时间说明
- MongoDB填坑Can't find a codec for class org.springframework.data.mongodb.core.query.GeoCommand