怎么做发动优化,怎么监控

iOS发动优化是提高运用程序发动速度和呼应功用的一系列技术和办法。下面是一些常用的iOS发动优化办法和监控东西:

发动优化办法:

  1. 削减冷发动时刻:冷发动是指运用进程不在系统中,需要系统分配新的进程来发动运用。为了削减冷发动时刻,能够考虑以下优化办法:

    • 兼并动态库并削减运用Embedded Framework。
    • 删去无用代码并抽取重复代码。
    • 防止在+load办法中履行耗时操作,运用+initialize代替。
    • 防止运用attribute((constructor)),可即将完成的内容放在初始化办法中合作dispatch_once运用。
    • 削减非基本类型的C++静态全局变量的个数。
  2. 优化main函数署理阶段:main函数署理阶段是指从main()函数开始履行到didFinishLaunchingWithOptions办法履行结束的耗时。在这个阶段能够考虑以下优化办法:

    • 删去不必要的初始化代码。
    • 推迟加载不必要的模块和功用。
    • 运用异步加载和懒加载来提高发动速度。

监控东西:

  1. Xcode Instruments:Xcode自带的功用剖析东西,能够运用Time Profiler和System Trace等东西来监控运用程序的发动时刻和功用。
  2. DYLD_PRINT_STATISTICS:经过设置环境变量DYLD_PRINT_STATISTICS或DYLD_PRINT_STATISTICS_DETAILS,能够在Xcode中检查运用程序发动过程中各个阶段的耗时统计信息。

以上是一些常用的iOS发动优化办法和监控东西,经过优化发动流程和运用适宜的东西,能够提高运用程序的发动速度和呼应功用。


Learn more:

  1. 深化探究 iOS 发动速度优化 –
  2. iOS发动优化看我就够了 –
  3. IOS优化篇之发动速度优化(一) – 简书

怎么做卡顿优化,怎么监控

iOS卡顿优化办法能够从两个方面入手:CPU优化和GPU优化。下面将介绍一些常用的优化办法,并供给一些监控东西供参阅。

CPU优化办法:

  1. 削减核算量:

    • 提早核算好布局,防止在显现时进行复杂的核算 [1].
    • 运用轻量级目标,如CALayer代替UIView,防止不必要的事情处理 [1].
    • 防止重复履行的办法,如多个当地监听同一个告诉,告诉中履行多次的铲除缓存的办法 [1].
    • 将耗时的操作放到子线程,防止阻塞主线程 [1].
    • 将文本处理放在子线程进行,如文本尺寸核算和制作 [1].
  2. 图片解码优化:

    • 运用SDWebImage等库,在后台线程将图片制作到CGBitmapContext中,然后直接从Bitmap创立图片 [1].

GPU优化办法:

  1. 削减烘托量:

    • 兼并多张图片为一张图片显现,削减短时刻内很多图片的显现 [1].
    • 控制纹路尺寸不超越4096*4096,防止占用CPU资源进行处理 [1].
    • 削减视图数量和层次,防止混合过程中消耗CPU资源 [1].
    • 尽量运用不透明的视图,设置opacity为YES,防止alpha通道的组成 [1].
    • 防止离屏烘托,如光栅化、遮罩、圆角等操作 [1].
  2. 画圆角防止离屏烘托:

    • 运用CAShapeLayer与UIBezierPath合作画圆角 [1].

监控东西:

  1. Instruments:Xcode自带的功用剖析东西,能够监控CPU、内存、网络等功用指标,协助定位卡顿问题 [2].
  2. FPS监控:经过在App中增加FPS监控代码,能够实时监测帧率,判别是否存在卡顿 [2].
  3. 卡顿检测东西:如Facebook的Chisel、Tencent的GT等,能够监测主线程卡顿情况,并供给详细的卡顿仓库信息 [2].

以上是一些常用的iOS卡顿优化办法和监控东西


Learn more:

  1. iOS卡顿优化-腾讯云开发者社区-腾讯云
  2. iOS界面卡顿原理及优化 –
  3. 深化探究 iOS 卡顿优化 –

FPS 用 CADisplayLinker 来计数

运用CADisplayLink来核算FPS的过程如下:

  1. 创立CADisplayLink目标,并将其增加到当时的run loop中的NSRunLoopCommonModes中。这样能够确保CADisplayLink在屏幕刷新时被调用。
  2. 在CADisplayLink的回调办法中,记载每次调用的次数,并核算时刻距离。
  3. 当时刻距离超越1秒时,核算FPS并进行相应的处理(例如打印、显现在界面上等)。
  4. 重置计数和时刻戳,以便下一次核算。

以下是一个示例代码:

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:

  1. iOS中基于CADisplayLink的FPS指示器详解 – 简书
  2. 运用CADisplayLink编写FPS检测东西 –
  3. CADisplayLink的运用,显现屏幕帧数-CSDN博客

怎样监听 runloop 的 source0 事情和进入休眠前,然后设定一个阈值,监听卡顿

要监听 RunLoop 的 source0 事情和进入休眠前的办法,能够运用 CFRunLoopObserver 来完成。CFRunLoopObserver 是一个调查者,能够监听 RunLoop 的情况改变,并在特定的时刻点履行相应的操作。

以下是详细的过程:

  1. 创立一个 CFRunLoopObserver 目标,并指定调查的时刻点和调查的事情类型。能够运用 CFRunLoopObserverCreate 函数来创立调查者目标。

  2. 界说一个回调函数,用于在调查的时刻点履行相应的操作。回调函数的参数包含调查者目标、调查的事情类型和上下文信息。

  3. 将调查者目标增加到 RunLoop 的指定方式下。能够运用 CFRunLoopAddObserver 函数将调查者目标增加到 RunLoop 中。

  4. 在回调函数中,能够依据调查的事情类型履行相应的操作。例如,在监听进入休眠前的事情时,能够记载当时时刻,并与上一次记载的时刻进行比较,判别是否发生了卡顿。

  5. 依据需要,能够设置一个阈值来判别卡顿的时刻。如果超越了阈值,能够进行相应的处理,例如打印日志、发送告诉或采纳其他办法。

以下是一个示例代码,演示怎么监听 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:

  1. [iOS面试]第7章 RunLoop相关面试问题 | codeTao
  2. iOS Runloop 总结 | Edgar’s Blog
  3. GitHub – fanren5119/iOS-runloop: 本届详细讲解了ios的runloop

怎么做耗电优化,怎么监控

iOS耗电优化办法能够经过以下几个过程来完成:

  1. 运用Energy impact进行耗电检测:

    • 在Xcode中,经过挑选Product->Profile或运用快捷键cmd+i,然后挑选Energy impact来检查运用的耗电情况[1]
    • 检查Average Energy Impact来评价运用的整体平均耗电量,依据颜色区别耗电等级,如low、high和very high[1]
    • 检查Average Component Utilization来了解各个耗电部分的占比,包含Overhead、Network、CPU、GPU和Location[1]
    • 经过Profiler进一步剖析耗电占比大的部分,如运用Time Profiler来查找最耗时的函数或办法[1]
  2. 运用Energy Log进行耗电检测:

    • 在设备上启用Energy Log功用,能够经过iPhone的设置->开发者->Logging->Start Recording来开始记载耗电数据[1]
    • 运行运用并进行各种操作,然后停止记载,将数据导入到Xcode的Instruments东西中进行剖析[1]
  3. 运用sysdiagnose进行耗电检测:

    • sysdiagnose是一种收集系统诊断信息的东西,能够用于剖析电池运用情况[2]
    • 经过sysdiagnose能够获取电压、电流、温度等电池相关数据,以及运用的功耗信息[2]
  4. 优化耗电量:

    • 优化CPU运用:经过剖析Time Profiler或sysdiagnose的数据,找出CPU占用高的函数或办法,并进行优化,如削减循环次数、运用异步操作等[1][2]
    • 优化网络运用:削减网络恳求次数,兼并恳求,运用缓存等办法来下降网络耗电[1]
    • 优化定位运用:依据需求挑选适宜的定位精度,防止过高的精度导致的额定能耗[1]
    • 优化GPU运用:削减不必要的图形烘托操作,防止过度制作等[1]

Learn more:

  1. iOS功用优化之耗电检测 | 杂货铺
  2. iOS系统APP耗电量检测剖析和优化 –
  3. iOS耗电量优化实践 – 简书

怎么做网络优化,怎么监控

iOS网络优化办法能够从削减恳求带宽和下降恳求推迟两个方面进行优化。同时,监控网络功用也是很重要的,能够协助咱们了解运用的网络情况并及时发现问题。

以下是一些iOS网络优化的办法和监控网络功用的东西:

iOS网络优化办法:

  1. 削减恳求带宽:

    • 运用高效的数据交互方式。
    • 在或许的情况下运用预先紧缩的数据。
    • 紧缩每一个恳求与呼应负载[1]
  2. 下降恳求推迟:

    • 最小化DNS查询的数量,能够运用DNS预下载进行更早的DNS解析。
    • 最大程度削减运用建议的衔接数,恳求结束时不要封闭HTTPS衔接,运用域分片等办法来削减SSL握手时刻。
    • 在单个TCP衔接上发送HTTP恳求,以管道的方式发送HTTP恳求,防止多个TCP衔接的开销[1]

iOS网络功用监控东西:

  1. Network Link Conditioner:是iOS开发者东西中的一个功用,能够模仿不同网络环境下的网络衔接情况,协助开发者测试运用在不同网络条件下的功用体现。

  2. Charles Proxy:是一款常用的网络抓包东西,能够用于监控和剖析iOS设备上的网络恳求和呼应,协助开发者了解运用的网络情况。

  3. Firebase Performance Monitoring:是Google供给的一款移动运用功用监控东西,能够监控运用的网络恳求、呼应时刻等功用指标,并供给实时的功用报告和剖析。

  4. Alamofire Network Logger:是一款基于Alamofire网络库的日志记载东西,能够记载和显现iOS运用的网络恳求和呼应的详细信息,便利开发者进行网络功用剖析。

以上是一些常用的iOS网络优化办法和监控东西,经过优化网络功用和监控网络情况,能够提高运用的用户体会和功用体现。


Learn more:

  1. iOS网络功用优化 – 简书
  2. iOS网络优化-CSDN博客
  3. iOS网络恳求优化 – 任超的博客 | Renchao’s Blog