iOS方法缓存机制

734 阅读2分钟

前言

上一篇文章简单的探究了cache_t的结构,我们还有许多相关的东西没有处理,比如是如何缓存的?我们看到的mask3,那么方法太多的时候怎么办?带着这些疑问我们开始今天的探究。

一、疑问探究

首先我们利用上节课的脱离源码的工程,多声明几个方法并实现,如图:

截屏2021-08-17 下午9.07.45.png

截屏2021-08-17 下午9.08.27.png 然后依次增加调用的方法数,如下:

  • 1次

截屏2021-08-17 下午9.12.41.png _maybeMask3_occupied1

  • 2次

截屏2021-08-17 下午9.14.44.png _maybeMask3_occupied2

  • 3次

截屏2021-08-17 下午9.15.46.png _maybeMask7_occupied1;(这里有变化了哦!)

  • 4次

截屏2021-08-17 下午9.16.57.png _maybeMask7_occupied2

我们看到,在第三次的时候_maybeMask变成了7,意思是指定的缓存桶子数变化了。同时_occupied变成了1,已用的桶子变少了,理论上应该变多,这是为什么呢?接下来我们进行探索。

二、源码分析

继续上一篇的文章,我们来到cache_t中,我们在cache_t的方法中找到了一个insert方法,如图: 20210817224439.jpg 这里是对缓存空间的开辟和扩容,下图是插入: 20210817225530.jpg 到这里我们的方法缓存插入就结束了,其中包含了开辟、扩容插入。

三、一些疑问和参数

方法的插入看起来没有那么困难,但是我也有许多疑问

1、缓存空使用率

在不满足宏判断的情况下缓存空间的使用达到3/4或者7/8就需要扩容,为什么?

3/47/8为最优内存,此时哈希冲突和空间使用率可以达到最优的平衡,超出后容易冲突出现bad_cache

2、开辟

我们的目的是缓存,在开辟新的缓存空间时为什么没有把旧的缓存插入到新的空间中?

扩容后的空间和扩容前的空间哈希计算的盐不一样了,无法直接插入,与其扩容后就插入,不如等到再次使用时进行插入。

3、参数和方法

源码分析时候没有对所有的参数和方法进行详细得介绍,这里补充。

1、capacity()

20210817232407.jpg

2、incrementOccupied()

截屏2021-08-17 下午11.30.56.png

3、宏参数

6AAA3F7B-A479-473C-90EF-5F018F190256.png