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を使うと少し遅くなる。