绿洲iOS研发工程师,绿洲ID:收纳箱KeepFit。
目录
0. 序言
启动是App给用户的第一印象,对用户体验至关重要。试想一个App需要启动5s以上,你还想用它么?
最初的工程肯定是没有这些问题的,但随着业务需求不断丰富,代码越来越多。如果放任不管的话,启动时间会不断上涨,最后让人无法接受。
本文从优化原理出发,介绍了我是如何通过修改库的类型和Clang插桩找到启动所需符号,然后修改编译参数完成二进制文件的重新排布提升应用的启动速度的。
下面我们先上结论:
-
优化前:
Total pre-main time: 1.2 seconds (100.0%) dylib loading time: 567.72 milliseconds (45.5%) rebase/binding time: 105.14 milliseconds (8.4%) ObjC setup time: 40.01 milliseconds (3.2%) initializer time: 532.47 milliseconds (42.7%) slowest intializers : libSystem.B.dylib : 4.70 milliseconds (0.3%) libglInterpose.dylib : 295.89 milliseconds (23.7%) AFNetworking : 48.75 milliseconds (3.9%) Oasis : 285.94 milliseconds (22.9%) 复制代码
-
优化后
Total pre-main time: 822.34 milliseconds (100.0%) dylib loading time: 196.71 milliseconds (23.9%) rebase/binding time: 104.95 milliseconds (12.7%) ObjC setup time: 31.14 milliseconds (3.7%) initializer time: 489.53 milliseconds (59.5%) slowest intializers : libSystem.B.dylib : 4.65 milliseconds (0.5%) libglInterpose.dylib : 230.19 milliseconds (27.9%) AFNetworking : 41.60 milliseconds (5.0%) Oasis : 335.84 milliseconds (40.8%) 复制代码
通过staticlib优化、二进制重排两项技术,我成功将绿洲的pre-main时间从1.2s降到了大约0.82s,提升了大约31.6%!
两台手机都是iPhone 11 Pro,右边是优化后的效果。(原谅我右边点开还慢了一点
以上内容来自于网络,如有侵权联系即删除

相关文章
- 常用限流算法与Guava RateLimiter源码解析
- iOS中的网络调试
- iOS底层-cache_t流程分析
- Swift 5.3 新特性
- Homebrew 让你从 Mac 切换到 Linux 更轻松
- Semo 系列文章之三:插件 semo-plugin-chalk
- iOS探索 全方位解读Block
- HTTP 服务器消息推送之SSE
上一篇: 带你了解多线程
下一篇: 我的(FE) iTerm2 配置