一、探究

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

关于 NSDateFormatter 创建耗时的资料很多,下面开始测试一下,究竟有多耗时。

  1. double begin = 0.0;
  2. double end = 0.0;
  3. NSDateFormatter * formatter = nil;
  4. {
  5. begin = CACurrentMediaTime();
  6. for (int i = 0; i < 1000; i++) {
  7. formatter = [[NSDateFormatter alloc] init];
  8. [formatter setDateFormat:@"yyyy-MM-dd"];
  9. [formatter stringFromDate:[NSDate date]];
  10. }
  11. end = CACurrentMediaTime();
  12. NSLog(@"NSDateFormatter: %8.2f ms", (end - begin) * 1000);
  13. }
  14. {
  15. begin = CACurrentMediaTime();
  16. formatter = [[NSDateFormatter alloc] init];
  17. for (int i = 0; i < 1000; i++) {
  18. [formatter setDateFormat:@"yyyy-MM-dd"];
  19. [formatter stringFromDate:[NSDate date]];
  20. }
  21. end = CACurrentMediaTime();
  22. NSLog(@"NSDateFormatter once: %8.2f ms", (end - begin) * 1000);
  23. }
  24. -----------Xcode 10.1 iPhone 6s(10.0)----------
  25. 2019-03-01 10:08:42.184 Demo[95118:1359994] NSDateFormatter: 48.73 ms
  26. 2019-03-01 10:08:42.188 Demo[95118:1359994] NSDateFormatter once: 3.57 ms
  27. 2019-03-01 10:11:18.871 Demo[95164:1361958] NSDateFormatter: 61.18 ms
  28. 2019-03-01 10:11:18.875 Demo[95164:1361958] NSDateFormatter once: 3.85 ms
  29. 2019-03-01 10:12:03.123 Demo[95178:1362677] NSDateFormatter: 79.80 ms
  30. 2019-03-01 10:12:03.129 Demo[95178:1362677] NSDateFormatter once: 6.08 ms

上面可以看出两者之间消耗时间差距很大。创建单例很有必要。

那是 [[NSDateFormatter alloc] init] 初始化消耗太高吗?

  1. NSDateFormatter * formatter = nil;
  2. double begin = 0.0;
  3. double end = 0.0;
  4. double a = 0, b = 0, c = 0;
  5. for (int i = 0; i < 1000; i++) {
  6. begin = CACurrentMediaTime();
  7. formatter = [[NSDateFormatter alloc] init];
  8. end = CACurrentMediaTime();
  9. a += (end - begin);
  10. begin = CACurrentMediaTime();
  11. [formatter setDateFormat:@"yyyy-MM-dd"];
  12. end = CACurrentMediaTime();
  13. b += (end - begin);
  14. begin = CACurrentMediaTime();
  15. [formatter stringFromDate:[NSDate date]];
  16. end = CACurrentMediaTime();
  17. c += (end - begin);
  18. }
  19. NSLog(@"NSDateFormatter:alloc %8.2f ms", a * 1000);
  20. NSLog(@"NSDateFormatter:setFormat %8.2f ms", b * 1000);
  21. NSLog(@"NSDateFormatter:stringFromDate %8.2f ms", c * 1000);
  22. -------------Xcode 10.1 iPhone 6s(10.0)-------------
  23. 2019-03-01 10:11:18.939 Demo[95164:1361958] NSDateFormatter:alloc 7.01 ms
  24. 2019-03-01 10:11:18.939 Demo[95164:1361958] NSDateFormatter:setFormat 0.28 ms
  25. 2019-03-01 10:11:18.939 Demo[95164:1361958] NSDateFormatter:stringFromDate 55.98 ms
  26. 2019-03-01 10:12:03.198 Demo[95178:1362677] NSDateFormatter:alloc 7.69 ms
  27. 2019-03-01 10:12:03.199 Demo[95178:1362677] NSDateFormatter:setFormat 0.25 ms
  28. 2019-03-01 10:12:03.199 Demo[95178:1362677] NSDateFormatter:stringFromDate 60.97 ms
  29. 2019-03-01 10:18:43.946 Demo[95261:1366071] NSDateFormatter:alloc 6.01 ms
  30. 2019-03-01 10:18:43.946 Demo[95261:1366071] NSDateFormatter:setFormat 0.20 ms
  31. 2019-03-01 10:18:43.946 Demo[95261:1366071] NSDateFormatter:stringFromDate 49.06 ms

从上面可以看出,实际最耗时的方法是 stringFromDate:/dateFromString:。再往下细究。

  1. double begin = 0.0;
  2. double end = 0.0;
  3. NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
  4. for (int i = 0; i < 1000; i++) {
  5. [formatter setDateFormat:@"yyyy-MM-dd"];
  6. begin = CACurrentMediaTime();
  7. [formatter stringFromDate:[NSDate date]];
  8. end = CACurrentMediaTime();
  9. NSLog(@"%8.2f ms", (end - begin) * 1000);
  10. }
  11. -------------Xcode 10.0 iPhone 6s(10.0)-------------
  12. 2019-03-01 10:27:06.218 Demo[95456:1372764] 1.43 ms
  13. 2019-03-01 10:27:06.218 Demo[95456:1372764] 0.03 ms
  14. 2019-03-01 10:27:06.219 Demo[95456:1372764] 0.02 ms
  15. 2019-03-01 10:27:06.219 Demo[95456:1372764] 0.01 ms
  16. 2019-03-01 10:27:06.219 Demo[95456:1372764] 0.01 ms
  17. 2019-03-01 10:27:06.219 Demo[95456:1372764] 0.01 ms
  18. 2019-03-01 10:27:06.219 Demo[95456:1372764] 0.01 ms
  19. 2019-03-01 10:27:06.219 Demo[95456:1372764] 0.02 ms
  20. 2019-03-01 10:27:06.220 Demo[95456:1372764] 0.01 ms
  21. 2019-03-01 10:27:06.220 Demo[95456:1372764] 0.01 ms
  22. 2019-03-01 10:27:06.220 Demo[95456:1372764] 0.01 ms
  23. 2019-03-01 10:27:06.220 Demo[95456:1372764] 0.01 ms
  24. 2019-03-01 10:27:06.220 Demo[95456:1372764] 0.01 ms
  25. 2019-03-01 10:27:06.221 Demo[95456:1372764] 0.01 ms
  26. 2019-03-01 10:27:06.221 Demo[95456:1372764] 0.01 ms

从上面可以看出,只有首次调用 stringFromDate:/dateFromString: 方法才会很耗时。再往下细究。

还有人说应该针对 format 格式创建对应的单例对象。

  1. double begin = 0.0;
  2. double end = 0.0;
  3. // 不同的对象不同的 format 格式
  4. {
  5. begin = CACurrentMediaTime();
  6. NSDateFormatter * formatter1 = [[NSDateFormatter alloc] init];
  7. NSDateFormatter * formatter2 = [[NSDateFormatter alloc] init];
  8. NSDateFormatter * formatter3 = [[NSDateFormatter alloc] init];
  9. NSDateFormatter * formatter4 = [[NSDateFormatter alloc] init];
  10. for (int i = 0; i < 1000; i++) {
  11. [formatter1 setDateFormat:@"yyyy-MM-dd"];
  12. [formatter1 stringFromDate:[NSDate date]];
  13. [formatter2 setDateFormat:@"MM-dd-yyyy"];
  14. [formatter2 stringFromDate:[NSDate date]];
  15. [formatter3 setDateFormat:@"MM-dd"];
  16. [formatter3 stringFromDate:[NSDate date]];
  17. [formatter4 setDateFormat:@"MM-yyyy"];
  18. [formatter4 stringFromDate:[NSDate date]];
  19. }
  20. end = CACurrentMediaTime();
  21. printf("NSDateFormatter: different format %8.2f ms\n", (end - begin) * 1000);
  22. }
  23. // 同一个对象不同的 format 格式
  24. {
  25. begin = CACurrentMediaTime();
  26. NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
  27. for (int i = 0; i < 1000; i++) {
  28. [formatter setDateFormat:@"yyyy-MM-dd"];
  29. [formatter stringFromDate:[NSDate date]];
  30. [formatter setDateFormat:@"MM-dd-yyyy"];
  31. [formatter stringFromDate:[NSDate date]];
  32. [formatter setDateFormat:@"MM-dd"];
  33. [formatter stringFromDate:[NSDate date]];
  34. [formatter setDateFormat:@"MM-yyyy"];
  35. [formatter stringFromDate:[NSDate date]];
  36. }
  37. end = CACurrentMediaTime();
  38. printf("NSDateFormatter: %8.2f ms\n", (end - begin) * 1000);
  39. }
  40. ---------------Xcode 10.1 iPhone 6s(10.0)---------------
  41. NSDateFormatter: different format 23.26 ms
  42. NSDateFormatter: 16.25 ms

如果不计 NSDateFormatter 对象的初始化时间,那么打印输出:

  1. NSDateFormatter:different format 23.81 ms
  2. NSDateFormatter: 23.02 ms

两者相差不大,创建一个单例即可。dateFormatter 初次使用时消耗较大,设置 format 格式却并没有什么影响。

二、文章

NSDateFormatter 性能测试

iOS NSDateFormatter性能的更多相关文章

  1. iOS程序性能优化

    iOS程序性能优化 一.初级 使用ARC进行内存管理 在iOS5发布的ARC,它解决了最常见的内存泄露问题.但是值得注意的是,ARC并不能避免所有的内存泄露.使用ARC之后,工程中可能还会有内存泄露, ...

  2. iOS应用性能调优的25个建议和技巧【转】

    转载自:http://blog.jobbole.com/37984/ 首页 最新文章 资讯 程序员 设计 IT技术 创业 在国外 营销 趣文 特别分享 更多 > - Navigation -  ...

  3. iOS 程序性能优化

    前言 转载自:http://www.samirchen.com/ios-performance-optimization/ 程序性能优化不应该是一件放在功能完成之后的事,对性能的概念应该从我们一开始写 ...

  4. 25条提高iOS App性能的技巧和诀窍

    25条提高iOS App性能的技巧和诀窍 当我们开发iOS应用时,好的性能对我们的App来说是很重要的.你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢也会伤害到你的审核. 然而,由于IO ...

  5. 【iOS Instrument性能优化集】

    iOS Instrument性能优化集 1.UIImage缓存取舍 在项目代码中看到大量使用如下代码: UIImage使用 在Main Thread中发现不同动画场景中Image IO 开销和耗时所占 ...

  6. iOS app性能优化的那些事

     iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功能上面,比较少去考虑性能的问题,可能这其中涉及到objective-c,c++跟lua,优化起来相对 ...

  7. iOS应用性能调优的4个建议和技巧

    任何一个能在用户手机屏幕中占有一席之地的iOS app都包含3个关键因素:想法好.设计出色.性能卓越.本文将分享一些iOS应用性能调优的4个建议和技巧. Tip #1:把图片资源压缩到最小.    i ...

  8. [深入浅出Cocoa]iOS程序性能优化

    本文转载至 http://blog.csdn.net/kesalin/article/details/8762032 [深入浅出Cocoa]iOS程序性能优化 罗朝辉 (http://blog.csd ...

  9. 25条提高iOS App性能的建议和技巧

    这篇文章来自iOS Tutorial Team 成员 Marcelo Fabri, 他是 Movile 的一个iOS开发者. Check out his personal website or fol ...

随机推荐

  1. CSS中"position:relative"属性与文档流的关系

    前言 近期遇到一个问题--"position:relative"到底会不会导致元素脱离文档流?主流观点是不会,但都给不出一个有说服力的论据.最后我自己佐证了一番,总算有了个结果:& ...

  2. 学习经典算法—JavaScript篇(一)排序算法

    前端攻城狮--学习常用的排序算法 一.冒泡排序 优点: 所有排序中最简单的,易于理解: 缺点: 时间复杂度O(n^2),平均来说是最差的一种排序方式: 因为在默认情况下,对于已经排好序的部分,此排序任 ...

  3. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(6.1)- FlexSPI NOR连接方式大全(RT600)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT600的FlexSPI NOR启动的连接方式. 痞子衡前段时间一鼓作气写完了三篇关于i.MXRT1xxx系列Flex ...

  4. 细说集群技术(Cluster)

    今天本人给大家讲解一些我对集群技术一个理解,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 集群(Cluster)技术:通过此可以用较低的成本获取较高的性能 ...

  5. JS如何进行对象的深克隆(深拷贝)?

    JS中,一般的赋值传递的都是对象/数组的引用,并没有真正的深拷贝一个对象,如何进行对象的深拷贝呢? var a = {name : 'miay'}; var b = a; b.name = 'Jone ...

  6. JavaScript入门进阶(二)

    JavaScript进阶入门(二) 转换为数字 使用parseInt() parseInt函数会先查看位置0处的字符,如果该位置不是有效数字,则将返回NaN,如果0处的字符是数字,则将查看位置1处的字 ...

  7. Js数组代替写循环的几个方法

    简介 循环是个不可避免的结构,而且不好复用,同时循环还很难加入其他操作中.更麻烦的是,使用循环就意味着在每一个新的迭代中有更多变化需要响应. 上了循环的控制结构会使代码看起来变得复杂,故而这里提几个替 ...

  8. Python基础类型(1)

    整数 整数在Python中的关键字用int来表示; 整型在计算机中运于计算和比较 在32位机器上int的范围是:  -2**31-2**31-1,即-2147483648-2147483647 在64 ...

  9. 《52讲轻松搞定网络爬虫》读书笔记 —— HTTP基本原理

    URI 和 URL URI :Uniform Resource Identifier,即统一资源标志符, URL :Universal Resource Locator,即统一资源定位符. 举栗子,加 ...

  10. Python多线程的事件监控

    设想这样一个场景: 你创建了10个子线程,每个子线程分别爬一个网站,一开始所有子线程都是阻塞等待.一旦某个事件发生:例如有人在网页上点了一个按钮,或者某人在命令行输入了一个命令,10个爬虫同时开始工作 ...