作为程序猿,“性能优化”是我们都熟悉的单词,这也是我们需要继续努力并继续进入的事情;在实际开发过程中,不要盲目优化?的优化。这有时可能会导致负面影响。我们需要根据实际情况和业务需求对我们进行合理优化。在下一个主题中,Benji将使用iOS应用程序的开始优化作为讨论的扩展点。
iOS应用程序的启动知道它分为两个阶段:pre-mail和main(),在这两个阶段中,系统将进入??系列加载操作。该过程如下:
前阶段
1.加载yingya的专用?????1
2.负载染色体动态连接器
3. Dyld递归加载所有相关的动态链接库Dylib
主舞台
1. Main()中的Dyld
2.调整uiapplicationmain()
3.调整ApplicationWillFinishLaunching
4. dodfinishlaunchingingingithouons
1.前阶段
在优化前阶段时,我们需要详细了解其加载过程。
1.1负载迪利布
在此阶段的Dyld将分析Dylib(Xcode7。最后对Dylib的每个段进行调整MMAP()。但是,该L的Dylib部分是系统库,我们不需要进行额外的优化。
优化结论:
1.尽量不要制作嵌入式迪利布,避免增加“负载迪利布斯”
2.合并现有的迪利布和静态档案以减少迪利布的数量
3.懒惰加载迪利布,但请注意可能引起一些问题的dlopen(),实际上懒惰的加载会更多
1.2重新固定/绑定
在迪利布的加载过程中,系统引用了ASLR(地址空间布局随机化)技术和代码签名,以进行安全考虑。随机地址,将有一个偏见(幻灯片),地址指向以前的指针。偏差是指向正确的地址。重复程序在之前,bind在后面,rebase确实可以读取镜像-To -mirror内存,更正镜子内部的内部指针,并且性能消耗主要是io。结束是查询符号表,将指针设置在镜子外部,并且性能消耗主要是在CPU中计算出来的。
优化结论:
在此过程中,我们需要注意将指针数量最小化,例如:
1.减少OBJC类(类),选择器和类别的数量
2.减少C ++虚拟函数的数量(创建带有费用的虚拟功能表)
3.使W Swift结构(在内部进行优化,符号数量少)
1.3 OBJC设置
始一些OBJC初始化?已在反弹/结合阶段进行。此?染色器将注册已声明的所有OBJC类,将类别的分类插入到板球上,然后检查每个选择器的口才。
在此步骤中没有任何优化。重新/结合阶段得到了优化,并且将减少此步骤的时间消耗。
1.4初始化器
在此阶段,Dyld开始了程序的初始化功能,调整每个OBJC类和分类+负载?方法以及构造函数函数(?属性(((构造)))在C/C ++中修改了函数,并创建了基本的函数。C ++静态全局变量的类型。在初始化阶段后,Dyld开始调整Main()函数。
优化结论:
1.在+载荷???????????????????????????????????????????????????????????????中
2.减少构造函数函数的数量,在构造函数函数中进行更少的操作。
3.减少构造函数函数的数量,在构造函数函数中进行更少的操作。
2.主()阶段
在此阶段,主要优化侧重于SDK的初始化,业务注册和整体
在didFinishLaunchingingIthoptions方法中,因为我们的?????????????????????????????????显示了状态逻辑,版本更新逻辑等将在此中。如果逻辑的这一部分未得到优化,请遵循业务的持续扩展,肿的业务逻辑将直接导致开始时间。
在Manchu的业务需求的前提下,尽可能将主线程中的finishlaunlaunchingingingiptions降至最低。
1.根据实际的业务条件,请整理每个??/三库库,找到可以延迟的库,并延迟加载处理。
2.整理业务逻辑,延迟可能延迟痴迷的逻辑,并延迟治疗。
3.避免进行一些复杂/额外的计算逻辑,这种逻辑应为异步异步延迟处理
4.避免做太多容易阻止控制器的ViewDidload和ViewWillAppear中的主线程的事情。
场景补充:
此外,在我们的实际开发过程中,许多控制器将具有一些良好的背景,丰富的结构或推荐数据。只是传统的api-> data-> ui????,很难有明显的改进空间,因为户主的木偶状态不是可控的项目。如果您不做其他治疗,那么对于许多情况,即使我们放置了一些座位职业,展示风格也非常不友好。毕竟,控制器是对家庭第一个视觉影响的视觉影响的正确性。
为了在这种情况下进行优化,我们可以采用本地 +网络 +更新???????????加载速度:::是:: ie :: ie :: ie ::IS::就是::ie ::就是:::IE:IE:??:IE:ie:??:是::::::
1.在应用程序更新过程中,?高级?本地嵌入式处理逻辑,嵌入式数据结构(localDatabase)和嵌入式????1(localstorage)
2.启动安装后,将本地数据和在线数据更新记录输入到木偶中,并且检测需要更新本地嵌入式数据结构
3.当检测到需要更新的数据时,指定的结构将悄悄更新,并将同时更新本地数据结构
这样的优点是:
1.本数据直接从局部加载,减少了等待时间?数据的时间
2.仅检测数据的数据值的变化。
3.它可以确保?将对家庭处于友好的显示状态
当然,这不是种?的应对,也适合所有场景。它仅提供?????,或者您需要根据Xiangyu的实际场景选择适当的优化案例。
统计时间?
此外,在开发过程中,我们希望在应用程序启动期间直观地查看应用程序的时间消耗,并且您还可以将Dyld_print_statistics设置为1,例如编辑方案设置。
在优化时,启启:
当优化启动时,启:
当然,这些日志只能在开发和调试阶段检查。然后,在实际项目中,我们需要监视在线项目的开始数据,以便及时定位并优化影响应用程序启动的链接。此时我们应该如何更好地处理?
当然,我们可以报告服务器掩埋点报告的统计分析,但是这样,我们会发现我们的统计成本将增加,结果结果将变得不那么灵活。?风格,即,朋友联盟的U-APM应该能够监视SDK性能。在我们只需要输入简单的POD集成之后,我们就可以根据自己的实际需求输入??或?。有关详细信息,您可以参考U -APM,为了分析数据以输入数据,朋友联盟的背景帮助我们基于此数据绘制了相应的发行映射- UP类型等,如图所示:
此外,我们还可以使用SDK输入崩溃分析,ANR分析,监视警报,冷冻分析,内存分析和许多其他功能。借助U-APM的监视平台,我们在线应用程序的优化和分析效率得到了提高。
当然,引入该木偶只是一个相对简单的优化项目。它是用于参考和想法。优化之路很远。它还要求我们继续探索,发现和提及。最终,我们仍然需要提醒句子:在实际项目的开发过程中,不要优化?的优化,并优化???根据情况。
参考:
探索马赫(Mach)的一块马赫(Mach-o)
iOS底层 - 从染色体加载过程开始
iosaapp start -dyld加载应用程序流程
作者:Wu Yubao资料来源:阿里巴巴云