一、探究

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

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

double begin = 0.0;
double end = 0.0;
NSDateFormatter * formatter = nil; {
begin = CACurrentMediaTime(); for (int i = 0; i < 1000; i++) {
formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd"];
[formatter stringFromDate:[NSDate date]];
} end = CACurrentMediaTime();
NSLog(@"NSDateFormatter: %8.2f ms", (end - begin) * 1000);
} {
begin = CACurrentMediaTime(); formatter = [[NSDateFormatter alloc] init]; for (int i = 0; i < 1000; i++) {
[formatter setDateFormat:@"yyyy-MM-dd"];
[formatter stringFromDate:[NSDate date]];
} end = CACurrentMediaTime();
NSLog(@"NSDateFormatter once: %8.2f ms", (end - begin) * 1000);
} -----------Xcode 10.1 iPhone 6s(10.0)---------- 2019-03-01 10:08:42.184 Demo[95118:1359994] NSDateFormatter: 48.73 ms
2019-03-01 10:08:42.188 Demo[95118:1359994] NSDateFormatter once: 3.57 ms 2019-03-01 10:11:18.871 Demo[95164:1361958] NSDateFormatter: 61.18 ms
2019-03-01 10:11:18.875 Demo[95164:1361958] NSDateFormatter once: 3.85 ms 2019-03-01 10:12:03.123 Demo[95178:1362677] NSDateFormatter: 79.80 ms
2019-03-01 10:12:03.129 Demo[95178:1362677] NSDateFormatter once: 6.08 ms

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

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

NSDateFormatter * formatter = nil;
double begin = 0.0;
double end = 0.0;
double a = 0, b = 0, c = 0; for (int i = 0; i < 1000; 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();
[formatter stringFromDate:[NSDate date]];
end = CACurrentMediaTime();
c += (end - begin);
} NSLog(@"NSDateFormatter:alloc %8.2f ms", a * 1000);
NSLog(@"NSDateFormatter:setFormat %8.2f ms", b * 1000);
NSLog(@"NSDateFormatter:stringFromDate %8.2f ms", c * 1000); -------------Xcode 10.1 iPhone 6s(10.0)------------- 2019-03-01 10:11:18.939 Demo[95164:1361958] NSDateFormatter:alloc 7.01 ms
2019-03-01 10:11:18.939 Demo[95164:1361958] NSDateFormatter:setFormat 0.28 ms
2019-03-01 10:11:18.939 Demo[95164:1361958] NSDateFormatter:stringFromDate 55.98 ms 2019-03-01 10:12:03.198 Demo[95178:1362677] NSDateFormatter:alloc 7.69 ms
2019-03-01 10:12:03.199 Demo[95178:1362677] NSDateFormatter:setFormat 0.25 ms
2019-03-01 10:12:03.199 Demo[95178:1362677] NSDateFormatter:stringFromDate 60.97 ms 2019-03-01 10:18:43.946 Demo[95261:1366071] NSDateFormatter:alloc 6.01 ms
2019-03-01 10:18:43.946 Demo[95261:1366071] NSDateFormatter:setFormat 0.20 ms
2019-03-01 10:18:43.946 Demo[95261:1366071] NSDateFormatter:stringFromDate 49.06 ms

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

double begin = 0.0;
double end = 0.0;
NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; for (int i = 0; i < 1000; i++) { [formatter setDateFormat:@"yyyy-MM-dd"]; begin = CACurrentMediaTime();
[formatter stringFromDate:[NSDate date]];
end = CACurrentMediaTime(); NSLog(@"%8.2f ms", (end - begin) * 1000);
} -------------Xcode 10.0 iPhone 6s(10.0)------------- 2019-03-01 10:27:06.218 Demo[95456:1372764] 1.43 ms
2019-03-01 10:27:06.218 Demo[95456:1372764] 0.03 ms
2019-03-01 10:27:06.219 Demo[95456:1372764] 0.02 ms
2019-03-01 10:27:06.219 Demo[95456:1372764] 0.01 ms
2019-03-01 10:27:06.219 Demo[95456:1372764] 0.01 ms
2019-03-01 10:27:06.219 Demo[95456:1372764] 0.01 ms
2019-03-01 10:27:06.219 Demo[95456:1372764] 0.01 ms
2019-03-01 10:27:06.219 Demo[95456:1372764] 0.02 ms
2019-03-01 10:27:06.220 Demo[95456:1372764] 0.01 ms
2019-03-01 10:27:06.220 Demo[95456:1372764] 0.01 ms
2019-03-01 10:27:06.220 Demo[95456:1372764] 0.01 ms
2019-03-01 10:27:06.220 Demo[95456:1372764] 0.01 ms
2019-03-01 10:27:06.220 Demo[95456:1372764] 0.01 ms
2019-03-01 10:27:06.221 Demo[95456:1372764] 0.01 ms
2019-03-01 10:27:06.221 Demo[95456:1372764] 0.01 ms

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

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

double begin = 0.0;
double end = 0.0; // 不同的对象不同的 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 < 1000; i++) {
[formatter1 setDateFormat:@"yyyy-MM-dd"];
[formatter1 stringFromDate:[NSDate date]]; [formatter2 setDateFormat:@"MM-dd-yyyy"];
[formatter2 stringFromDate:[NSDate date]]; [formatter3 setDateFormat:@"MM-dd"];
[formatter3 stringFromDate:[NSDate date]]; [formatter4 setDateFormat:@"MM-yyyy"];
[formatter4 stringFromDate:[NSDate date]];
}
end = CACurrentMediaTime(); printf("NSDateFormatter: different format %8.2f ms\n", (end - begin) * 1000);
} // 同一个对象不同的 format 格式
{
begin = CACurrentMediaTime();
NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; for (int i = 0; i < 1000; i++) {
[formatter setDateFormat:@"yyyy-MM-dd"];
[formatter stringFromDate:[NSDate date]]; [formatter setDateFormat:@"MM-dd-yyyy"];
[formatter stringFromDate:[NSDate date]]; [formatter setDateFormat:@"MM-dd"];
[formatter stringFromDate:[NSDate date]];
[formatter setDateFormat:@"MM-yyyy"];
[formatter stringFromDate:[NSDate date]];
}
end = CACurrentMediaTime(); printf("NSDateFormatter: %8.2f ms\n", (end - begin) * 1000);
} ---------------Xcode 10.1 iPhone 6s(10.0)--------------- NSDateFormatter: different format 23.26 ms
NSDateFormatter: 16.25 ms

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

NSDateFormatter:different format     23.81 ms
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. 快速上手百度大脑EasyDL专业版·物体检测模型(附代码)

    作者:才能我浪费991.    简介:1.1.    什么是EasyDL专业版EasyDL专业版是EasyDL在2019年10月下旬全新推出的针对AI初学者或者AI专业工程师的企业用户及开发者推出的A ...

  2. java反序列化-ysoserial-调试分析总结篇(6)

    前言: 这篇记录CommonsCollections6的调试,外层也是新的类,换成了hashset,即从hashset触发其readObject(),yso给的调用链如下图所示 利用链分析: 首先在h ...

  3. 为XHR对象所有方法和属性提供钩子 全局拦截AJAX

    摘要 ✨长文 阅读约需十分钟 ✨跟着走一遍需要一小时以上 ✨约100行代码 前段时间打算写一个给手机端用的假冒控制台 可以用来看console的输出 这一块功能目前已经完成了 但是后来知道有一个腾讯团 ...

  4. 如何给女朋友讲SSM和springBoot的区别?(简单描述一下)

  5. Eclipse与MyEclipse的联系和区别

    Eclipse与MyEclipse的联系和区别  Eclipse 是一个IDE(Integrated Developing Environment),而这个IDE是允许安装第三方开发的插件来使自身的功 ...

  6. 第四章、深入理解vue组件

    4-1.使用组件的细节 a.使用is解决html出现bug 如下 table下面应该为tr,所以页面渲染的时候没有找到tr是有问题的,所以是有小bug,所以table中必须是tr b.改上面bug,t ...

  7. 解决IOS下window.open页面打不开问题

    问题如标题所写,在ajax回调里面拿到即将要跳转的链接url,使用window.open(linkUrl),没有起作用,而且代码也没有报错,查找原因是:大部分现代的浏览器(Chome/Firefox/ ...

  8. Idea安装教程以及环境变量配置

    IDEA安装以及JDK环境变量 环境变量配置 下载jdk

  9. JAVA生成EXCEL模板

    JAVA生成excel模板,支持1.必填字段前加 红色 * 2.定义可选值下拉列表 valList3.定义名称并通过名称设置可选值 refName(名称在sheet2,sheet2自动隐藏)4.支持设 ...

  10. flask 分页数据显示

    填充一些数据在表中 @blue.route('/pages/') def pages(): # 默认进入这个视图函数 第一页并只显示5条数据 page = request.args.get('page ...