iOS:方法在设备和模拟器上测试慢25倍

Dav*_*las 8 performance ios ios-simulator

我有一种方法,与模拟器相比,在设备(iPhone3G)中运行非常慢的测试.

虽然模拟器可以在1秒内处理大约100次该方法的执行,但设备只能在一秒内运行4次.

有什么能让它变得如此懒散?

代码:注意:该方法从两个日期(事件的开始日期和结束日期)计算人类友好的字符串.

-(void)calculateDiaDeInicioYFinTexto
{
    NSLog(@"inicio");
    NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];

    NSMutableString *auxString = [NSMutableString string];

    NSLocale *currLocale = [NSLocale currentLocale];

    NSString *stringFormatDay = [NSDateFormatter dateFormatFromTemplate:@"d" 
                                                                options:0 
                                                                 locale:currLocale];
    NSString *stringFormatDayMonth = [NSDateFormatter dateFormatFromTemplate:@"dMMMM" 
                                                                     options:0 
                                                                      locale:currLocale];
    NSString *stringFormatDayMonthYear = [NSDateFormatter dateFormatFromTemplate:@"dMMMMYYYY" 
                                                                         options:0 
                                                                          locale:currLocale];

    NSDateFormatter *formatterDay = [[NSDateFormatter alloc] init];
    [formatterDay setDateFormat:stringFormatDay];
    [formatterDay setLocale:currLocale];

    NSDateFormatter *formatterDayMonth = [[NSDateFormatter alloc] init];
    [formatterDayMonth setDateFormat:stringFormatDayMonth];
    [formatterDayMonth setLocale:currLocale];

    NSDateFormatter *formatterDayMonthYear = [[NSDateFormatter alloc] init];
    [formatterDayMonthYear setDateFormat:stringFormatDayMonthYear];
    [formatterDayMonthYear setLocale:currLocale];


    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDateComponents *dateComponentsNow = [calendar components:(NSYearCalendarUnit |
                                                                NSMonthCalendarUnit | 
                                                                NSDayCalendarUnit)
                                                      fromDate:[NSDate date]];
    NSDateComponents *dateComponentsInicio = [calendar components:(NSYearCalendarUnit |
                                                                   NSMonthCalendarUnit | 
                                                                   NSDayCalendarUnit)
                                                         fromDate:self.diaDeInicio];
    NSDate *diaDeInicioTimeless = [calendar dateFromComponents:dateComponentsInicio];

    NSDateComponents *dateComponentsFin = [calendar components:(NSYearCalendarUnit | 
                                                                NSMonthCalendarUnit |
                                                                NSDayCalendarUnit) 
                                                      fromDate:self.diaDeFin];
    NSDate *diaDeFinTimeless = [calendar dateFromComponents:dateComponentsFin];


    if ( [diaDeInicioTimeless isEqualToDate:diaDeFinTimeless] ) {
        // dates are the same
        if ( dateComponentsInicio.year == dateComponentsNow.year ) {
            // date is in the current year
            [auxString appendFormat:@"%@", [formatterDayMonth stringFromDate:self.diaDeInicio]];
        } else {
            // date is in another year
            [auxString appendFormat:@"%@", [formatterDayMonthYear stringFromDate:self.diaDeInicio]];
        }
    } else {
        // dates are different
        if ( dateComponentsInicio.year == dateComponentsFin.year ) {
            // years are the same
            if ( dateComponentsInicio.month == dateComponentsFin.month ) {
                // Months are the same
                if ( dateComponentsInicio.year == dateComponentsNow.year ) {
                    // date is in the current year
                    [auxString appendFormat:@"%@ - %@", 
                     [formatterDay stringFromDate:self.diaDeInicio],
                     [formatterDayMonth stringFromDate:self.diaDeFin]];                    
                } else {
                    // date is in another year
                    [auxString appendFormat:@"%@ - %@", 
                     [formatterDay stringFromDate:self.diaDeInicio],
                     [formatterDayMonthYear stringFromDate:self.diaDeFin]];                                        
                }
            } else {
                // Months are different
                if ( dateComponentsInicio.year == dateComponentsNow.year ) {
                    // date is in the current year
                    [auxString appendFormat:@"%@ - %@", 
                     [formatterDayMonth stringFromDate:self.diaDeInicio],
                     [formatterDayMonth stringFromDate:self.diaDeFin]];                    
                } else {
                    // date is in another year
                    [auxString appendFormat:@"%@ - %@", 
                     [formatterDayMonth stringFromDate:self.diaDeInicio],
                     [formatterDayMonthYear stringFromDate:self.diaDeFin]];                    
                }
            }
        } else {
            // Years are different
            [auxString appendFormat:@"%@ - %@", 
             [formatterDayMonthYear stringFromDate:self.diaDeInicio],
             [formatterDayMonthYear stringFromDate:self.diaDeFin]];            
        }
    }
    self.diaDeInicioYFinTexto = auxString;
    [formatterDay release];
    [formatterDayMonth release];
    [formatterDayMonthYear release];
    [localPool release]; 

    NSLog(@"Fin");
}
Run Code Online (Sandbox Code Playgroud)

DHa*_*ick 17

iOS设备的功能远远低于运行模拟器的计算机.iOS模拟器不会模拟ARM处理器,因此它会全速运行它.

另外,这个特定方法如此慢的原因是因为NSDateFormatterNSCalendar对象的创建.这些是相当昂贵的创建,如果你想多次使用它们应该缓存在实例变量/属性中.


Nev*_*rBe 13

你应该缓存这个变量,它很慢.调用此方法一次.

NSCalendar *calendar = [NSCalendar currentCalendar];
Run Code Online (Sandbox Code Playgroud)