2012-02-29 42 views
8

Tôi có phương pháp chạy thử nghiệm cực kỳ chậm trong thiết bị (iPhone3G) so với trình mô phỏng.iOS: Phương pháp thử nghiệm chậm hơn 25 lần trên thiết bị so với mô phỏng

Trong khi trình mô phỏng có thể xử lý khoảng 100 lần thực thi phương pháp trong 1 giây, thiết bị chỉ có thể chạy 4 lần để nghĩ phương thức trong một giây.

Điều gì có thể khiến nó thành hiện thực?

MÃ: Lưu ý: Phương pháp tính chuỗi thân thiện với con người từ hai ngày (ngày bắt đầu và ngày kết thúc của sự kiện).

-(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"); 
} 
+1

Thiết bị chậm hơn rất nhiều so với bộ mô phỏng ... do đó tên mô phỏng và không giả lập. Đây có phải là vấn đề hiệu suất đáng chú ý không? Bạn đã chạy Trình định thời gian (với thiết bị) chưa? –

Trả lời

16

Thiết bị iOS ít mạnh hơn đáng kể so với máy tính bạn đang chạy trình giả lập. Trình mô phỏng iOS không mô phỏng bộ xử lý ARM và do đó nó chạy ở tốc độ tối đa.

Ngoài ra, lý do khiến phương pháp cụ thể này quá chậm là do việc tạo các đối tượng NSDateFormatterNSCalendar. Đó là khá đắt tiền để tạo ra và nên được lưu trữ trong một biến cá thể/tài sản nếu bạn muốn sử dụng chúng nhiều lần.

+0

Tôi đã lưu trong bộ nhớ cache đó và tôi nhận được 50 lần chạy phương thức trong một giây (nhanh hơn 12 lần), và chỉ bằng một nửa so với giả lập. Tôi sẽ phải kiểm tra điều này trong vòng của tôi từ bây giờ. –

1

Đó là bình thường giả lập được biên soạn cho bộ vi xử lý INTEL, khi bạn đang thử nghiệm trên mô phỏng ứng dụng của bạn đang được xây dựng cho INTEL và đang sử dụng tất cả sức mạnh của CPU máy tính của bạn. Vì vậy, nó là cách nhanh hơn.

Bạn có thể sử dụng công cụ để xem phần nào đang làm chậm thực hiện thao tác.

13

Bạn nên lưu bộ nhớ cache biến này, nó rất chậm. Gọi phương thức này một lần.

NSCalendar *calendar = [NSCalendar currentCalendar]; 
+0

Nếu những điều sau đây là đúng: http://mikeabdullah.net/NSCalendar_currentCalendar.html, chúng tôi không cần phải lưu vào bộ nhớ cache '[NSCalendar currentCalendar]' nữa, bắt đầu từ ios 7 trở lên. –

0

Tránh sử dụng NSDateFormatter trong vòng lặp.

Tôi đã sửa nó bằng cách chuyển đổi ngày thành chuỗi bằng stringWithFormat và sau đó phá vỡ các thành phần bằng cách sử dụng componentsSeparatedByString.

NSString *stringDate = [NSString stringWithFormat:@"%@",mydate]; 
NSArray *stringArray = [stringDate componentsSeparatedByString: @" "]; 
NSArray *timeArray = [stringArray[1] componentsSeparatedByString: @":"]; 

Bằng cách này, tôi có thể thực hiện vòng lặp của mình sau chưa đầy một giây từ vài giây.

Hy vọng điều này sẽ hữu ích.

0

Khởi tạo NSDateFormatter và NSCalendar không phải là các hoạt động không tầm thường. Tạo một NSDateFormatter có thể mất đến 250ms trên iPhone 4s, trong thử nghiệm của tôi. Tránh tái tạo các đối tượng này, giữ chúng hoặc là lớp ivars hoặc các đối tượng tĩnh nếu có thể. Tái sử dụng bất cứ khi nào bạn có thể.

Các vấn đề liên quan