NSDateFormatter优化以及测试方法CFAbsoluteTimeGetCurrent()

来源:互联网 发布:淘宝查号131458网址 编辑:程序博客网 时间:2024/06/01 21:27
过度的创建NSDateFormatter用于NSDateNSString之间转换,会导致App卡顿,打开Profile工具查一下性能,你会发现这种操作占CPU比例是非常高的。所以我们需要优化一下。
在iOS 7之前NSDateFormatter线程是不安全的,在iOS 7之后NSDateFormatter线程是安全的,但是现在iOS 7被舍弃了,所以我们只考虑线程是安全的就可以了。

三种方式对比以及测试方法:
第一种:普通创建
// 普通创建方式
- (void)Normal {
   
    CFAbsoluteTime startTime =CFAbsoluteTimeGetCurrent();
   
    for (int i = 0; i <100000; i ++) {
       
        NSDateFormatter *dataFormatter = [[NSDateFormatteralloc]init];
       
    }
   
    CFAbsoluteTime stopTime =CFAbsoluteTimeGetCurrent();
   
    NSLog(@"%s :%f",__func__,stopTime - startTime);
}

第二种:单例方法
FormatterManger.h文件
#import <Foundation/Foundation.h>

@interface FormatterManger :NSDateFormatter

+(instancetype)formatterManger;


@end

FormatterManger.m文件
#import "FormatterManger.h"

staticFormatterManger *instanceType =nil;

@implementation FormatterManger


+(instancetype)formatterManger{
    staticdispatch_once_t onceToken;
   
    dispatch_once(&onceToken, ^{
       
        instanceType = [[FormatterMangeralloc]init];
       
       
    });
   
    returninstanceType;
   
   
}
@end


// 单例的方式的调试
- (void)GCDOnce {
   
    CFAbsoluteTime startTime =CFAbsoluteTimeGetCurrent();
   
    for (int i = 0; i <100000; i ++) {
       
        FormatterManger *formatter = [FormatterMangerformatterManger];
       
    }
   
    CFAbsoluteTime stopTime =CFAbsoluteTimeGetCurrent();
   
    NSLog(@"%s :%f",__func__,stopTime - startTime);
   
   
}

第三种:分类方法
分类.h
#import <Foundation/Foundation.h>

@interface NSDateFormatter (CategoryFormatter)

+ (instancetype)shareDateFormatter;

@end

分类.m
#import "NSDateFormatter+CategoryFormatter.h"
staticNSDateFormatter *instanceType =nil;

@implementation NSDateFormatter (CategoryFormatter)

+ (instancetype)shareDateFormatter{
   
    staticdispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instanceType = [[NSDateFormatteralloc]init];
    });
   
    returninstanceType;
}

@end


// 分类方法调试
- (void)category {
   
    CFAbsoluteTime startTime =CFAbsoluteTimeGetCurrent();
   
    for (int i = 0; i <100000; i ++) {
       
        NSDateFormatter *dateformatter = [NSDateFormattershareDateFormatter];
       
    }
   
    CFAbsoluteTime stopTime =CFAbsoluteTimeGetCurrent();
   
    NSLog(@"%s :%f",__func__,stopTime - startTime);
   
   
}

三种方法输出结果:


第一种用的时间最长,第二种用的时间最短,第三种用的时间和第二种差不多,不过我一般使用第二种
原创粉丝点击