NSDateFormatter使用時(shí)比較消耗性能,如果需要多處使用,最好通過(guò)單例的方式來(lái)創(chuàng)建,防止多次創(chuàng)建消耗性能
接下來(lái)演示一下,普通方式創(chuàng)建和單例使用效率對(duì)比,為了讓效果體現(xiàn)的更明顯,通過(guò)for循環(huán)多次創(chuàng)建,打印起始時(shí)間和完成時(shí)間的間隔
示例代碼:
#import "ViewController.h"
#import "NSDateFormatter+Category.h"
#import "JSDateFormatter.h"
#define REPEAT_COUNTS 100000
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 調(diào)用
[self Normal];
[self GCDOnce];
[self category];
}
// 普通創(chuàng)建方式
- (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
打印結(jié)果:
[ViewController Normal] : 0.144953
[ViewController GCDOnce] : 0.007281
[ViewController category] : 0.010553
GCDOnce方法實(shí)際是創(chuàng)建了一個(gè)單例類,cateGory方法是給NSDateFormatter添加了一個(gè)非正式協(xié)議(分類/類目),內(nèi)部都是使用GCD的一次性執(zhí)行提供了一個(gè)創(chuàng)建單例的類方法;
分類和單例類的性能差不多,單例類性能更好一些
分類:
#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