iOS 性能优化方案-启动优化

news/2024/7/20 20:19:11 标签: ios, 性能优化

1、冷启动(从零开始的启动)

冷启动三个阶段

1.1 Main函数执行前

  • 加载可执行文件(mach-o文件)
  • 加载动态链接库,进行rebase指针调整和bind符号绑定
  • Objc运行时的初始化处理,包括Objc相关类的注册、category注册、selector唯一性检查
  • 初始化,包括执行了+load()方法、attribute((constructor))修饰的函数调用、创建C++静态全局变量

优化方案

  • 减少动态库加载。每个库本身都有依赖关系,苹果公司建议使用更少的动态库,并且建议在使用动态库的数量较多时,尽量将多个动态库进行合并。数量上,苹果公司建议最多使用 6 个非系统动态库。

使用到的动态库有AMap高德地图、Charts图表、UMSocial友盟

删除未使用到的iflyMSC科大讯飞语音

  • 减少加载启动后不会去使用的类或者方法

1.整理AppDelegate.m中逻辑,删除不使用的类和方法,减少启动编译时间

2.取消打印废日志NSSLog

  • +load() 方法里的内容可以放到首屏渲染完成后再执行,或使用 +initialize() 方法替换掉。 因为,在一个+load() 方法里,进行运行时方法替换操作会带来 4 毫秒的消耗。不要小看这 4 毫秒,积少成多,执行 +load() 方法对启动速度的影响会越来越大
  • 控制 C++ 全局变量的数量

删除不使用的宏定义等全局变量

1.2 Main函数执行后

主要是指main()函数执行开始,到AppdelegatedidFinishLaunchingWithOptions方法里首屏渲染相关方法的执行

  • 首屏初始化所需要配置文件的读写操作
  • 首屏列表大数据的读取
  • 首屏渲染的大量计算

优化方案

从功能上梳理出哪些是首屏渲染必要的初始化功能,哪些是 App 启动必要的初始化功能,而哪些是只需要在对应功能开始使用时才需要初始化的。梳理完之后,将这些初始化功能分别放到合适的阶段进行

APP启动必要的初始化功能:

友盟平台设置、高德地图设置、注册系统推送、自定义启动动画LaunchAnimation检测版本更新、向服务器请求功能权限

对应功能开始使用时才需要初始化功能:

内部引导页Guidance、登录状态CheckLogin、实时会议弹窗定时任务、实时位置上传定时任务、Socket消息长连接、向服务器注册推送、本地通知

1.3 首屏渲染完成

从渲染完成时开始,到 didFinishLaunchingWithOptions 方法作用域结束时结束

优化方案

  • 功能级优化  
    main() 函数开始执行后到首屏渲染完成前只处理首屏相关的业务,其他非首屏业务的初始化、监听注册、配置文件读取等都放到首屏渲染完成后去做
  • 方法级优化  
    检查首屏渲染完成前主线程上有哪些耗时方法,将没必要的耗时方法滞后或者异步执行。通常情况下,耗时较长的方法主要发生在计算大量数据的情况下,具体的表现就是加载、编辑、存储图片和文件等资源

登录动画执行时,异步执行向苹果服务器请求版本内容结果,并自动登录

2、热启动

  • App在内存中,在后台存活着,再次点击图标进入App

3、APP启动的监控手段

  • 定时抓取主线程上的方法调用堆栈,计算一段时间里各个方法的耗时
  • 对 objc_msgSend 方法进行 hook 来掌握所有方法的执行耗时

http://www.niftyadmin.cn/n/376816.html

相关文章

想要学习编程,有什么推荐的书籍?

想要学习编程,有什么推荐的书籍? 当涉及到学习编程时,有很多优秀的书籍可以帮助你入门和深入学习编程技能。 以下是一些广泛推荐的编程书籍: 1. "Python编程:从入门到实践"(Eric Matthes&#…

chatgpt赋能python:Python中[:3]的用法介绍

Python中[:3]的用法介绍 Python是一种高级编程语言,经常被用于数据科学、机器学习、人工智能和Web应用程序开发。在Python中,有许多有用的编程技巧和语法,其中之一就是[:3]。 什么是[:3]? 在Python中,[:3]是一种称为…

研发工程师玩转Kubernetes——创建一个测试容器

测试容器并不是什么都没有的容器,只是它没有我们期望的常驻进程。我们常用它来做一些测试。 举个例子,在《研发工程师玩转Kubernetes——自动扩缩容》中我们使用本地wrk进行了压力测试。如果我们希望进入容器手工调用wrk,该怎么做呢&#xff…

36岁大龄程序员全职接单三个月的感触

36岁大龄程序员,原以为逃过35岁危机,没想到在年前被优化,拿了N2,12w薪资后,我开始了全职接单的道路。现在每个月平均收入有个20K,一路走来挺有感触的,把自己的经验分享给大家。 赚钱&#xff0…

Web基础 ( 十 ) DOM

4.6.DOM 4.6.1.node结点 我们可以通过 Node 对象进行对 DOM 中节点的操作和管理。Node 对象是 DOM 中所有节点的基类,可以继承给 Element、Comment、Text 等具体节点类。 常用的 Node 对象属性和方法包括: 4.6.1.1.属性: nodeType&#…

GIT | 日常命令查阅表

最近公司代码管控比较乱,有天就利用分支进行了代码梳理,当时就遇到一些困惑,抽空就把git 再学了一下。 以前我是用git命令的,但是敲命令对我来说还是有点麻烦(主要是git 功力不够),看到有同事用…

“以API接口快速获得aliexpress速卖通商品详情-返回值说明

为了方便商家获取速卖通上的商品信息,速卖通提供了API接口来获取商品数据。本文将介绍如何通过API接口获取速卖通商品数据。 一、申请API接口权限 在使用API接口前,首先需要在速卖通官网注册账号并通过实名认证。然后,在个人资料页面找到开…

day42|动态规划4-背包问题分割等和子集

0-1背包和完全背包搞清楚即可。 0-1背包问题-一维 背包有最大重量的限制,物品有重量有价值,那么在最大背包的限制下,能够得到的最大价值是多少? 暴力解法 每个物品都有放和不放两种状态,那么遍历所有的组合就可以…