2012-02-29 7 views
8

シミュレータと比較して、デバイス(iPhone3G)で非常に遅いテストを実行する方法があります。iOS:デバイス対シミュレータのテスト方法が25倍遅い

シミュレータは1秒間に100回程度のメソッド実行を処理できますが、デバイスは1秒間にメソッドを4回しか実行できません。

どうすればいいですか?

CODE: 注:このメソッドは、2つの日付(イベントの開始日と終了日)から人間にとってわかりやすい文字列を計算します。

-(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

デバイスは、シミュレータが遅いです...したがって、名前シミュレータではなく、エミュレータです。それは顕著なパフォーマンスの問題ですか?タイムプロファイラを(デバイスとともに)実行しましたか? –

答えて

16

iOSデバイスは、シミュレータを実行しているコンピュータに比べてかなり強力ではありません。 iOSシミュレータはARMプロセッサをエミュレートしないため、フルスピードで実行します。

さらに、この特定の方法が非常に遅い理由は、NSDateFormatterおよびNSCalendarオブジェクトの作成によるものです。それらは作成するのがかなりコストがかかります。それらを複数回使用する場合は、インスタンス変数/プロパティにキャッシュする必要があります。

+0

私はそれをキャッシングして、メソッドを50回実行します(12倍高速)。シミュレータと比較して半分しか時間がかかりません。これから私のループでこれをチェックする必要があります。 –

1

それは、あなたのアプリがINTELのために構築されており、すべてのコンピュータのCPUの電源を使用しているシミュレータ上でテストしているときシミュレータは、Intelプロセッサ用にコンパイルされ、正常です。だからそれは速いです。

instrumentを使用すると、実行が遅くなっている部分を確認できます。

13

この変数はキャッシュする必要がありますが、非常に遅いです。一度このメソッドを呼び出します。

NSCalendar *calendar = [NSCalendar currentCalendar]; 
+0

次の条件が当てはまる場合、http://mikeabdullah.net/NSCalendar_currentCalendar.html、私たちは7以上の起動時に '[NSCalendar currentCalendar] 'をキャッシュする必要はありません。 –

0

NSDateFormatterをループ内で使用しないでください。

dateをstringWithFormatを使用して文字列に変換し、componentsSeparatedByStringを使用してコンポーネントを分割することで修正しました。

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

こうすることで、数秒から1秒未満でループを実行することができました。

希望すると、これが役立ちます。

0

NSDateFormatterとNSCalendarのインスタンス化は簡単な操作ではありません。私のテストでNSDateFormatterを作成すると、iPhone 4sで最大250msかかることがあります。これらのオブジェクトの再作成は避け、可能であればクラスivarsまたは静的オブジェクトのままにしておきます。できるだけいつでも再利用してください。

関連する問題