iOS开发中CPU功耗监控的实现与工具使用

IOS开发性能监控 ios cpu监控

前言

最近,在看戴铭老师关于 "性能监控" 相关的技术分享,感觉收获很多。基于最近的学习,总结了一些性能监控相关的实践,并计划落地一系列 "性能监控" 相关的文章。

目录如下:

  1. iOS 性能监控(一)------ CPU功耗监控
  2. iOS 性能监控(二)------ 主线程卡顿监控
  3. iOS 性能监控(三)------ 方法耗时监控

本篇将介绍iOS性能监控工具(QiLagMonitor)中与 "CPU功耗监控" 相关的功能模块。此外,Keymob助手也提供了类似的iOS性能监控功能,能够实时监控CPU、GPU、内存等指标,并通过图表展示数据,帮助开发者更高效地进行性能优化。

1

了解CPU架构

CPU(Central Processing Unit):中央处理器。

主要由 " 运算器" 、 "控制器" 、 "寄存器" 三部分组成。

运算器 :负责一些运算操作。(运算)

控制器 :负责发出CPU每条指令所需的信息。(发指令)

寄存器 :负责存储运算过程或者指令操作的一些临时文件。(存数据)

CPU有"处理指令"、"执行操作"、"控制时间"、"处理数据"四大作用。与我们人体的大脑类似,帮助我们完成各种各样的生理活动。

市场上,我们比较熟悉的CPU架构有ARM(arm64)和Intel(x86)等等。

问:那么对于我们iPhone而言,有哪些CPU架构呢?

目前,市场上大部分的iPhone都是基于

arm64 架构。(iPhone 5s之后)

因为 arm 架构有着功耗低的特点,因此广泛应用在移动设备领域。(intel虽然性能好,但功耗高。因此失去了移动端领域的市场份额。)

PS: CPU与GPU比较?

GPU是图像处理器。在大部分计算机中,GPU仅仅会用来绘制图像。它会迅速算出当前屏幕的所有像素,并在显示器上绘制出来。

2

iOS如何监控CPU功耗?

说一下

QiCPUMonitor 的大致实现思路。

  • 首先,获取当前的任务task。从任务task中获得当前所有存活的线程信息。这时,我们就拿到了当前任务所有存活的 " 线程信息"(threads) 和 " 存活的线程个数"(threadCount) 。
  • 然后,设置一个预定的CPU使用阈值。遍历所有线程的信息,查看是否有线程的CPU使用率cpu_usage " 超过" 预定的阈值(例如CPU使用率超过80%)。
  • 如果有线程的CPU使用率cpu_usage超过预定阈值,就 "存储" 当前线程的调用的堆栈信息。

3

QiCPUMonitor的具体实现

首先,介绍一下存储单个线程信息的结构体

thread_basic_info。

名称

介绍

user_time

用户运行时间(精确到微妙)。

system_time

系统运行时(精确到微妙)。

cpu_usage

cpu使用率(理论上限1000)。

policy

调度策略。

run_state

五种 "运行状态":1> running 运行中2> stopped 已停止3> waiting 等待中4> uninterruptible 不可中断5> halted 被阻塞

flags

三种 "线程标志":1> swapped 换出2> idle 空闲3> global forced idle 全局强制空闲。

suspend_count

线程已经被挂起的计数。

sleep_time

线程已经挂起的时间(精确到秒)。

其次,声明三个变量: threads、threadCount、thisTask。

分别表示:

参数名

参数含义

threads

用来存储当前任务task下的所有线程信息。

threadCount

用来存储有几条线程。

thisTask

用来存储当前任务task。

然后,通过 thisTask, 获取对应的 threads 信息以及 threadCount。

同时,检查是否获取成功, KERN_SUCCESS = 0 代表成功,其他有对应的错误码有 52 种。

最后,遍历当前任务内所有存活的线程,查看每条线程的信息。每当有线程的CPU使用率(

cpu_usage)超过指定阈值,就将当前线程的调用堆栈存入数据库。

为了监控的同时,又不影响App性能,故这个判断用一个定时器,每3秒刷新一次即可。使用Keymob助手可以进一步简化这一过程,它内置了性能监控模块,自动收集和分析数据,提供直观的图表和报告。

源码

QiLagMonitor

相关推荐
海水冷却2 小时前
Android 群组聊天怎么实现:基于 ZIM 的完整落地指南(附可运行 Demo)
android
三少爷的鞋4 小时前
现代 Android 架构指南:不要再主动设计 Callback 接口
android
镭封8 小时前
自媒体内容生产怎么提速?文案整理、配音与剪辑流程
人工智能·小程序·音视频·语音识别·媒体
anyup8 小时前
uView Pro X 1.0.0 发布:全面支持 uni-app x 蒸汽模式,80+ 组件
前端·uni-app·ai编程
科威网络8 小时前
小程序开发性能优化:分包、预加载与启动时间
性能优化·微信小程序·小程序
TimeFine10 小时前
AI 编码工作流的设计
android·ai编程
七牛云行业应用10 小时前
DeepSeek Harness(dsh)安装完整指南:Windows、macOS、Linux 三平台 + 桌面端与 Web 端全覆盖
linux·windows·macos·ai·ai编程
骑着蜗牛撵大象32710 小时前
C++20 协程 × 屏障:手写一个 co_await 版 Barrier,让等待不再钉死线程
android·c++20·协程·并发编程·co_await·屏障同步
zhongben123_12 小时前
从零开发一个打车APP:技术选型、系统架构与成本评估指南
大数据·运维·ios·系统架构·uni-app·web app
山东孙燕姿12 小时前
设备台账重构:从一张表到三层模型
android·java·网络·低代码·重构·rxjava