load方法为什么耗时

+ (void)load  {

    printf("123");

}

这段代码编译完之后,这个函数会储存在Mach-O中的TEXT两个段中,__text存函数二进制,cstring存储字符串 123

要执行printf函数,首先需要访问__text触发一次page In 读入物理内存,为了要打印字符串,还需要访问cstring,还会触发一次page In

有很多同学不了解page In,这里介绍一下,首先先要知道mmap

mmap 的全称是 memory map,是一种内存映射技术,可以把文件映射到虚拟内存的地址空间里,这样就可以像直接操作内存那样来读写文件。

当读取虚拟内存,其对应的文件内容在物理内存中不存在的时候,会触发一个事件: Page In,把对应的文件内容读入物理内存中。

Page In又做了哪些事情呢?

MMU(Memory Management Unit,内存管理单元)找到空闲的物理内存页面

触发磁盘IO,把数据读入到物理内存

如果是TEXT段的页,要进行解密(iOS13之后不需要解密)

对解密后的页,进行签名验证

为了执行这个函数,系统付出了两个page In的代价,所以一旦load方法过多,会影响启动速度

参考:iOS成长之路

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 来源作者:字节跳动技术团队 前言启动是 App 给用户的第一印象,启动越慢用户流失的概率就越高,良好的启动速度是用...
    iOS弗森科阅读 5,641评论 0 28
  • 讲真十一之前呢非常想到假期不想学习,十一的时候又很想看剧不想学习,我发现我最近太不努力了...... 但是能不能不...
    木小易Ying阅读 3,666评论 0 3
  • 这篇是对 iOS 应用启动时,main 函数执行前发生的事的一点总结,限于水平,如有错误请指正~ FAT 二进制 ...
    kikido阅读 4,149评论 0 2
  • 可否使用 == 来判断两个NSString类型的字符串是否相同?为什么? 不能。==判断的是两个变量的值的内存地址...
    渐z阅读 3,746评论 0 0
  • 背景 一个项目做的时间长了,启动流程往往容易杂乱,库也用的越来越多,APP 的启动时间也会慢慢变长。本次将针对 i...
    Yealink阅读 4,140评论 0 0