iOS NSDateFormatter性能
一、探究
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 格式却并没有什么影响。
二、文章
iOS NSDateFormatter性能的更多相关文章
- iOS程序性能优化
iOS程序性能优化 一.初级 使用ARC进行内存管理 在iOS5发布的ARC,它解决了最常见的内存泄露问题.但是值得注意的是,ARC并不能避免所有的内存泄露.使用ARC之后,工程中可能还会有内存泄露, ...
- iOS应用性能调优的25个建议和技巧【转】
转载自:http://blog.jobbole.com/37984/ 首页 最新文章 资讯 程序员 设计 IT技术 创业 在国外 营销 趣文 特别分享 更多 > - Navigation - ...
- iOS 程序性能优化
前言 转载自:http://www.samirchen.com/ios-performance-optimization/ 程序性能优化不应该是一件放在功能完成之后的事,对性能的概念应该从我们一开始写 ...
- 25条提高iOS App性能的技巧和诀窍
25条提高iOS App性能的技巧和诀窍 当我们开发iOS应用时,好的性能对我们的App来说是很重要的.你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢也会伤害到你的审核. 然而,由于IO ...
- 【iOS Instrument性能优化集】
iOS Instrument性能优化集 1.UIImage缓存取舍 在项目代码中看到大量使用如下代码: UIImage使用 在Main Thread中发现不同动画场景中Image IO 开销和耗时所占 ...
- iOS app性能优化的那些事
iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功能上面,比较少去考虑性能的问题,可能这其中涉及到objective-c,c++跟lua,优化起来相对 ...
- iOS应用性能调优的4个建议和技巧
任何一个能在用户手机屏幕中占有一席之地的iOS app都包含3个关键因素:想法好.设计出色.性能卓越.本文将分享一些iOS应用性能调优的4个建议和技巧. Tip #1:把图片资源压缩到最小. i ...
- [深入浅出Cocoa]iOS程序性能优化
本文转载至 http://blog.csdn.net/kesalin/article/details/8762032 [深入浅出Cocoa]iOS程序性能优化 罗朝辉 (http://blog.csd ...
- 25条提高iOS App性能的建议和技巧
这篇文章来自iOS Tutorial Team 成员 Marcelo Fabri, 他是 Movile 的一个iOS开发者. Check out his personal website or fol ...
随机推荐
- Hexo+github如何搭建博客
前言 博客有第三方平台,也可以自建,比较早的有博客园.CSDN,近几年新兴的也比较多诸如:WordPress.segmentFault.简书.掘金.知乎专栏.Github Page 等等. 这次我要说 ...
- PHPRAP 1.0.2 发布,修复安装失败 Bug 和优化细节
PHPRAP,是一个PHP轻量级开源API接口文档管理系统,致力于减少前后端沟通成本,提高团队协作开发效率,打造PHP版的RAP. 更新记录 [修复]修复在MySQL5.5版本下安装数据初始化sql文 ...
- 使用纯粹的JS构建 Web Component
原文链接:https://ayushgp.github.io/htm...译者:阿里云 - 也树 Web Component 出现有一阵子了. Google 费了很大力气去推动它更广泛的应用,但是除 ...
- spring boot actuator服务监控与管理
1.引入actuator所需要的jar包 <dependency> <groupId>org.springframework.boot</groupId> < ...
- Serializable详解(1):代码验证Java序列化与反序列化
说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...
- 盘点Linux运维常用工具(二)-web篇之nginx
1.nginx的概述 .nginx是一个开源的.支持高性能.高并发的WWW服务和代理服务软件 .是由俄罗斯人Igor Sysoev开发的,具有高并发.占用系统资源少等特性 .官网:http://ngi ...
- ajax的post提交 序列化json参数
再一次项目中,很常见的就是我的前端需要异步进行和后端交互 ,然而需要携带一些参数过去,并且参数类型是json 怎么办呢? 这个时候我们就需要 进行参数序列化 很简单就两句话 如下图 我们看 JSON, ...
- Redis系列四 - 分布式锁的实现方式
前言 分布式锁一般有3中实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁. 以下将详细介绍如何正确地实现Redis分布式锁. 可靠性 首先,为了确保分布式锁的可 ...
- Rust入坑指南:齐头并进(上)
我们知道,如今CPU的计算能力已经非常强大,其速度比内存要高出许多个数量级.为了充分利用CPU资源,多数编程语言都提供了并发编程的能力,Rust也不例外. 聊到并发,就离不开多进程和多线程这两个概念. ...
- 手把手构建LSTM的向前传播(Building a LSTM step by step)
本篇是在之前两篇基础上接着写的: 吴恩达deepLearning.ai循环神经网络RNN学习笔记(理论篇) 从头构建循环神经网络RNN的向前传播(rnn in pure python) 也可以不看 ...