YYCach 源码小记

2018-04-18  本文已影响28人  不知蜕变的挣扎
@implementation YYMemoryCache {
   // 声明互斥锁
   pthread_mutex_t _lock;
   .....
}
- (instancetype)init {
   self = super.init;
   //初始化互斥锁
   pthread_mutex_init(&_lock, NULL);
   ......
   return self;
}

- (void)setReleaseOnMainThread:(BOOL)releaseOnMainThread {
   //加琐
   pthread_mutex_lock(&_lock);

   _lru->_releaseOnMainThread = releaseOnMainThread;

   //解琐
   pthread_mutex_unlock(&_lock);
}

- (void)dealloc{
   //释放该锁的数据结构
   pthread_mutex_destroy(& _lock);  
}

注意点:
1、互斥量需要时间来加锁和解锁。锁住较少互斥量的程序通常运行得更快。所以,互斥量应该尽量少,够用即可,每个互斥量保护的区域应则尽量大。
2、互斥量的本质是串行执行。如果很多线程需要领繁地加锁同一个互斥量,
则线程的大部分时间就会在等待,这对性能是有害的。如果互斥量保护的数据(或代码)包含彼此无关的片段,则可以特大的互斥量分解为几个小的互斥量来提高性能。这样,任意时刻需要小互斥量的线程减少,线程等待时间就会减少。所以,互斥量应该足够多(到有意义的地步),每个互斥量保护的区域则应尽量的少。

为什么使用互斥锁:
互斥锁缺点是当等待时会消耗大量 CPU 资源,所以它不适用于较长时间的任务,但对于内存缓存的存取来说,它非常合适。

优点相比于函数:
inline函数避免了普通函数的,在汇编时必须调用call的缺点:取消了函数的参数压栈,减少了调用的开销,提高效率.所以执行速度确比一般函数的执行速度要快,集成了宏的优点,使用时直接用代码替换(像宏一样);

优点相比于宏:
1、避免了宏的缺点:需要预编译.因为inline内联函数也是函数,不需要预编译.
2、编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
3、可以使用所在类的保护成员及私有成员。

inline函数注意事项:
1、你可以使用inline函数完全取代表达式形式的宏定义。
2、内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。
3、在内联函数内不允许用循环语句和 开关语句。如果内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码,递归函数(自己调用自己的函数)是不能被用来做内联函数的。内联 函数只适合于只有1~5行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对来说微不足道,所以也没有必要用内联函数实现,函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

上一篇下一篇

猜你喜欢

热点阅读