我的问题是在下面的代码片段中给出的NSDateComponents操作的时间配置文件。
要做到这一点,我有3个步骤:
问题:
步骤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];
答案 0 :(得分:3)
时钟:
时间1:≈0.000139 - 选项1 - 原始
时间2:≈0.000108 - 选项2
时间3:≈0.000013 - 选项3
时间4:≈0.000004 - 选项4
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]);
您不需要
[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的评论
基本上,我发现如果我使用已经创建的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]);
*基于@ 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]);