V2EX 首页   注册   登入
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请 登入
iOS 开发实用技术导航
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Cocoa with Love
http://cocoawithlove.com/
iOS 开发实用书单
iPhone App Development: The Missing Manual
Cocoa and Objective-C: Up and Running
Cocoa Programming for Mac OS X
深入浅出设计模式 Head First Design Patterns
Useful Tools
Charles Web Debugging Proxy
Sponsored by
唐茶 字节社
中文世界最好的电子书城
V2EX  ›  iDev

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

By keakon at 176 天前, 1389 次点击
测试平台是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操作,但是不清楚怎么避免。不知道有人研究过么?
4 回复  |  直到 2012-01-17 18:58:27 PM
    1
Echoldman   176 天前
一直没有用arc,关注
    2
nickcheng   128 天前
这个事情有后续的研究么?
    3
popoer   128 天前
楼主出来说说哇
    4
guoxx_   128 天前
我本机测试环境先开启arc更快一些 llvm3.0

试试这个?
- (__weak id)nothing {
return self;
}
Linode
关于   |   FAQ   |   我们的愿景   |   广告投放   |   工作空间   |   Gadget Lab   |   博客   |   上网首页   |   253 人在线   最高记录 362
创意工作者们的社区
Lovingly made by OLIVIDA
VERSION: 3.0.0-dev
♥ Do have a faith in what you're doing.