Is it better (faster & more efficient) to use alloc or autorelease initializers. E.g.:
- (NSString *)hello:(NSString *)name {
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;
}