首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSDateComponents时间剖面

NSDateComponents时间剖面
EN

Stack Overflow用户
提问于 2014-03-05 18:37:47
回答 1查看 324关注 0票数 2

我的问题与下面的代码片段中给出的NSDateComponents操作的时间概要有关。

  • 我有一个方法可以迭代大量的NSDate对象
  • 该方法的一部分要求我放弃每个日期的小时、分钟和秒。
  • 要做到这一点,我有三个步骤:

代码语言:javascript
复制
1. I create an NSDateComponents object from my original date.
2. I set the H:M:S elements to 0
3. I get my new date object that has H:M:S set to 0 as needed

这一问题:

上面的步骤1和步骤3在我的整个方法执行时间中占据了很大的比例,分别为22.4%和56.8%。

我正在寻找一些建议,比如如何优化我的代码的这一部分,或者对H:M:S进行归零的替代方法,这样效果会更好。

代码语言:javascript
复制
NSDate* date = [[NSDate alloc] init];
// Next line takes 22.4% of the overall method execution time
NSDateComponents* components =  [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit 
                                | NSDayCalendarUnit | NSHourCalendarUnit  
                                | NSSecondCalendarUnit) fromDate:date]; 

[components setHour:0];
[components setMinute:0];
[components setSecond:0];

// Next line takes 56.8% of the overall method execution time
date = [calendar dateFromComponents:components];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-05 18:55:08

更新

钟表:

时间1:≈0.000139 -选项1-原件

时间2:≈0.000108 -选项2

时间3:≈0.000013 -选项3

时间4:≈0.000004 -选项4

备选案文1-原件

代码语言:javascript
复制
NSDate* originDate = [[NSDate alloc] init];
NSDate* date = [[NSDate alloc] init];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents* components =  [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit
                                                      | NSDayCalendarUnit | NSHourCalendarUnit
                                                      | NSSecondCalendarUnit) fromDate:date];

[components setHour:0];
[components setMinute:0];
[components setSecond:0];
date = [calendar dateFromComponents:components];
NSLog(@"Time 1: %f", -[originDate timeIntervalSinceNow]);

选项2

你不需要

代码语言:javascript
复制
[components setHour:0];
[components setMinute:0];
[components setSecond:0];

只是不要将这些选项添加到日期组件中

代码语言:javascript
复制
NSDate* originDate2 = [[NSDate alloc] init];
NSDate* date2 = [[NSDate alloc] init];
NSCalendar *calendar2 = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents* components2 =  [calendar2 components:(NSYearCalendarUnit | NSMonthCalendarUnit
                                                        | NSDayCalendarUnit
                                                        ) fromDate:date2];
date2 = [calendar2 dateFromComponents:components2];
NSLog(@"Time 2: %f", -[originDate2 timeIntervalSinceNow]);

资料来源:Similar Question +David的评论

选项3

基本上,我发现,如果我使用已经创建的NSCalendar运行该方法,我的速度将持续提高85%至90%。

在运行方法之前声明calendarProperty并初始化它

代码语言:javascript
复制
NSDate* originDate3 = [[NSDate alloc] init];
NSDate* date3 = [[NSDate alloc] init];
NSDateComponents* components3 =  [calendarProperty components:(NSYearCalendarUnit | NSMonthCalendarUnit
                                                               | NSDayCalendarUnit
                                                               ) fromDate:date3];
date3 = [calendarProperty dateFromComponents:components3];
NSLog(@"Time 3: %f", -[originDate3 timeIntervalSinceNow]);

备选案文4

*基于@HotLick的评论*

避免所有那些烦人的dateComponents --大约快95%

我不确定选项4在实践中有多一致,但它是最快的,到目前为止它对我来说是可靠的。

代码语言:javascript
复制
NSDate* originDate4 = [[NSDate alloc] init];
NSDate* date4 = [[NSDate alloc] init];
float date4Interval = [date4 timeIntervalSince1970];
int totalDays = date4Interval / (60 * 60 * 24);
date4 = [NSDate dateWithTimeIntervalSince1970:totalDays * 60 * 60 * 24];
NSLog(@"Time 4: %f", -[originDate4 timeIntervalSinceNow]);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22206358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档