gpt4 book ai didi

ios - NSDateComponents 时间配置文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:06:12 25 4
gpt4 key购买 nike

我的问题是处理下面代码片段中给出的 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.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 + 大卫的评论

选项 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 的评论 *

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

关于ios - NSDateComponents 时间配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22206358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com