测试平台是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操作,但是不清楚怎么避免。不知道有人研究过么?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/22461
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.