NSDateComponents时间configuration文件

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

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

    1. 我从我的原始date创build一个NSDateComponents对象。
    2. 我将H:M:S元素设置为0
    3. 我得到我的新date对象的H:M:S设置为0根据需要

问题:

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

我正在寻找关于如何优化我的代码的这部分或者将H:M:S置零的替代方法的build议。

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

只是不要添加这些作为选项date组件

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

来源: 相似的问题 +大卫的评论

选项3

基本上,我发现如果使用已经创build的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的评论*

避免所有那些烦人的dateComponents在一起 – 约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]);