New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

现在的YYmodel和当年的MJExtension 都是用iVar的。 #30

Closed
wy19901227 opened this Issue Dec 19, 2015 · 8 comments

Comments

Projects
None yet
4 participants
@wy19901227

wy19901227 commented Dec 19, 2015

当时MJ也做过性能测试,远远比其他用property的性能高, 后来MJExtension要支持core data,也用了property,但是 ,YYModel的写法要底层一点,和MJExtension比得话,用他的0.0.3版

@ibireme

This comment has been minimized.

Show comment
Hide comment
@ibireme

ibireme Dec 19, 2015

Owner

然而并不是。

YYModel 是根据 property 获取对应的 getter 和 setter,然后用 objc_msgSend 直接调用。这当中没有用到 ivar。

访问一个 property,自上至下主要有 3 种方法:KVC、getter/setter(Accessor Methods)、ivar。

  1. KVC 兼容性最好,它会尝试用 getter/setter,失败时则直接访问 ivar。缺点是性能差,非对象类型需要包装成值对象。
  2. getter/setter 性能最高,和直接手动访问属性性能相同。缺点就是运行时代码写起来太麻烦。
  3. ivar 访问时,性能并不比 getter/setter 高,而且对没有 ivar 的 property 无效,另外相对上面两种方法,它不支持 CoreData 或其他 dynamic 属性的对象。
Owner

ibireme commented Dec 19, 2015

然而并不是。

YYModel 是根据 property 获取对应的 getter 和 setter,然后用 objc_msgSend 直接调用。这当中没有用到 ivar。

访问一个 property,自上至下主要有 3 种方法:KVC、getter/setter(Accessor Methods)、ivar。

  1. KVC 兼容性最好,它会尝试用 getter/setter,失败时则直接访问 ivar。缺点是性能差,非对象类型需要包装成值对象。
  2. getter/setter 性能最高,和直接手动访问属性性能相同。缺点就是运行时代码写起来太麻烦。
  3. ivar 访问时,性能并不比 getter/setter 高,而且对没有 ivar 的 property 无效,另外相对上面两种方法,它不支持 CoreData 或其他 dynamic 属性的对象。

@ibireme ibireme added the discussion label Dec 19, 2015

@skyline75489

This comment has been minimized.

Show comment
Hide comment
@skyline75489

skyline75489 Jan 14, 2016

Contributor

ivar 性能并不比 getter/setter 高吗?按道理来说,直接获取 ivar 不是应该比走 objc_msgSend 性能要高不少吗?

Contributor

skyline75489 commented Jan 14, 2016

ivar 性能并不比 getter/setter 高吗?按道理来说,直接获取 ivar 不是应该比走 objc_msgSend 性能要高不少吗?

@ibireme

This comment has been minimized.

Show comment
Hide comment
@ibireme

ibireme Jan 14, 2016

Owner

通常,在 OC 中直接访问 ivar,是通过 object_getIvar() object_setIvar() 来进行的,我测试过这两个方法性能并不高。getter/setter 是直接通过编译时对象 struct 内存地址偏移来访问的,性能自然很高。

通过 OC 运行时实际上也能获得属性在对象 struct 里的地址偏移,是一个 ptrdiff_t 类型的数值,但我没见过有人能用这个值来直接访问内存地址。一方面 OC 对象的结构并不是公开的,而且在过去也经过好几次的变更;另一方面,如果通过 ivar 访问,那 assign、weak、strong 等逻辑都需要自己实现一遍。

Owner

ibireme commented Jan 14, 2016

通常,在 OC 中直接访问 ivar,是通过 object_getIvar() object_setIvar() 来进行的,我测试过这两个方法性能并不高。getter/setter 是直接通过编译时对象 struct 内存地址偏移来访问的,性能自然很高。

通过 OC 运行时实际上也能获得属性在对象 struct 里的地址偏移,是一个 ptrdiff_t 类型的数值,但我没见过有人能用这个值来直接访问内存地址。一方面 OC 对象的结构并不是公开的,而且在过去也经过好几次的变更;另一方面,如果通过 ivar 访问,那 assign、weak、strong 等逻辑都需要自己实现一遍。

@skyline75489

This comment has been minimized.

Show comment
Hide comment
@skyline75489

skyline75489 Jan 14, 2016

Contributor

原来是这样,我就猜到苹果不至于让 setter/getter 性能太差,毕竟大家用的这么多。终于有理由说服同事放弃 ivar 了(不是彻底放弃 ivar ,很多人喜欢直接定义 ivar 当全局变量用,然后命名还不加 _,这代码看着我就懵逼了。。。习惯不是 self.property 就是 _property 的,看到一个单独的 property 根本反应不过来。。。

Contributor

skyline75489 commented Jan 14, 2016

原来是这样,我就猜到苹果不至于让 setter/getter 性能太差,毕竟大家用的这么多。终于有理由说服同事放弃 ivar 了(不是彻底放弃 ivar ,很多人喜欢直接定义 ivar 当全局变量用,然后命名还不加 _,这代码看着我就懵逼了。。。习惯不是 self.property 就是 _property 的,看到一个单独的 property 根本反应不过来。。。

@ibireme

This comment has been minimized.

Show comment
Hide comment
@ibireme

ibireme Jan 14, 2016

Owner

额。。你说的这种。。在 self 的代码里直接访问 self 的 ivar,那也是编译后通过地址偏移访问的。。self.property 比直接访问 _property 多了个函数调用,但实际性能都很高不用担心。

用哪种得看具体场景和项目的代码风格习惯了,但命名不加下划线这个真是很够呛。。

Owner

ibireme commented Jan 14, 2016

额。。你说的这种。。在 self 的代码里直接访问 self 的 ivar,那也是编译后通过地址偏移访问的。。self.property 比直接访问 _property 多了个函数调用,但实际性能都很高不用担心。

用哪种得看具体场景和项目的代码风格习惯了,但命名不加下划线这个真是很够呛。。

@skyline75489

This comment has been minimized.

Show comment
Hide comment
@skyline75489

skyline75489 Jan 14, 2016

Contributor

可能好多人是 C++/Java 过来的吧,习惯这么写。然后常量,枚举,宏什么的命名也不规范,搞得看到一个变量基本没办法一眼看出是什么东西,简直神坑

Contributor

skyline75489 commented Jan 14, 2016

可能好多人是 C++/Java 过来的吧,习惯这么写。然后常量,枚举,宏什么的命名也不规范,搞得看到一个变量基本没办法一眼看出是什么东西,简直神坑

@skyline75489

This comment has been minimized.

Show comment
Hide comment
@skyline75489

skyline75489 Jan 14, 2016

Contributor

唯一能区分的是语法高亮的颜色 😅

Contributor

skyline75489 commented Jan 14, 2016

唯一能区分的是语法高亮的颜色 😅

@ibireme ibireme closed this Feb 24, 2016

@alfredcc

This comment has been minimized.

Show comment
Hide comment
@alfredcc

alfredcc Mar 27, 2018

@ibireme 还是不太理解你说的 getter/setter 比直接调用 ivar 性能高。就像你说的“self.property 比直接访问 _property 多了个函数调用” 多调用getIvar 不是还会调到 ivar 吗?

- (NSString *)getIvar {
  return _ivar;
}

alfredcc commented Mar 27, 2018

@ibireme 还是不太理解你说的 getter/setter 比直接调用 ivar 性能高。就像你说的“self.property 比直接访问 _property 多了个函数调用” 多调用getIvar 不是还会调到 ivar 吗?

- (NSString *)getIvar {
  return _ivar;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment