With ARC, what's better: alloc or autorelease initializers?

后端 未结 6 612
情书的邮戳
情书的邮戳 2020-11-29 01:19

Is it better (faster & more efficient) to use alloc or autorelease initializers. E.g.:

- (NSString *)hello:(NSString *)name {
          


        
6条回答
  •  情书的邮戳
    2020-11-29 01:37

    Well, this is something easy to test, and indeed it seems the convenience constructor is "faster" -- unless I made some error in my test code, see below.

    Output (Time for 1 Million constructions)

    Alloc/init:   842.549473 millisec
    Convenience:  741.611933 millisec
    Alloc/init:   799.667462 millisec
    Convenience:  741.814478 millisec
    Alloc/init:   821.125221 millisec
    Convenience:  741.376502 millisec
    Alloc/init:   811.214693 millisec
    Convenience:  795.786457 millisec
    

    Script

    #import 
    #import 
    
    int main (int argc, const char * argv[])
    {
    
        @autoreleasepool {
            NSUInteger runs = 4;
    
            mach_timebase_info_data_t timebase;
            mach_timebase_info(&timebase);
            double ticksToNanoseconds = (double)timebase.numer / timebase.denom;
    
            NSString *format = @"Hello %@";
            NSString *world = @"World";
    
            NSUInteger t = 0;
            for (; t < 2*runs; t++) {
                uint64_t start = mach_absolute_time();
                NSUInteger i = 0;
                for (; i < 1000000; i++) {
                    if (0 == t % 2) {       // alloc/init
                        NSString *string = [[NSString alloc] initWithFormat:format, world];
                    }
                    else {                  // convenience
                        NSString *string = [NSString stringWithFormat:format, world];
                    }
                }
                uint64_t run = mach_absolute_time() - start;
                double runTime = run * ticksToNanoseconds;
    
                if (0 == t % 2) {
                    NSLog(@"Alloc/init:   %.6f millisec", runTime / 1000000);
                }
                else {
                    NSLog(@"Convenience:  %.6f millisec", runTime / 1000000);
                }
            }
        }
        return 0;
    }
    

提交回复
热议问题