2

我在仪器中运行时间分析器。我已经尽可能地简化了代码,以将所有内容归结为确切的问题。循环内具有 checkInString =[_formatter stringFromDate:[checkInArrayCopy objectAtIndex:i]]; 的代码行 占用了 90% 以上的处理时间。关于如何优化此代码的任何想法?

 NSDateFormatter *format = [[NSDateFormatter alloc]init];
[format setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
[format setDateFormat:@"MM/dd/YYYY"];
NSString *checkInString;
for (int x=0; x<100; x++) { 
    for (int i=0; i<checkInArray.count; i++) { //CheckInArray is a NSMutableArray of NSDates, with about 100 objects inside
        checkInString =[_formatter stringFromDate:[checkInArray objectAtIndex:i]]; //**90% of processing time
    }
}
4

3 回答 3

4

老实说,我认为任何重大改进都将是超出我们在此处实际建议的范围的算法更改(例如,减少您需要执行的循环量,或消除获取所有日期字符串的需要)。

您可以进行一些微优化,但我不认为它们会产生巨大的影响。基本上,您可以通过使用 IMP 缓存和 NSArray 的枚举方法而不是 C 的 for 循环来减少消息发送的数量,这应该会带来一点提升。

NSDateFormatter *format = [[NSDateFormatter alloc]init];
[format setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
[format setDateFormat:@"MM/dd/YYYY"];
__block NSString *checkInString;
id (*stringFromDateIMP)(id, SEL, id) = [_formatter methodForSelector:@selector(stringFromDate:)];
for (int x=0; x<100; x++) { 
    [checkInArray enumerateObjectsUsingBlock:^(NSDate *date, NSUInteger i, BOOL *stop) { //CheckInArray is a NSMutableArray of NSDates, with about 100 objects inside
        checkInString = stringFromDateIMP(_formatter, @selector(stringFromDate:), date);
    }];
}

(写在浏览器中,所以警告编译器。)

于 2013-02-08T19:13:45.287 回答
2

明显的免责声明可能是我完全错过了一些东西,当前代码执行相同的日期转换 100 次。

如果这是正确的,你应该能够通过只进行一次转换来获得很多。以下代码展示了原理,但请注意它未经测试,因此请在阅读时使用您的常识:

NSDateFormatter *format = [[NSDateFormatter alloc]init];
[format setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
[format setDateFormat:@"MM/dd/YYYY"];

NSMutableArray *dates = [NSMutableArray array];
for (int i=0; i<checkInArray.count; i++) { //CheckInArray is a NSMutableArray of NSDates, with about 100 objects inside
    NSString *cis =[format stringFromDate:[checkInArray objectAtIndex:i]]
    [dates addObject: cis];
}

NSString *checkInString;
for (int x=0; x<100; x++) { 
    for (int i=0; i<checkInArray.count; i++) { 
        checkInString = [dates objectAtIndex:i]; 
    }
}

该代码维护您对 的使用objectAtIndex:,您可能希望使用 aforeach或块来执行循环,但这是一个细节。

于 2013-02-08T19:42:55.963 回答
1

您的 for 循环非常简单。你真正想要的是对 stringFromDate 方法本身的优化......

看一下这个

NSDateFormatter 的 stringFromDate 有哪些可能的优化?

我不认为有什么太多你可以做的。格式化操作将占用一些 CPU...除非您可以根据您对输入值做出的任何假设来设计自己的算法

于 2013-02-08T18:30:01.800 回答