NSMutableArrayに追加するオブジェクトの autorelease VS release のベンチを取ってみた。

コード

#import <Cocoa/Cocoa.h>

@interface TT : NSObject
{
  id obj;
  CGPoint position;
}
@property (nonatomic, retain) id obj;
@property (nonatomic) CGPoint position;

@end

@implementation TT
@synthesize obj;
@synthesize position;

- (void)dealloc {
  self.obj = nil;
  [super dealloc];
}

@end

int i = 0;
int cnt = 400;
NSDate *now, * after;

TT * t;
NSMutableArray *arr;
NSAutoreleasePool *p;


void test1() {
  p = [[NSAutoreleasePool alloc] init];
  arr = [NSMutableArray array];
  now = [NSDate date];
  for(i = 0; i < cnt; i++) {
    t = [[TT alloc] init];
    [arr addObject:t];
    [t release];
  }
  after = [NSDate date];
  NSLog(@"        release in loop: %f s", [after timeIntervalSince1970] - [now timeIntervalSince1970]);
  [p release];
}

void test2() {
  p = [[NSAutoreleasePool alloc] init];
  arr = [NSMutableArray array];
  now = [NSDate date];
  for(i = 0; i < cnt; i++) {
    t = [[[TT alloc] init] autorelease];
    [arr addObject:t];
  }
  after = [NSDate date];
  NSLog(@"            autorelease: %f s", [after timeIntervalSince1970] - [now timeIntervalSince1970]);
  [p release];
}


void test3() {
  p = [[NSAutoreleasePool alloc] init];
  arr = [NSMutableArray array];
  now = [NSDate date];
  for(i = 0; i < cnt; i++) {
    id p2 = [[NSAutoreleasePool alloc] init];
    t = [[[TT alloc] init] autorelease];
    [arr addObject:t];
    [p2 release];
  }
  after = [NSDate date];
  NSLog(@"autoreleasepool in loop: %f s", [after timeIntervalSince1970] - [now timeIntervalSince1970]);
  [p release];
}



int main(int argc, char **argv) {
  id pool = [[NSAutoreleasePool alloc] init];

  cnt = 100;

  int max = 1000000;
  for(; cnt < max; cnt  *= 2) {
    NSLog(@"cnt: %d", cnt);
    test1();
    test2();
    test3();
  }
  [pool release];
  return 0;
}

結果

2010-08-17 15:45:49.513 a.out[37180:903] cnt: 100
2010-08-17 15:45:49.515 a.out[37180:903]         release in loop: 0.000071 s
2010-08-17 15:45:49.516 a.out[37180:903]             autorelease: 0.000055 s
2010-08-17 15:45:49.516 a.out[37180:903] autoreleasepool in loop: 0.000079 s
2010-08-17 15:45:49.517 a.out[37180:903] cnt: 200
2010-08-17 15:45:49.517 a.out[37180:903]         release in loop: 0.000114 s
2010-08-17 15:45:49.518 a.out[37180:903]             autorelease: 0.000088 s
2010-08-17 15:45:49.519 a.out[37180:903] autoreleasepool in loop: 0.000140 s
2010-08-17 15:45:49.519 a.out[37180:903] cnt: 400
2010-08-17 15:45:49.520 a.out[37180:903]         release in loop: 0.000190 s
2010-08-17 15:45:49.521 a.out[37180:903]             autorelease: 0.000194 s
2010-08-17 15:45:49.522 a.out[37180:903] autoreleasepool in loop: 0.000265 s
2010-08-17 15:45:49.522 a.out[37180:903] cnt: 800
2010-08-17 15:45:49.523 a.out[37180:903]         release in loop: 0.000408 s
2010-08-17 15:45:49.524 a.out[37180:903]             autorelease: 0.000377 s
2010-08-17 15:45:49.525 a.out[37180:903] autoreleasepool in loop: 0.000560 s
2010-08-17 15:45:49.526 a.out[37180:903] cnt: 1600
2010-08-17 15:45:49.527 a.out[37180:903]         release in loop: 0.000792 s
2010-08-17 15:45:49.529 a.out[37180:903]             autorelease: 0.000839 s
2010-08-17 15:45:49.532 a.out[37180:903] autoreleasepool in loop: 0.001072 s
2010-08-17 15:45:49.533 a.out[37180:903] cnt: 3200
2010-08-17 15:45:49.534 a.out[37180:903]         release in loop: 0.001454 s
2010-08-17 15:45:49.538 a.out[37180:903]             autorelease: 0.001735 s
2010-08-17 15:45:49.542 a.out[37180:903] autoreleasepool in loop: 0.002143 s
2010-08-17 15:45:49.543 a.out[37180:903] cnt: 6400
2010-08-17 15:45:49.546 a.out[37180:903]         release in loop: 0.002978 s
2010-08-17 15:45:49.552 a.out[37180:903]             autorelease: 0.002788 s
2010-08-17 15:45:49.560 a.out[37180:903] autoreleasepool in loop: 0.004381 s
2010-08-17 15:45:49.562 a.out[37180:903] cnt: 12800
2010-08-17 15:45:49.569 a.out[37180:903]         release in loop: 0.006120 s
2010-08-17 15:45:49.579 a.out[37180:903]             autorelease: 0.006029 s
2010-08-17 15:45:49.594 a.out[37180:903] autoreleasepool in loop: 0.009182 s
2010-08-17 15:45:49.598 a.out[37180:903] cnt: 25600
2010-08-17 15:45:49.612 a.out[37180:903]         release in loop: 0.013438 s
2010-08-17 15:45:49.633 a.out[37180:903]             autorelease: 0.013359 s
2010-08-17 15:45:49.662 a.out[37180:903] autoreleasepool in loop: 0.016848 s
2010-08-17 15:45:49.669 a.out[37180:903] cnt: 51200
2010-08-17 15:45:49.694 a.out[37180:903]         release in loop: 0.023827 s
2010-08-17 15:45:49.735 a.out[37180:903]             autorelease: 0.025697 s
2010-08-17 15:45:49.796 a.out[37180:903] autoreleasepool in loop: 0.035007 s
2010-08-17 15:45:49.814 a.out[37180:903] cnt: 102400
2010-08-17 15:45:49.866 a.out[37180:903]         release in loop: 0.051069 s
2010-08-17 15:45:49.955 a.out[37180:903]             autorelease: 0.053106 s
2010-08-17 15:45:50.088 a.out[37180:903] autoreleasepool in loop: 0.080425 s
2010-08-17 15:45:50.118 a.out[37180:903] cnt: 204800
2010-08-17 15:45:50.239 a.out[37180:903]         release in loop: 0.120235 s
2010-08-17 15:45:50.411 a.out[37180:903]             autorelease: 0.111445 s
2010-08-17 15:45:50.681 a.out[37180:903] autoreleasepool in loop: 0.160216 s
2010-08-17 15:45:50.742 a.out[37180:903] cnt: 409600
2010-08-17 15:45:51.003 a.out[37180:903]         release in loop: 0.260512 s
2010-08-17 15:45:52.642 a.out[37180:903]             autorelease: 1.520100 s
2010-08-17 15:45:53.207 a.out[37180:903] autoreleasepool in loop: 0.335046 s
2010-08-17 15:45:53.346 a.out[37180:903] cnt: 819200
2010-08-17 15:45:53.857 a.out[37180:903]         release in loop: 0.510884 s
2010-08-17 15:45:56.065 a.out[37180:903]             autorelease: 1.931285 s
2010-08-17 15:45:57.256 a.out[37180:903] autoreleasepool in loop: 0.697457 s

結論

200000以下だと、autorelease済みなオブジェクトの追加で十分。特に追加件数が少ない場合は高速。
ループ内でNSAutoreleasePoolを使うと少し遅くなる。