奇葩的问题:开启ARC后,返回对象的方法会变慢几十倍

2011-11-29 23:44:15 +08:00
 keakon
测试平台是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操作,但是不清楚怎么避免。不知道有人研究过么?
6260 次点击
所在节点    iDev
4 条回复
Echoldman
2011-11-29 23:54:30 +08:00
一直没有用arc,关注
nickcheng
2012-01-16 16:10:12 +08:00
这个事情有后续的研究么?
popoer
2012-01-16 18:14:43 +08:00
楼主出来说说哇
guoxx_
2012-01-16 18:58:27 +08:00
我本机测试环境先开启arc更快一些 llvm3.0

试试这个?
- (__weak id)nothing {
return self;
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/22461

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX