怎么做发动优化,怎么监控
iOS发动优化是提高运用程序发动速度和呼应功用的一系列技术和办法。下面是一些常用的iOS发动优化办法和监控东西:
发动优化办法:
-
削减冷发动时刻:冷发动是指运用进程不在系统中,需要系统分配新的进程来发动运用。为了削减冷发动时刻,能够考虑以下优化办法:
- 兼并动态库并削减运用Embedded Framework。
- 删去无用代码并抽取重复代码。
- 防止在+load办法中履行耗时操作,运用+initialize代替。
- 防止运用attribute((constructor)),可即将完成的内容放在初始化办法中合作dispatch_once运用。
- 削减非基本类型的C++静态全局变量的个数。
-
优化main函数署理阶段:main函数署理阶段是指从main()函数开始履行到didFinishLaunchingWithOptions办法履行结束的耗时。在这个阶段能够考虑以下优化办法:
- 删去不必要的初始化代码。
- 推迟加载不必要的模块和功用。
- 运用异步加载和懒加载来提高发动速度。
监控东西:
- Xcode Instruments:Xcode自带的功用剖析东西,能够运用Time Profiler和System Trace等东西来监控运用程序的发动时刻和功用。
- DYLD_PRINT_STATISTICS:经过设置环境变量DYLD_PRINT_STATISTICS或DYLD_PRINT_STATISTICS_DETAILS,能够在Xcode中检查运用程序发动过程中各个阶段的耗时统计信息。
以上是一些常用的iOS发动优化办法和监控东西,经过优化发动流程和运用适宜的东西,能够提高运用程序的发动速度和呼应功用。
Learn more:
怎么做卡顿优化,怎么监控
iOS卡顿优化办法能够从两个方面入手:CPU优化和GPU优化。下面将介绍一些常用的优化办法,并供给一些监控东西供参阅。
CPU优化办法:
-
削减核算量:
-
图片解码优化:
- 运用SDWebImage等库,在后台线程将图片制作到CGBitmapContext中,然后直接从Bitmap创立图片 [1].
GPU优化办法:
-
削减烘托量:
-
画圆角防止离屏烘托:
- 运用CAShapeLayer与UIBezierPath合作画圆角 [1].
监控东西:
- Instruments:Xcode自带的功用剖析东西,能够监控CPU、内存、网络等功用指标,协助定位卡顿问题 [2].
- FPS监控:经过在App中增加FPS监控代码,能够实时监测帧率,判别是否存在卡顿 [2].
- 卡顿检测东西:如Facebook的Chisel、Tencent的GT等,能够监测主线程卡顿情况,并供给详细的卡顿仓库信息 [2].
以上是一些常用的iOS卡顿优化办法和监控东西
Learn more:
FPS 用 CADisplayLinker 来计数
运用CADisplayLink来核算FPS的过程如下:
- 创立CADisplayLink目标,并将其增加到当时的run loop中的NSRunLoopCommonModes中。这样能够确保CADisplayLink在屏幕刷新时被调用。
- 在CADisplayLink的回调办法中,记载每次调用的次数,并核算时刻距离。
- 当时刻距离超越1秒时,核算FPS并进行相应的处理(例如打印、显现在界面上等)。
- 重置计数和时刻戳,以便下一次核算。
以下是一个示例代码:
import UIKit
class ViewController: UIViewController {
var displayLink: CADisplayLink?
var frameCount = 0
var timestamp = 0.0
override func viewDidLoad() {
super.viewDidLoad()
setupDisplayLink()
}
func setupDisplayLink() {
displayLink = CADisplayLink(target: self, selector: #selector(update))
displayLink?.add(to: .current, forMode: .common)
}
@objc func update() {
if timestamp == 0 {
timestamp = displayLink?.timestamp ?? 0
return
}
frameCount += 1
let elapsed = displayLink?.timestamp ?? 0 - timestamp
if elapsed >= 1.0 {
let fps = Double(frameCount) / elapsed
print("FPS: (fps)")
// Reset
frameCount = 0
timestamp = displayLink?.timestamp ?? 0
}
}
}
这段代码创立了一个CADisplayLink目标,并将其增加到当时的run loop中。在每次屏幕刷新时,会调用update
办法。在update
办法中,咱们记载每次调用的次数,并核算时刻距离。当时刻距离超越1秒时,咱们核算FPS并进行相应的处理。最终,咱们重置计数和时刻戳,以便下一次核算。
请注意,运用CADisplayLink核算的FPS只是一个指导意义,不能代表真实的FPS。因为CADisplayLink是以屏幕刷新频率为基准的,而在实际运用中,或许存在其他要素(例如CPU和GPU的功用)影响帧率。因此,这个FPS指示器只能作为一个参阅,不能彻底精确地反映屏幕的帧率。
Learn more:
怎样监听 runloop 的 source0 事情和进入休眠前,然后设定一个阈值,监听卡顿
要监听 RunLoop 的 source0 事情和进入休眠前的办法,能够运用 CFRunLoopObserver 来完成。CFRunLoopObserver 是一个调查者,能够监听 RunLoop 的情况改变,并在特定的时刻点履行相应的操作。
以下是详细的过程:
-
创立一个 CFRunLoopObserver 目标,并指定调查的时刻点和调查的事情类型。能够运用 CFRunLoopObserverCreate 函数来创立调查者目标。
-
界说一个回调函数,用于在调查的时刻点履行相应的操作。回调函数的参数包含调查者目标、调查的事情类型和上下文信息。
-
将调查者目标增加到 RunLoop 的指定方式下。能够运用 CFRunLoopAddObserver 函数将调查者目标增加到 RunLoop 中。
-
在回调函数中,能够依据调查的事情类型履行相应的操作。例如,在监听进入休眠前的事情时,能够记载当时时刻,并与上一次记载的时刻进行比较,判别是否发生了卡顿。
-
依据需要,能够设置一个阈值来判别卡顿的时刻。如果超越了阈值,能够进行相应的处理,例如打印日志、发送告诉或采纳其他办法。
以下是一个示例代码,演示怎么监听 RunLoop 的 source0 事情和进入休眠前的办法,并设定一个阈值来监听卡顿:
// 界说调查者的回调函数
void runLoopObserverCallback(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) {
if (activity == kCFRunLoopBeforeSources) {
// 在 source0 事情之前履行的操作
NSLog(@"Before sources");
} else if (activity == kCFRunLoopBeforeWaiting) {
// 在进入休眠前履行的操作
NSLog(@"Before waiting");
// 记载当时时刻
NSDate *currentDate = [NSDate date];
// 获取上一次记载的时刻
NSDate *lastDate = (__bridge NSDate *)(info);
// 核算时刻差
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:lastDate];
// 设置阈值,判别是否发生卡顿
NSTimeInterval threshold = 1.0; // 1秒
if (timeInterval > threshold) {
NSLog(@"Cardon detected");
}
// 更新上一次记载的时刻
CFDateRef dateRef = (__bridge_retained CFDateRef)(currentDate);
CFRelease((__bridge CFTypeRef)(lastDate));
*(CFDateRef *)(info) = dateRef;
}
}
// 创立调查者目标
CFRunLoopObserverContext context = {0, (__bridge void *)([NSDate date]), NULL, NULL, NULL};
CFRunLoopObserverRef observer = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, &runLoopObserverCallback, &context);
// 将调查者目标增加到 RunLoop 的默认方式下
CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopDefaultMode);
// 运行 RunLoop
CFRunLoopRun();
// 释放调查者目标
CFRelease(observer);
这样,就能够监听 RunLoop 的 source0 事情和进入休眠前的办法,并设定一个阈值来监听卡顿。
Learn more:
- [iOS面试]第7章 RunLoop相关面试问题 | codeTao
- iOS Runloop 总结 | Edgar’s Blog
- GitHub – fanren5119/iOS-runloop: 本届详细讲解了ios的runloop
怎么做耗电优化,怎么监控
iOS耗电优化办法能够经过以下几个过程来完成:
-
运用Energy impact进行耗电检测:
-
运用Energy Log进行耗电检测:
-
运用sysdiagnose进行耗电检测:
-
优化耗电量:
Learn more:
怎么做网络优化,怎么监控
iOS网络优化办法能够从削减恳求带宽和下降恳求推迟两个方面进行优化。同时,监控网络功用也是很重要的,能够协助咱们了解运用的网络情况并及时发现问题。
以下是一些iOS网络优化的办法和监控网络功用的东西:
iOS网络优化办法:
-
削减恳求带宽:
- 运用高效的数据交互方式。
- 在或许的情况下运用预先紧缩的数据。
- 紧缩每一个恳求与呼应负载[1]。
-
下降恳求推迟:
- 最小化DNS查询的数量,能够运用DNS预下载进行更早的DNS解析。
- 最大程度削减运用建议的衔接数,恳求结束时不要封闭HTTPS衔接,运用域分片等办法来削减SSL握手时刻。
- 在单个TCP衔接上发送HTTP恳求,以管道的方式发送HTTP恳求,防止多个TCP衔接的开销[1]。
iOS网络功用监控东西:
-
Network Link Conditioner:是iOS开发者东西中的一个功用,能够模仿不同网络环境下的网络衔接情况,协助开发者测试运用在不同网络条件下的功用体现。
-
Charles Proxy:是一款常用的网络抓包东西,能够用于监控和剖析iOS设备上的网络恳求和呼应,协助开发者了解运用的网络情况。
-
Firebase Performance Monitoring:是Google供给的一款移动运用功用监控东西,能够监控运用的网络恳求、呼应时刻等功用指标,并供给实时的功用报告和剖析。
-
Alamofire Network Logger:是一款基于Alamofire网络库的日志记载东西,能够记载和显现iOS运用的网络恳求和呼应的详细信息,便利开发者进行网络功用剖析。
以上是一些常用的iOS网络优化办法和监控东西,经过优化网络功用和监控网络情况,能够提高运用的用户体会和功用体现。
Learn more: