ios 各种锁的使用性能比较
iOS开发中常用的锁有如下几种
来比较一下遇到加锁的情况:
1. @synchronized 关键字加锁
2. NSLock 对象锁
3. NSCondition
4. NSConditionLock 条件锁
5. NSRecursiveLock 递归锁
6. pthread_mutex 互斥锁(C语言)
7. dispatch_semaphore 信号量实现加锁(GCD)
8. OSSpinLock (暂不建议使用,原因参见这里)
//分别使用8种方式加锁 解锁1千万次
- (void)runLock{
CFTimeInterval timeBefore;
CFTimeInterval timeCurrent;
NSUInteger i;
NSUInteger count = 1000*10000;//执行一千万次
//@synchronized
id obj = [[NSObjectalloc]init];;
timeBefore = CFAbsoluteTimeGetCurrent();
for(i=0; i<count; i++){
@synchronized(obj){
}
}
timeCurrent = CFAbsoluteTimeGetCurrent();
printf("@synchronized used : %f\n", timeCurrent-timeBefore);
//NSLock
NSLock *lock = [[NSLockalloc]init];
timeBefore = CFAbsoluteTimeGetCurrent();
for(i=0; i<count; i++){
[lock lock];
[lock unlock];
}
timeCurrent = CFAbsoluteTimeGetCurrent();
printf("NSLock used : %f\n", timeCurrent-timeBefore);
//NSCondition
NSCondition *condition = [[NSConditionalloc]init];
timeBefore = CFAbsoluteTimeGetCurrent();
for(i=0; i<count; i++){
[condition lock];
[condition unlock];
}
timeCurrent = CFAbsoluteTimeGetCurrent();
printf("NSCondition used : %f\n", timeCurrent-timeBefore);
//NSConditionLock
NSConditionLock *conditionLock = [[NSConditionLockalloc]init];
timeBefore = CFAbsoluteTimeGetCurrent();
for(i=0; i<count; i++){
[conditionLock lock];
[conditionLock unlock];
}
timeCurrent = CFAbsoluteTimeGetCurrent();
printf("NSConditionLock used : %f\n", timeCurrent-timeBefore);
//NSRecursiveLock
NSRecursiveLock *recursiveLock = [[NSRecursiveLockalloc]init];
timeBefore = CFAbsoluteTimeGetCurrent();
for(i=0; i<count; i++){
[recursiveLock lock];
[recursiveLock unlock];
}
timeCurrent = CFAbsoluteTimeGetCurrent();
printf("NSRecursiveLock used : %f\n", timeCurrent-timeBefore);
//pthread_mutex
pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;
timeBefore = CFAbsoluteTimeGetCurrent();
for(i=0; i<count; i++){
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
}
timeCurrent = CFAbsoluteTimeGetCurrent();
printf("pthread_mutex used : %f\n", timeCurrent-timeBefore);
//dispatch_semaphore
dispatch_semaphore_t semaphore =dispatch_semaphore_create(1);
timeBefore = CFAbsoluteTimeGetCurrent();
for(i=0; i<count; i++){
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);
dispatch_semaphore_signal(semaphore);
}
timeCurrent = CFAbsoluteTimeGetCurrent();
printf("dispatch_semaphore used : %f\n", timeCurrent-timeBefore);
//OSSpinLockLock
OSSpinLock spinlock = OS_SPINLOCK_INIT;
timeBefore = CFAbsoluteTimeGetCurrent();
for(i=0; i<count; i++){
OSSpinLockLock(&spinlock);
OSSpinLockUnlock(&spinlock);
}
timeCurrent = CFAbsoluteTimeGetCurrent();
printf("OSSpinLock used : %f\n", timeCurrent-timeBefore);
}
输出结果如下:
由图可以发现:
OSSpinLock的性能最好(不建议使用),GCD的dispatch_semaphore紧随其后;
NSConditionLock和@synchronized性能较差;
注意:
1. 需要注意的是这里仅仅是对各种锁直接Lock和Unlock的性能测试,其中部分锁的使用条件上还是有细微的差异的,比如NSLock之类的还有tryLock等方法用于加锁,不同对象锁的功能偏向不一样等等,有兴趣的可以逐个搜索再更深入的研究不同锁之间的区别。
2. 另外,一般来说客户端很少会有这么大量的加锁解锁操作,所以日常来说这些锁的性能都是可以满足使用需求的。
转载于:https://www.cnblogs.com/soulDn/p/10558208.html
ios 各种锁的使用性能比较相关推荐
- iOS线程锁中你还不知道的内容
iOS线程锁 一:十种线程锁 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生. 这里顺便 ...
- bugku 管理员系统 后台代码_不会吧,这也行?iOS后台锁屏监听摇一摇
[toc] 背景介绍 一般情况下,出于省电.权限.合理性等因素考虑,给人的感觉是很多奇怪的需求安卓可以实现,但是iOS就无法实现!今天要介绍的需求也有这种感觉,就是"当 APP 处于后台或锁 ...
- iOS 音乐 锁屏显示 控制
1 APPDelegate.m 文件中 设置接收外部控制 - (BOOL)application:(UIApplication *)application didFinishLaunchingWith ...
- ios图锁HQ应用项目源码
"图锁 HQ" 是一个专门为图片定制的超级保险箱! - 保证图片100%安全! - 使用无损压缩算法压缩图片, 节约空间资源. - 使用超高安全级别的加密算法加密图片. - 每次进 ...
- ios激活锁_如何检查iOS设备的激活锁状态
ios激活锁 Starting with iOS 7, Apple introduced a feature named Activation Lock for iOS devices. When y ...
- [ios开发]锁屏后的相机的方向检查,与图片的自动旋转
关键词:imageOrientation, 自动旋转, 获取方向, 锁屏, 图片方向, 自定义拍照 问题描述: 一个同事开发iphone拍照后为图片添加滤镜的功能. 发现添加滤镜时总出现方向自动变化的 ...
- IOS版aplayer使用教程_使用Checkra1n 越狱后成果绕过 iOS 激活锁教程
本教程适用于macos 此方法绕过iCloud不能正常登陆账号和登陆AppStore 如果遗忘 iOS 设备的 Apple ID 密码,在重新激活时可以按照以下步骤绕过 Apple ID,实现免激活直 ...
- iOS 自动锁屏 设置
// 自动锁屏 [UIApplication sharedApplication].idleTimerDisabled = NO; // 不自动锁屏 [UIApplication sharedAppl ...
- iOS - Mac 锁屏快捷键设置
Mac 锁屏快捷键设置 control + shift + Eject 锁屏快捷键 如果用户要离开电脑一段时间,可以选择直接把笔记本直接合上.但是这样原先在跑的进程就会挂起或者结束,如果正在下载,那么 ...
最新文章
- Bootstrap系列 -- 8. 代码显示
- 张萍萍山东大学计算机科学系毕业生,并行驰骋,放“码”来战!看先导杯大奖赛上山大风采...
- 闭包/Block当成函数参数实现回调
- Perl重命名当前目录下的文件
- RAID磁盘阵列配置和调优小结
- C++中对象初始化赋值是否需要调用operator=函数
- LLDP(链路层发现协议)
- 了解一个新技术和技术点的时候需要了解的事情
- HTML5:web socket 和 web worker
- Linux内核快速处理路径尽量多用slab而慎用kmalloc
- RBAC权限认证流程图
- 单商户商城系统功能拆解19—订单管理
- 浅谈JSP编程的网店管理系统构造
- java后端生成echarts图片
- 重新训练大脑!这些APP可治愈心理疾病
- POJ-3376 Finding Palindromes
- 使用VMware虚拟机通过Panabit抓取爱快虚拟机PPPoE报文
- Android学习日记(yzy):Notification的简单运用
- unity3D灯光烘焙(二)
- .net core 3.1JWT用户权限认证(二)获取token
热门文章
- Android学习笔记之(一)开发环境搭建
- 阿里云镜像下载ubuntu
- ubuntu安装ipfs
- c语言课程设计学生成绩簿,c语言课程设计—学生成绩管理系统
- c#ovalshape_How to: Draw Shapes with the OvalShape and RectangleShape Controls (Visual Studio)
- MySQL常用存储引擎
- 20175333曹雅坤实验四《Android程序设计》实验报告
- 实验二:编写输出Hello World!
- Js高级(1) 事件11.30
- hibernate 高并发下遇到的大坑