2012-02-29 18 views
8

पर 25 बार धीमी परीक्षण विधि मेरे पास एक विधि है जो सिम्युलेटर की तुलना में डिवाइस (आईफोन 3 जी) में अविश्वसनीय रूप से धीमी परीक्षण चलाती है।आईओएस: डिवाइस बनाम सिम्युलेटर

जबकि सिम्युलेटर विधि के लगभग 100 निष्पादन को 1 सेकंड में संभाल सकता है, डिवाइस केवल 4 बार एक सेकंड में विधि को सोचा जा सकता है।

क्या यह इतना sloooow बना सकता है?

कोड: नोट: विधि दो तारीखों (किसी ईवेंट की आरंभ तिथि और समाप्ति तिथि) से मानव अनुकूल स्ट्रिंग की गणना करती है।

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

आईओएस डिवाइस कंप्यूटर से काफी कम शक्तिशाली हैं जो आप सिम्युलेटर चला रहे हैं। आईओएस सिम्युलेटर एआरएम प्रोसेसर का अनुकरण नहीं करता है और इसलिए यह पूरी गति से चलता है।

इसके अलावा, NSDateFormatter और NSCalendar ऑब्जेक्ट्स के निर्माण के कारण यह विशेष विधि इतनी धीमी है कि कारण है। यदि आप उन्हें कई बार उपयोग करना चाहते हैं तो वे एक उदाहरण चर/संपत्ति में कैश किए जाने के लिए काफी महंगा हैं।

+0

मैंने इसे कैश किया और मुझे एक सेकंड (12 टाइम्स तेज) में विधि के 50 रन मिलते हैं, और सिम्युलेटर की तुलना में केवल आधा समय मिलता है। मुझे अब से अपने लूप में इसकी जांच करनी होगी। –

1

यह सिम्युलेटर, इंटेल प्रोसेसर के लिए संकलित किया गया है, जब आप सिम्युलेटर अपने अनुप्रयोग इंटेल के लिए निर्माण किया जा रहा है और सभी अपने कंप्यूटर सीपीयू की शक्ति का उपयोग कर रहा पर परीक्षण कर रहे हैं सामान्य है। तो यह तेज़ तरीका है।

आप यह देखने के लिए उपकरण का उपयोग कर सकते हैं कि कौन सा हिस्सा निष्पादन धीमा कर रहा है।

13

आपको इस चर को कैश करना चाहिए, यह बहुत धीमा है। एक बार इस विधि को बुलाओ।

NSCalendar *calendar = [NSCalendar currentCalendar]; 
+0

यदि निम्न सत्य है: http://mikeabdullah.net/NSCalendar_currentCalendar.html, हमें अब [iSCalendar currentCalendar] को कैश करने की आवश्यकता नहीं है, जो अब IOS 7 और ऊपर शुरू हो रही है। –

0

लूप में NSDateFormatter का उपयोग करने से बचें।

मैंने स्ट्रिंगविथफॉर्मेट का उपयोग करके स्ट्रिंग को स्ट्रिंग में परिवर्तित करके और फिर घटकों का उपयोग करके घटकों को तोड़कर SeparatedByString का उपयोग करके इसे ठीक कर दिया।

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

ऐसा करके, मैं कुछ सेकंड से एक सेकंड से भी कम समय में अपने लूप को निष्पादित करने में सक्षम था।

आशा है कि इससे मदद मिलेगी।

0

एनएसडीएटीफॉर्मेटर और एनएससीएंडर को इंस्टेंट करना गैर-तुच्छ संचालन नहीं है। एक NSDateFormatter बनाना मेरे परीक्षण पर, एक आईफोन 4 एस पर 250ms तक ले सकता है। इन वस्तुओं के पुन: निर्माण से बचें, यदि संभव हो तो उन्हें कक्षा ivars या स्थैतिक वस्तुओं के रूप में रखें। जब भी आप कर सकते हैं पुन: उपयोग करें।

संबंधित मुद्दे