一、发动流程

1.1、pre-main阶段

1、加载应用可履行文件

本身App的一切.o文件的调集

2、加载dyld动态链接器

dyld是一个专门用来加载动态链接库的库

3、dyld递归加载应用一切依赖的动态链接库dylib

动态链接库包括:iOS 中用到的一切体系 framework,加载OC runtime办法的libobjc,体系级别的libSystem,例如li指针数组和数组指针的区别bdispatch(GCD)和libsystem_blocks (Block)。效率高发票查验

1.2、main()阶段
  1. dyld调用main()
  2. 调用UIAppl公司让员工下班发手机电量截图icatiios16onMain()
  3. 调用applicationWillFinishLaunching
  4. 调用didFinishLaunchingWithOptions
1.3、首屏渲染

首屏构建完成可浏览/可操作页面

二、查看发动时长

ios15之前,Xcode菜单Product-Sc效率意识方面存在的问题heme-edit Scheme…0-Run-Arguments-Environment Variables,添加 DYLD_PRINT_STATISTICS 环境变量,value为1,能够看到打印输出pre-main()之前的发动各项时长

Total pre-main time: 539.46 milliseconds (100.0%)//main()总的发动时刻
         dylib loading time: 232.89 milliseconds (43.1%)//加载动态库占用
        rebase/binding time:  32.56 milliseconds (6.0%)//指针重定位占用
            ObjC setup time:  22.18 milliseconds (4.1%)//ObjC类初始化占用
           initializer time: 251.68 milliseconds (46.6%)//各种初始化占用
           slowest intializers :
             libSystem.B.dylib :   5.12 milliseconds (0.9%)//intializers初始化最耗时1
    libMainThreadChecker.dylib :  29.74 milliseconds (5.5%)//intializers初始化最耗时2
                      Template : 382.83 milliseconds (70.9%)//intializers初始化最耗时3

三、优化

pre-main

  • dylib loading: 加载动态库。这里的动态库指的是自己制造的动态库存,苹果供给的动态库存是指针c语言在共享缓iOS存里的,能够经过削减动态库的数量来优化这一部分所耗指针式万用表使用方法费的时刻。苹果的主张是一个项目里自己制造的动态库数量不超越6个。
  • Objc setup: 注册Ojbc类,进行selector唯一性检测等。能够经过削减OjGobc效率计算公式类的数量,削减sel指针万用表怎么读数ector的数量来进行ios系统优化
  • rebase/binding: r工龄越长退休金越多吗ebase指ios下载针修复,binding符号绑定。这一步优化手段和第2步一样。
  • initializios16er: 各种初始化的操作,比方履行objc效率公式的+load函数,C++的构造函数等,不要在+load函数里做一些耗时操作,或许把一引起操作延时的放在+initGoializer里边去履行
  • slowest intializers:在共享效率高发票查验缓存里效率公式加载,都是苹果体系的动态库,经过了苹果的高效优化

main

  • 削减运用xib和storios16yboard

  • 删除N工资超过5000怎么扣税SLog打印,每次用NSLoios应用商店g方式打指针数组和数组指针的区别印会隐式的创建一个指针万用表读数图解Calendar,因而需求删减发动时各事务方打的log,或许仅仅针对内测版输出log

  • 收拾didFinishLaunchingWithOption二进制计算器s⽅效率计算公式法⾥⾯的事务逻辑,能够异步恳求的异步恳求,可

    以延时加载的延时加载。

四、二进制重排

ASLR

ASLR(address space layout randomization),地址空间布局随机化。是⼀种针对iOS缓冲区溢出的ios越狱安全维护技能,经过对堆、栈、共享库映射等线性区布局的随机化,经过增加攻击指针数学者预测⽬的地址的难度,防⽌攻击者直接定位攻击代码方位,达到阻⽌溢出攻击的⽬的的⼀种技能。使得可执⾏⽂件和动态库在虚拟内存中的地址在每次发动都不固定。

Page Fault

因为虚拟内存的呈现,进指针式万用表使用方法程不直接拜访物理内存,这样安全性更⾼。为了提⾼功率和⽅便指针数学办理,对虚拟内存和物理内存进⾏分⻚(Page)办理。当进程拜访⼀个虚拟内存⻚,⽽对应的物理内存却不存在效率的英文的时分,会触发⼀个缺⻚中止,这个就叫Page Fault。

二进制重排

概念 :找二进制转换器到程序在发动时分需求调⽤的符号,然后修改二进制怎么算编译参数完成⼆进制⽂件的从头排布。

LinkMap :是iOS编译过程的中心产物,记录了⼆进制⽂件的布局。能够在Xcode的Build Settings⾥开启Write Link Map File。

order⽂件 :编译器会按照order⽂件的内容,对⼆效率是什么意思进制⽂件进⾏排二进制怎么算列。能够在Xcode的效率计算公式BuildSettings⾥的Order File处设置。

⼆进制重排能够优化发动时刻的原理 :App在执⾏的过程中会存在⼤量的Page Fault,⼀个Page Fault的耗时很少,但是当⼤量的Page Fault存在时,就会影响到代码的执⾏工商银行速度。同理,在App发动的时分,就或许会呈现⼤量的Page Fault。⼆进制重排便是把在发动过程中需求使⽤到的符号,从头排列在⼀个或许⼏个Page⾥⾯,削减Page Fault的次数,从⽽达到削减发动时刻的⽬的。

五、优化手段总结

  1. 移除不必要的动态库和不必要的类,运用fui(Find Unused Imports)能够扫描没有运用到的类
  2. 二进制重排优化
  3. 兼并功用枸杞相似的类和扩展,因为Category的完成原理,和ObjC的动态绑定有很强的关系指针,实际上类的扩展是比较占用发动时刻的。尽量或许兼并一些扩展,并不是让你不运用扩展
  4. 压缩资源图片,图片小了,IO操作量小了指针数组,发动就快了
  5. 优化applicationWillF指针是什么inish效率计算公式Launching,需求在applicationWillFinishLaunching里处理的事务较多时,能够办理起这些任务将不需求立刻在applicationWil二进制八进制十进制十六进制转换lFinishLaunching履行的代码延后履行
  6. 效率符号运用xib,直接视用代码加载主页效率意识方面存在的问题视图
  7. NSUserDefaults实际上是在Library文件夹下会生产一个plist文件,如果文件太大的话一次能读取到内存中或许很耗时
  8. 删减发动时各事务方打的log