C#性能优化黑科技(二)【反射】批量实例化对象的快速方法
来源:互联网 发布:体检数据 编辑:程序博客网 时间:2024/06/05 01:00
在实际开发中,我们有时候会遇到这样的问题,我们知道某一个类的Type,如何实例化这个对象?
答案很简单:
object obj = Activator.CreateInstance(type);
但是如果是需要批量实例化对象(例如读取自定义格式的配置文件),这种方法在效率和GC上都不太理想。(Mono2.0)
我注意到System.Object有一个方法,叫做MemberwiseClone,但是它是protected的,也就是只有衍生类在内部才能访问。那我们只有用反射把它拿出来:
object obj = Activator.CreateInstance(type);MethodInfo mcMi = type.GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance);List<object> list = new List<object>(100);for (int i = 0; i < 100; i++){ list.Add(mcMi.Invoke(obj, null));}
减少了些许GC,效率提升了一倍多。
还有更进一步的方法,效率上可以提升很多。就是我在上一篇(C#性能优化黑科技(一)【反射】修改属性的快速方法)提到的方法CreateDelegate:
object obj = Activator.CreateInstance(type);MethodInfo mcMi = typeof(object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance);Func<object, object> mcAct = Delegate.CreateDelegate(typeof(Func<object,object>), mcMi) as Func<object, object>;List<object> list = new List<object>(100);for (int i = 0; i < 100; i++){ list.Add(mcAct(obj));}
数据量较大的时候,效率可以提升10倍左右,因为Func<object, object>直接调用的就是MemberwiseClone这个方法,省去了MethodInfo.Invoke调用过程中参数类型获取和检查等操作。不过GC还是一样的。
阅读全文
0 0
- C#性能优化黑科技(二)【反射】批量实例化对象的快速方法
- C#性能优化黑科技(一)【反射】修改属性的快速方法
- C++的黑科技(深入探索C++对象模型)
- Oracle压缩黑科技(二)--压缩数据的修改
- MySQL批量插入性能优化(二)
- c#中用反射的方式实例化对象
- C#实例化一个对象的方法
- 魔力手环,黑科技的矩阵快速幂优化(n3变n2)规律吗,只要愿找,总还是有的!
- C#反射的学习(二)--访问字段、属性、方法
- 矩阵快速幂 黑科技
- (104)反射:获取Class的对象、构造函数、字段、方法。反射实例练习
- 优化反射性能的总结(上)
- 优化反射性能的总结(中)
- 优化反射性能的总结(下)
- 优化反射性能的总结(中)
- 优化反射性能的总结(下)
- 优化反射性能的总结(上)
- 优化反射性能的总结(中)
- Unity Shader学习笔记:凹凸映射
- csu 1005 BST(二叉排序树水题)
- Linux中slab的使用方法实例
- c++ 使用throw抛出异常
- 【微信】微信消息定时推送
- C#性能优化黑科技(二)【反射】批量实例化对象的快速方法
- contiki之list(2)
- TP5验证码点击刷新与验证
- oracle 自定义类型 type / create type
- 树链剖分详解及其模板题
- IBM RATIONAL BUILDFORGE入门
- iOS reason: 'invalid nib registered for identifier (GroupMustKnowViewCell)
- 集群间实现Session共享
- 高德地图开发-- 自定义图标