NSDateFormatter使用时比较消耗性能,如果需要多处使用,最好通过单例的方式来创建,防止多次创建消耗性能
接下来演示一下,普通方式创建和单例使用效率对比,为了让效果体现的更明显,通过for循环多次创建,打印起始时间和完成时间的间隔
示例代码:
#import "ViewController.h"
#import "NSDateFormatter+Category.h"
#import "JSDateFormatter.h"
#define REPEAT_COUNTS 100000
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 调用
[self Normal];
[self GCDOnce];
[self category];
}
// 普通创建方式
- (void)Normal {
CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < REPEAT_COUNTS; i ++) {
NSDateFormatter *dataFormatter = [[NSDateFormatter alloc]init];
}
CFAbsoluteTime stopTime = CFAbsoluteTimeGetCurrent();
NSLog(@"%s :%f",__func__,stopTime - startTime);
}
// 单例的方式
- (void)GCDOnce {
CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < REPEAT_COUNTS; i ++) {
JSDateFormatter *formatter = [JSDateFormatter sharedDateFormatter];
}
CFAbsoluteTime stopTime = CFAbsoluteTimeGetCurrent();
NSLog(@"%s :%f",__func__,stopTime - startTime);
}
// 分类的方式
- (void)category {
CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < REPEAT_COUNTS; i ++) {
NSDateFormatter *dateformatter = [NSDateFormatter sharedDateFormatter];
}
CFAbsoluteTime stopTime = CFAbsoluteTimeGetCurrent();
NSLog(@"%s :%f",__func__,stopTime - startTime);
}
@end
打印结果:
[ViewController Normal] : 0.144953
[ViewController GCDOnce] : 0.007281
[ViewController category] : 0.010553
GCDOnce方法实际是创建了一个单例类,cateGory方法是给NSDateFormatter添加了一个非正式协议(分类/类目),内部都是使用GCD的一次性执行提供了一个创建单例的类方法;
分类和单例类的性能差不多,单例类性能更好一些
分类:
#import "NSDateFormatter+Category.h"
static NSDateFormatter *_instanceType = nil;
@implementation NSDateFormatter (Category)
+ (instancetype)sharedDateFormatter{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instanceType = [[NSDateFormatter alloc]init];
});
return _instanceType;
}
@end
单例类:
#import "JSDateFormatter.h"
static JSDateFormatter *_instanceType = nil;
@implementation JSDateFormatter
+ (instancetype)sharedDateFormatter{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instanceType = [[JSDateFormatter alloc]init];
});
return _instanceType;
}
@end