测试平台是Mac OS X 10.7.2,其实iOS上也是类似的。
这是测试类:
@interface Test : NSObject
- (id)nothing;
@end
@implementation Test
- (id)nothing {
return self;
}
@end
然后创建一个对象,执行1千万次它的nothing方法:
Test *test = [[Test alloc] init];
time_t c = clock();
for (int i = 0; i < 10000000; ++i) {
[test nothing];
}
NSLog(@"%f", (clock() - c) / (double)CLOCKS_PER_SEC);
未开启ARC时约0.041秒,开启后约0.698秒。如果还有赋值操作的话,这个差别就更大了…
接着把返回值改为nil,未开启ARC时约0.041秒,开启后约0.105秒。
再把返回值类型改成void、int或int *等非id类型,这下都变成0.040秒了。
于是怀疑编译器自动对返回值执行了retain/release操作,但是不清楚怎么避免。不知道有人研究过么?
这是测试类:
@interface Test : NSObject
- (id)nothing;
@end
@implementation Test
- (id)nothing {
return self;
}
@end
然后创建一个对象,执行1千万次它的nothing方法:
Test *test = [[Test alloc] init];
time_t c = clock();
for (int i = 0; i < 10000000; ++i) {
[test nothing];
}
NSLog(@"%f", (clock() - c) / (double)CLOCKS_PER_SEC);
未开启ARC时约0.041秒,开启后约0.698秒。如果还有赋值操作的话,这个差别就更大了…
接着把返回值改为nil,未开启ARC时约0.041秒,开启后约0.105秒。
再把返回值类型改成void、int或int *等非id类型,这下都变成0.040秒了。
于是怀疑编译器自动对返回值执行了retain/release操作,但是不清楚怎么避免。不知道有人研究过么?
