Objective-C中点表示法与方法调用之间的性能差异

Objective-C中点表示法与方法调用之间的性能差异

Performance difference between dot notation versus method call in Objective-C

您可以在Objective-C中使用标准的点符号或方法调用来访问Objective-C中的对象的属性。

1
myObject.property = YES;

要么

1
[myObject setProperty:YES];

性能(在访问属性方面)是否有所不同? 就编码风格而言,这只是偏好问题吗?


与括号表示法一样,Objective-C中用于属性访问的点表示法是消息发送。也就是说,鉴于此:

1
2
3
4
5
6
7
@interface Foo : NSObject
@property BOOL bar;
@end

Foo *foo = [[Foo alloc] init];
foo.bar = YES;
[foo setBar:YES];

最后两行将完全相同地编译。唯一改变此属性的是属性是否指定了getter和/或setter属性。但是,它所做的只是更改发送消息的方式,而不是是否发送消息:

1
2
3
4
5
6
@interface MyView : NSView
@property(getter=isEmpty) BOOL empty;
@end

if ([someView isEmpty]) { /* ... */ }
if (someView.empty) { /* ... */ }

最后两行的编译相同。


唯一会看到性能差异的地方是您没有将属性标记为"非原子"。然后@synthesize将自动在属性的设置周围添加同步代码,以确保其线程安全-但设置和访问速度较慢。

因此,大多数情况下,您可能想定义一个属性,例如:

@属性(非原子的,保留)NSString * myProp;

就您个人而言,从不必考虑编写正确的setter方法的角度来看,我发现点符号通常很有用,即使对于非原子的setter来说,这也不是完全不重要的,因为您还必须记得正确释放旧值。使用模板代码会有所帮助,但是您总是会出错,而且通常是重复的代码使类混乱。

要注意的一种模式:如果您自己定义设置器(而不是让@synthesize创建它)并开始具有设置值的其他副作用,则可能应该使设置器成为常规方法,而不是使用属性表示法进行调用。

语义上使用属性似乎是直接向调用者访问实际值,因此与该值不同的任何事情都应该通过发送消息而不是访问属性来完成(即使它们实际上都在发送消息)。


查看可可的文章是我的女朋友。其要点是,使用一个在另一个上不会造成性能损失。

但是,这种符号的确使查看变量发生了什么以及变量是什么变得更加困难。


还请阅读有关可可与爱的博客文章:

http://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html

在那里,作者比较了NSManagedObject的自定义访问器和点表示法的速度,发现没有区别。但是,KVC访问(setValue:forKey :)的速度似乎是速度的两倍。


据我所知,两者之间没有明显的性能差异。我可以肯定地说,在大多数情况下,它将被"编译"为相同的代码。

如果不确定,请尝试编写一个测试应用程序,每种方法执行一百万次左右,同时计时所需的时间。这是唯一可以确定的方法(尽管它可能在不同的体系结构上有所不同。)


推荐阅读

    提高3A四核羿龙II游戏配置的性能

    提高3A四核羿龙II游戏配置的性能,,以节能环保为主题的IT产业,目前3A低端平台处理器、主板芯片组、独立开发卡性能突出,特别是在与AMD的处理

    优化PostgreSQL中的批量更新性能

    优化PostgreSQL中的批量更新性能,数据,表格,在Ubuntu 12.04上使用PG 9.1. 我们目前需要24小时才能运行大量UPDATE数据库上的语句,其形式

    诺基亚威图性能好到哪里

    诺基亚威图性能好到哪里,诺基亚,手机,诺基亚威图性能好到哪里这是一部以前列出的手机。即使当时配置不高,该品牌的手机也不依赖于该功能吸

    魅蓝note6性能参数有哪些

    魅蓝note6性能参数有哪些,摄像头,蓝牙,魅蓝note6性能参数有哪些魅力蓝色Note6最好拍照。电池寿命更长。蓝色Note6使用高通 snapdragon 625

    扬声器属性级别设置|扬声器属性高级

    扬声器属性级别设置|扬声器属性高级,,1. 扬声器属性高级选择“高级”标签试试,不行的话,说明系统有问题了,直接换个验证过的系统盘重装系统就

    国产电脑cpu测试|国产CPU性能

    国产电脑cpu测试|国产CPU性能,,国产CPU性能天玑9000答: 天玑9000更厉害。因为天玑9000是 最新发布的cpu,也是现在的天花板。而麒麟9000是 2

    主流电脑cpu性能分析|cpu性能对比表

    主流电脑cpu性能分析|cpu性能对比表,,1. cpu性能对比表一、参数对比1、r7 5800H:制程工艺为7nm,主频3.2GHz,睿频4.4GHz,线程数是8核16线程,45W

    新老酷睿i3性能对比试验i34130和i33220

    新老酷睿i3性能对比试验i34130和i33220,,新的英特尔酷睿i3-4130 Haswell处理器架构已经推出了很长一段时间,虽然市场的时间还不长,已经成为