NSDateComponents时间档案

时间:2014-03-05 18:37:47

标签: ios nsdate nsdatecomponents

我的问题是在下面的代码片段中给出的NSDateComponents操作的时间配置文件。

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

    1. 我从原始日期创建了一个NSDateComponents对象。
    2. 我将H:M:S元素设置为0
    3. 我得到了我的新日期对象,其中H:M:S根据需要设置为0

问题:

步骤1&上面的3个占我整个方法执行时间的很大一部分,分别占22.4%和56.8%。

我正在寻找关于如何优化我的代码的这部分或者将H:M:S置于可能表现更好的替代方法的建议。

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];

1 个答案:

答案 0 :(得分:3)

更新

时钟:

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

时间2:≈0.000108 - 选项2

时间3:≈0.000013 - 选项3

时间4:≈0.000004 - 选项4

选项1 - 原始

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

您不需要

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

只是不要将这些作为日期组件的选项添加

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并在运行方法之前初始化它

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

*基于@ HotLicks的评论*

将所有令人讨厌的日期组件全部放在一起 - 大约快95%

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

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]);