
前言:
最近,在观看戴明老师分享与“性能监控”相关的技术后,我感到很多收获. 在最近的研究的基础上,我总结了一些与性能监控有关的实践,并计划撰写一系列与“性能监控”有关的文章. 目录如下: iOS性能监控(1)-CPU功耗监控
iOS性能监控(2)-主线程卡死监控
iOS性能监控(3)-耗时的方法监控
本文将介绍iOS性能监控工具(QiLagMonitor)中与“ CPU电源监控”相关的功能模块.
CPU(中央处理单元): 中央处理单元主要由三个部分组成: “计算器”,“控制器”和“寄存器”.
计算器: 负责一些算术运算. (计算)
控制器: 负责发布CPU的每个指令所需的信息. (说明)
寄存器: 负责存储操作过程或指令操作的一些临时文件. (保存数据)
CPU具有四个功能: “处理指令”,“执行操作”,“控制时间”和“处理数据”. 与人脑类似,它可以帮助我们完成各种生理活动.
在市场上,我们更熟悉的CPU体系结构是ARM(arm64)和Intel(x86). (PS: 关于ARM和Intel之间的区别可以查看此博客)
问: iPhone的CPU架构是什么?
目前,市场上大多数iPhone都基于arm64架构.

由于手臂架构具有低功耗的特性,因此被广泛应用于移动设备领域. (英特尔具有良好的性能,但功耗很高. 因此,它已经失去了在移动领域的市场份额. )
CPU体系结构模型
armv6
iPhone,iPhone 2,iPhone 3G
armv7
iPhone3GS,iPhone 4,iPhone 4S,iPad,iPad 2
armv7s
iPhone 5,iPhone 5c
arm64
iPhone 5s,iPhone 6,iPhone 6 plus,iPhone 7,iPhone 7 plus怎么查看cpu功耗,iPhone 8,iPhone 8 plus,iPhone X,iPhone XS,iPhone XR,iPhone 11,iPhone 11 pro,iPhone 11 pro max,iPad Air ,iPad Air2,iPad mini2,iPad mini3,iPad mini4,iPad版...
PS: CPU与GPU? GPU是图像处理器. 在大多数计算机中,GPU仅用于绘制图像. 它将快速计算当前屏幕的所有像素并将其绘制在显示器上.
谈论QiCPUMonitor的一般实现.
struct thread_basic_info {
time_value_t user_time; // 用户运行时长
time_value_t system_time; // 系统运行时长
integer_t cpu_usage; // CPU使用率(理论上限为1000)
policy_t policy; // 调度策略
integer_t run_state; // 运行状态
integer_t flags; // 各种标记
integer_t suspend_count; // 暂停线程的计数
integer_t sleep_time; // 休眠时间
};

名称介绍
user_time
用户运行时(准确无误).
system_time
系统运行时(精确到微妙).
cpu_usage
CPU使用率(理论上限1000).
政策
计划策略.
run_state
五种“操作状态”:
1>跑步
2>停止已停止

3>等待
4>不间断
5>停止被阻止
标志
三种“线程标志”:
1>换出
2>空闲空闲
3>全局强制空闲.
暂挂计数
已暂停的线程数.
sleep_time
线程被挂起的时间(精确到秒).
分别: 参数名称参数含义

线程
用于存储当前任务下的所有线程信息.
threadCount
用于存储多个线程.
thisTask
用于存储当前任务任务.
thread_act_array_t threads; //! 一个数组,用来记录当前任务下的所有线程。
mach_msg_type_number_t threadCount = 0; //! 一个数,该参数用来记录线程的个数。
const task_t thisTask = mach_task_self(); //! 获取当前任务的task
kern_return_t kr = task_threads(thisTask, &threads, &threadCount); //! 通过thisTask,获取threads以及threadCount。
if (kr != KERN_SUCCESS) { //! 检查是否成功,KERN_SUCCESS = 0 代表成功,其他有对应的错误码有52种。
return;
}
//! 遍历当前任务内存活的所有线程
for (int i = 0; i < threadCount; i++) {
thread_info_data_t threadInfo; // 32位data
thread_basic_info_t threadBaseInfo;
mach_msg_type_number_t threadInfoCount = THREAD_INFO_MAX;
if (thread_info((thread_act_t)threads[i], THREAD_BASIC_INFO, (thread_info_t)threadInfo, &threadInfoCount) == KERN_SUCCESS) {
threadBaseInfo = (thread_basic_info_t)threadInfo; // 获取线程的信息
if (!(threadBaseInfo->flags & TH_FLAGS_IDLE)) {
integer_t cpuUsage = threadBaseInfo->cpu_usage / 10; // CPU最大usage为1000,因此除10即可获得CPU当前的利用率。
if (cpuUsage > CPUMONITORRATE) { // 超过设定的阈值时,记录堆栈
//cup 消耗大于设置值时打印和记录堆栈
NSString *reStr = qiStackOfThread(threads[i]);
QiCallStackModel *model = [[QiCallStackModel alloc] init];
model.stackStr = reStr;
//记录中
[[[QiLagDB shareInstance] increaseWithStackModel:model] subscribeNext:^(id x) {}];
NSLog(@"CPU useage overload thread stack:
%@",reStr);
}
}
}
}
为了同时进行监视,它不会影响App的性能怎么查看cpu功耗,因此此判断使用一个计时器,该计时器可以每3秒刷新一次.
//! 监测 CPU 消耗
self.cpuMonitorTimer = [NSTimer scheduledTimerWithTimeInterval:3
target:self
selector:@selector(updateCPUInfo)
userInfo:nil
repeats:YES];
源代码: QiLagMonitor
最后,我在iOS行业的巨头们的肩膀上完成了本系列. 感谢戴明老师的精彩技术交流. 祝大家学习顺利,工作顺利. 随附戴明老师课程的链接: “ iOS开发大师课程”,谢谢!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-282476-1.html
01年服役的军舰
你是喝到肚子
而是对他们抱有希望