NSDateFormatter 性能测试

NSDateFormatter 性能不完全测试

前几日KZ同学提醒,说看到有处我加的代码略微耗时(ps:kpi查的真严),看了看就是这货

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd-MM-yyyy"];
    NSString *current = [dateFormatter stringFromDate:[NSDate date]];

其实就是NSDateFormatter初始化非常耗时,代码里也早已有写好的单例(ios7之后是线程安全,不需要每个线程都创建单例)供调用。
关于NSDateFormatter创建耗时的资料也是一搜一大把。

闲来无事便测试了一下,究竟有多耗时。

{
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            formatter  = [[NSDateFormatter alloc] init];
            [formatter setDateFormat:@"yyyy-MM-dd"];
            string = [formatter stringFromDate:[NSDate date]];
        }
        end = CACurrentMediaTime();
        printf("NSDateFormatter:               %8.2f ms\n", (end - begin) * 1000);
    }
    {
        begin = CACurrentMediaTime();
        formatter  = [[NSDateFormatter alloc] init];
        for (int i = 0; i < count; i++) {
            [formatter setDateFormat:@"yyyy-MM-dd"];
            string = [formatter stringFromDate:[NSDate date]];
        }
        end = CACurrentMediaTime();
        printf("NSDateFormatter once:         %8.2f ms\n", (end - begin) * 1000);
    }

----测试1000次花费时间对比(8p/iOS12)-------
NSDateFormatter:                  86.05 ms
NSDateFormatter once:             4.01 ms

NSDateFormatter:                  84.80 ms
NSDateFormatter once:             4.36 ms

NSDateFormatter:                  80.20 ms
NSDateFormatter once:             3.89 ms

所以创建单例很有必要
上面可以看出两者之间消耗时间差距极大,而且还听过有人说应该 针对format格式创建对应的单例对象 ,那是NSDateFormatter初始化消耗太高吗??

for (int i = 0; i < count; i++) {
            begin = CACurrentMediaTime();
            formatter  = [[NSDateFormatter alloc] init];
            end = CACurrentMediaTime();
            a += (end-begin);
            
            begin = CACurrentMediaTime();
            [formatter setDateFormat:@"yyyy-MM-dd"];
            end = CACurrentMediaTime();
            b += (end-begin);
            
            begin = CACurrentMediaTime();
            string = [formatter stringFromDate:[NSDate date]];
            end = CACurrentMediaTime();
            c += (end-begin);
        }
        
        printf("NSDateFormatter:alloc               %8.2f ms\n", a * 1000);
        printf("NSDateFormatter:setFormat           %8.2f ms\n", b * 1000);
        printf("NSDateFormatter:stringFromDate      %8.2f ms\n", c * 1000);
----各个方法分开测试1000次花费时间对比(8p/iOS12)-------
NSDateFormatter:alloc                   9.44 ms
NSDateFormatter:setFormat               0.53 ms
NSDateFormatter:stringFromDate         65.40 ms

NSDateFormatter:alloc                  10.55 ms
NSDateFormatter:setFormat               0.58 ms
NSDateFormatter:stringFromDate         73.52 ms

NSDateFormatter:alloc                  10.11 ms
NSDateFormatter:setFormat               0.56 ms
NSDateFormatter:stringFromDate         70.50 ms

从上面可以看出,实际最耗时的方法为初次调用stringFromDate/dateFromString。

/*
生成不同format格式的对象对比
*/
{
        begin = CACurrentMediaTime();
        NSDateFormatter * formatter1  = [[NSDateFormatter alloc] init];
        NSDateFormatter * formatter2  = [[NSDateFormatter alloc] init];
        NSDateFormatter * formatter3  = [[NSDateFormatter alloc] init];
        NSDateFormatter * formatter4  = [[NSDateFormatter alloc] init];
        for (int i = 0; i < count/4; i++) {
            [formatter1 setDateFormat:@"yyyy-MM-dd"];
            string = [formatter1 stringFromDate:[NSDate date]];
            [formatter2 setDateFormat:@"MM-dd-yyyy"];
            string = [formatter2 stringFromDate:[NSDate date]];
            [formatter3 setDateFormat:@"MM-dd"];
            string = [formatter3 stringFromDate:[NSDate date]];
            [formatter4 setDateFormat:@"MM-yyyy"];
            string = [formatter4 stringFromDate:[NSDate date]];
        }
        end = CACurrentMediaTime();
        printf("NSDateFormatter:different format  %8.2f ms\n", (end - begin) * 1000);
    }
    {
        begin = CACurrentMediaTime();
        formatter  = [[NSDateFormatter alloc] init];
        for (int i = 0; i < count/4; i++) {
            [formatter setDateFormat:@"yyyy-MM-dd"];
            string = [formatter stringFromDate:[NSDate date]];
            [formatter setDateFormat:@"MM-dd-yyyy"];
            string = [formatter stringFromDate:[NSDate date]];
            [formatter setDateFormat:@"MM-dd"];
            string = [formatter stringFromDate:[NSDate date]];
            [formatter setDateFormat:@"MM-yyyy"];
            string = [formatter stringFromDate:[NSDate date]];
        }
        end = CACurrentMediaTime();
        printf("NSDateFormatter:                   %8.2f ms\n", (end - begin) * 1000);
    }
------不同format格式对象与同一对象设置不同格式对比------
NSDateFormatter:different format     27.89 ms
NSDateFormatter:                     16.16 ms
NSDateFormatter:different format     25.33 ms
NSDateFormatter:                     14.11 ms
NSDateFormatter:different format     28.51 ms
NSDateFormatter:                     15.62 ms

个人觉得创建一个单例即可,没有必要按格式创建多个,dateFormatter初次使用时消耗较大,设置format格式却并没有什么影响。

dateFromString方法我也测试过,结论基本一致便不一一唠叨了

谢谢阅读~~_

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,142评论 1 32
  • 面试题参考1 : 面试题[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios阅读 1,758评论 0 4
  • 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。• 深拷贝同浅拷贝的区别:浅拷...
    JonesCxy阅读 1,052评论 1 7
  • iOS-性能优化深入探究 上图是几种时间复杂度的关系,性能优化一定程度上是为了降低程序执行效率减低时间复杂度。如下...
    极客学伟阅读 1,122评论 0 2
  • 当我们开发iOS应用时,好的性能对我们的App来说是很重要的。你的用户也希望如此,但是如果你的app表现的反应迟钝...
    iOS开发攻城狮阅读 1,549评论 0 14