我的问题与下面的代码片段中给出的NSDateComponents操作的时间概要有关。
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进行归零的替代方法,这样效果会更好。
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];发布于 2014-03-05 18:55:08
更新
钟表:
时间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
*基于@HotLick的评论*
避免所有那些烦人的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]);https://stackoverflow.com/questions/22206358
复制相似问题