load方法为什么耗时

2022-04-29  本文已影响0人  智能老树皮

+ (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成长之路

上一篇 下一篇

猜你喜欢

热点阅读