IOS开发多线程--一次性执行和互斥锁效率比较

多线程中一次性执行和互斥锁都是我们用来保证数据安全的常用方法,下面我们使用代码来测试使用这两种方法来保证数据安全的时候哪个效率更高。

在这里我们使用这两种方法来创建单例模式,并且大次数循环创建单例对象,看创建相同次数的单例对象的时候哪种方法用的时间要少一点。

首先我们创建一个工具类。


然后在DBTool.h中声明两个创建单例的方法

@interface DBTool :NSObject

+(instancetype)sharedDBTool;

+(instancetype)sharedDBToolOnce;

@end

在DBTool.h中实现两个创建单例的方法

@implementation DBTool

//使用互斥锁创建单例

+(instancetype)sharedDBTool{

static id _instanceType;

@synchronized(self) {

if(_instanceType ==nil) {

_instanceType = [self new];

}

}

return_instanceType;

}

//使用一次执行创建单例

+(instancetype)sharedDBToolOnce{

static id _instanceType;

staticdispatch_once_tonceToken;

dispatch_once(&onceToken, ^{

if(_instanceType ==nil) {

_instanceType = [self new];

}

});

return _instanceType;

}

@end

接着在ViewController.m中创建单例

#define laryNum10000000

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//在viewDidLoad方法中大次数循环创建单例,计算两种方法创建单例对象所需要的时间

//下面这个方法用于计算起始时间,优点是计算时间精确度高

//获取代码开始执行时时间

CFAbsoluteTime begin =CFAbsoluteTimeGetCurrent();

for(int i =0; i<10,i++){

DBTool *tool = [DBTool sharedDBTool];

}

//获取代码结束执行时时间

CFAbsoluteTime end =CFAbsoluteTimeGetCurrent();

//计算开始和结束的时间差,该时间差就是循环创建单例需要的时间

NSLog(@"%f",end- begin);

//使用一次执行创建单例对象

CFAbsoluteTime begin2 =CFAbsoluteTimeGetCurrent();

for(int i =0; i<10,i++){

DBTool *tool = [DBTool sharedDBToolOnce];

}

CFAbsoluteTime end2 =CFAbsoluteTimeGetCurrent();

NSLog(@"%f",end2- begin2);

}

下面是循环创建十万次单例时两种方法的时间差


这是循环创建一千万次单例时两种方法的时间差


根据上面数据,我们可以做出判断,使用一次执行创建单例对象比使用互斥锁创建单例对象效率高。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容