写点什么

寻找性能更优秀的动态 Getter 和 Setter 方案

用户头像
newbe36524
关注
发布于: 2020 年 11 月 08 日

反射获取 PropertyInfo 可以对对象的属性值进行读取或者写入,但是这样性能不好。所以,我们需要更快的方案。


方案说明


就是用表达式编译一个 Action<TObj,TValue> 作为 Setter,编译一个 Func<TObj,TValue> 作为 Getter。


然后把这些编译好的委托放在一个泛型类的静态字段中保存起来,需要使用的时候从这里面查找就可以了。


知识要点


  1. 使用表达式创建委托

  2. 泛型类的静态字段是每个闭合类型独立的,因此用于存储和类型相关的内容非常方便


实现代码


由于代码中混合的使用 Switch 作为字典的阴招,所以代码很长,此处不再罗列,仅给出链接:



基准测试


BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19041.572 (2004/?/20H1)Intel Xeon CPU E5-2678 v3 2.50GHz, 1 CPU, 24 logical and 12 physical cores.NET Core SDK=5.0.100-rc.2.20479.15  [Host]       : .NET Core 2.1.23 (CoreCLR 4.6.29321.03, CoreFX 4.6.29321.01), X64 RyuJIT  net461       : .NET Framework 4.8 (4.8.4250.0), X64 RyuJIT  net48        : .NET Framework 4.8 (4.8.4250.0), X64 RyuJIT  netcoreapp21 : .NET Core 2.1.23 (CoreCLR 4.6.29321.03, CoreFX 4.6.29321.01), X64 RyuJIT  netcoreapp31 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT  netcoreapp5  : .NET Core 5.0.0 (CoreCLR 5.0.20.47505, CoreFX 5.0.20.47505), X64 RyuJIT
复制代码

结论


  1. 使用委托明显比使用 PropertyInfo 要快,这个方案可以。

  2. Framework 真拉胯,Net 5 简直太强了。

  3. 如果属性是明确的,建议把字典中取出来的委托保存在自己的上下文,这可以明显的省去查找的消耗。


图表


从左往右分别是:直接读取属性、缓存委托、不缓存委托和使用 PropertyInfo。




总结


使用表达式创建委托来取代 PropertyInfo 读取和写入属性效果很好。


开发者也可以直接引用 Newbe.ObjectVisitor 包来使用已经封装好的 ValueGetter 和 ValueSetter。


我只是知识的搬运工



发布说明



使用样例



番外分享



GitHub 项目地址:https://github.com/newbe36524/Newbe.ObjectVisitor


Gitee 项目地址:https://gitee.com/yks/Newbe.ObjectVisitor



发布于: 2020 年 11 月 08 日阅读数: 33
用户头像

newbe36524

关注

开源项目作者,独立博客维护者 2020.06.02 加入

newbe36524 是一名开发工程师。newbe 是 newbe36524 的个人技术博客。秉承 now everyone will be excellent 的 slogan 希望为开发者们分享自己的开发经验和心路历程。

评论

发布
暂无评论
寻找性能更优秀的动态 Getter 和 Setter 方案