Framework - 性能统计
摘要
近期对接客户时,客户方希望提供 SDK 的性能、内存、隐私支持等一些数据,所以就对 SDK 进行了一些性能测试。
在用表格统计整理这些数据时,突然发现,经常用统计的方式看 SDK 的相关数据,似乎也是一个发现优化的好方式。
所以想记录下来统计表格式、测试工具等,方便后面去优化 SDK。
SDK 数据表格
首先把 SDK 中性能、内存有关的数据给整理一下,我这边做成如下图的表格,方便统计和查看。

接下来,按照表格中的各个项目,去获取。
性能数据
CPU 消耗和内存消耗,这两个数据可以直接通过 Xcode 中获取到。把程序运行起来后,按照下图切换到这个面板,就可以查看到 CPU 消耗和内存消耗的实时数值。这里获取到分别是它们的最大值。

CPU 消耗
这里比较有意思的数据是 CPU。看到 CPU 的刻度能到 600%,为什么这么大?
因为我这是用的手机是 iphone 12Pro,它有 6 CPU,所以它的 CPU 最高就是 6 个 CPU满载运行,即 600%。所以获取到的值需要除以 6 才是真正的 CPU 消耗占比。
这里用到不同设备获取 CPU,在上图的面板中都会获取到不同的数值,所以,不可以拿面板中的值直接去放在其他设备上计算获得,比如不能直接除以 2 获取到 iphone 7 的 CPU 消耗占比。
内存消耗
内存消耗,是整体跑完 SDK 的功能之后,获取到内存消耗的最大值。这里在统计数据时要记得减去初始内存消耗,也就是不运行 SDK 中的功能时的内存消耗。
因为在 APP 启动完成时,也会需要内存消耗,这部分的内存消耗是维持 APP 正常运行,使用 SDK 的功能时,就会在这个基础上去增加它的内存消耗。
FPS(每秒传输帧数-Frames Per Second)
FPS 是图像领域中的定义,是指画面每秒传输帧数,每秒帧数越多,所显示的动作就会越流畅。通常,要避免动作不流程的最低是 30。
FPS 也可以理解为常说的“刷新率(单位为 Hz)‘,比如,75 Hz 的刷新率指屏幕一秒内只扫描 75 次,即 75 帧/秒。
监测 FPS
苹果提供 CADisplayLink 类监测 FPS。CADisplayLink 可以创建一个计时对象,允许应用程序将绘图与显示的刷新率同步。
下面是相关的代码:
import UIKit
class FPSLabel: UILabel {
private var link:CADisplayLink?
private var lastTime:TimeInterval = 0.0;
private var count:Int = 0;
override init(frame: CGRect) {
super.init(frame: frame)
//receiver是指didTick方法
link = CADisplayLink.init(target: self, selector: #selector(FPSLabel.didTick(link:)))
//commom会无论用户的app处于什么停止还是滑动都会进行fps打印(commonMode会添加timer到所有mode上面)
link?.add(to: RunLoop.current, forMode: .common)
}
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
@objc func didTick(link:CADisplayLink) {
if lastTime == 0 {
lastTime = link.timestamp
return
}
//用来记录一秒进入这个方法多少次,如果进入了20次那么count就变成20,20帧
count += 1
//在一秒内打印的次数
let delta = link.timestamp - lastTime
if delta < 1{
//不够一秒就返回,继续往上面count加一,这样就可以获得一秒内有多少个页面
return
}
//这时候已经到一秒了,我们先把lastTime更新至当前时间以便下一次计算
lastTime = link.timestamp
//delta是1.0000000....
print("delta :\(delta)")
let fps = Double(count)/delta
count = 0
text = String.init(format: "%02.0f帧", round(fps))
print(text ?? "0")
}
}
兼容
兼容项就很容易获取到,首先是 SDK 可以运行的最低系统版本,这个在项目工程中就可以设置,也可以轻松获取到。另外一个是设备,这个范围就比较广,移动设备、iPad、iWatch 还是其他设备,这个根据项目来处理。
加载时间
这里使用比较的方法来获取加载时间,即先跑一下没有 Framework 的加载时间,然后再跑一下有 Framework 的加载时间,做个差值就出来了(方法比较简单)。
在项目里面,选择 Edit Scheme.. 选项,然后在 Run 选项中设置 DYLD_PRINT_STATISTICS 为 1。

之后,每次运行项目的时候都会在打印的工作台中显示这些数据:
Total pre-main time: 242.05 milliseconds (100.0%)
dylib loading time: 151.75 milliseconds (62.6%)
rebase/binding time: 22.21 milliseconds (9.1%)
ObjC setup time: 6.99 milliseconds (2.8%)
initializer time: 61.09 milliseconds (25.2%)
slowest intializers :
libSystem.B.dylib : 7.70 milliseconds (3.1%)
libBacktraceRecording.dylib : 8.65 milliseconds (3.5%)
libMainThreadChecker.dylib : 40.24 milliseconds (16.6%)
计算的时候,只需要看第一项的时间就好,其他选项有别的用处,这里不做深入的探讨。
安装包大小
安装包大小参考的值可以在 appStore 发布平台上查看。主要看安装大小这个指标就可以。安装大小就是应用安装到设备中用到的内存大小。
这里获取 Framework 安装大小是先上传一个空应用,然后再上传一个有 Framework 的应用,前后比较得到 Framwork 包的安装大小。不要通过查看 .ipa 包文件这些看似直接快速的手段,数据非常的不真实,没有实际的参考意义。

隐私权限
隐私权限部分分为两个部分,一个是在 SDK 中要使用到的设备权限,比如需要使用摄像头拍照权限,那么在项目中就要设置获取权限。另外一个是要在 App Store 中要公示给用的隐私相关。这两部分都要给到应该对接方,以免因为缺少必要的隐私设置,影响到应用上线审核。
Framework - 性能统计的更多相关文章
- systemd-analyze – 在Linux中查找系统启动性能统计信息
您是否在使用 systemd 系统和服务管理器,并且您的 Linux 系统需要较长时间才能启动,或者您希望查看系统启动性能的报告? 如果是的话,你已经登陆了正确的地方. 在本文中,我们将向您展示如何使 ...
- 7.Performance Statistics(性能统计)
利用性能分析器中统计的数据,来分析和发现,其中的性能瓶颈点. 1.设置Statistic Options View>Live Options中的Statistic Options设置可以设置需要 ...
- Windows系统CPU内存网络性能统计第一篇 内存
最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的CPU使用情况,内存使用情况以及网络流量.现在将其整理一下(共有三篇),希望对大家有所帮助. 目录如下: 1.<Wind ...
- 浅谈.NET Micro Framework性能优化 转自 软件中国
.NET Micro Framework的可剪裁性,高定执行,和天生对硬件高集成度都让它的前途一片光明.当然,它现在还很年轻,就发布的SDK v3.0来看,它还有很长的路要走. 废话不说,就这几个月我 ...
- nmon性能统计工具使用-初认识
1.概述 监控,在检查系统问题或优化系统性能工作上是一个不可缺少的部分.通过操作系统监控工具监视操作系统资源的使用情况,间接地反映了各服务器程序的运行情况.根据运行结果分析可以帮助我们快速定位系统问题 ...
- linux 性能统计命令
命令1 性能压力测试,yes持续输出30s到设备中空文件,然后杀掉进程 { yes> /dev/null & } && sleep 30 && ps -e ...
- Linux性能优化之内存性能统计信息
关于内存的概念及其原理在任何一本介绍操作系统的书本中都可以查阅到. 理论放一遍,在Linux操作系统中如何查看系统内存使用情况呢?看看内存统计信息有哪些维度. 一.内存使用量 详细使用方法,man f ...
- SQLSERVER执行性能统计工具SQLQueryStress
SQLSERVER执行时间统计工具SQLQueryStress 有时候需要检测一下SQL语句的执行时间,相信大家都会用SET STATISTICS TIME ON开关打开SQLSERVER内置的时间统 ...
- 提高entity framework 性能,要注意哪些事情.
转自:http://www.cnblogs.com/jake1/archive/2013/04/25/3043664.html 我发现现在有不少博友,都反对使用EF框架,说它性能低.其实只要你用的好, ...
随机推荐
- OAuth2-简介
1. 简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用.因此OAUTH是安全的. ...
- DorisDB升级为StarRocks,全面开源!
今天被朋友圈刷屏了,StarRocks开源--携手未来,星辰大海! 原文链接:StarRocks开源--携手未来,星辰大海! 可能大家对StarRocks不太熟悉,但是DorisDB想必都是听说过的. ...
- Ordering the Soldiers 题解
CodeChef:ORDERS 简化题意: \(n\) 个人排队,给定每个人需要向左移动几个,求最终排列. 即还原逆序对. 错误想法 既然知道每个人向左移动 \(a_i\) 个,那就相当于让他的排名 ...
- adb - Performing Push Install adb: error: failed to get feature set: more than one 解决方案
问题背景 直接 adb install 包名 无法安装成功 解决方案 安装 adb -s 10.200.241.215:5555 install test.apk 删除 adb -s 10.200. ...
- js判断是在移动端还是在pc端
function chatQQ3(){ if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) { //移动端打开 ...
- 知乎vscode插件修改和重新编译
需求来源 vscode插件修改代码要怎样重新编译并安装到vscode中? 起源于我使用一个vscode插件,它可以在vscode中发布文章到知乎上,然后我修改了插件的部分源代码,希望在vscode中安 ...
- 微信公众号jssdk分享接口onMenuShareAppMessage自定义的参数无效,微信分享失败原因
使用jssdk为jweixin-1.4.0.js updateTimelineShareData,安全域名接口也设置正确,可就是分享,转发朋友圈不成功. 解决方案:采用<script src=& ...
- join方法个人理解
首先抛出对join的疑问 如果我有一个a线程,一个b线程 那此时 a.start(); b.start(); a.join(); b.join(); 是否意思是a线程先执行完,然后再执行b线程; 如果 ...
- Flask SSTI利用方式的探索
Flask SSTI利用方式的探索 一.SSTI简介&环境搭建 一个统一风格的站点,其大多数页面样式都是一致的,只是每个页面显示的内容各不相同.要是所有的逻辑都放在前端进行,无疑会影响响应 ...
- 小白自制Linux开发板 二. u-boot移植
上一篇:小白自制Linux开发板 一. 瞎抄原理图与乱画PCB 中我们做了一个小型而没用的开发板,用的是Licheepi Nano的镜像,那从本篇开始我们开始自己构建它的灵魂吧. 我们都知道,PC在 ...