NSDateFormatter使用时的性能优化 - (Obj-C)

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

你可能感兴趣的:(NSDateFormatter使用时的性能优化 - (Obj-C))