Literacy快速反射读写对象属性,字段
Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多
当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但不能提高性能,反而会使性能下降,所以使用场合需要自己把握
下面是在我的电脑上做的一些测试(因机器配置不同会有少许误差)
测试次数 | Literacy | 反射 |
10 | 16ms | 0ms |
100 | 15ms | 0ms |
1K | 16ms | 5ms |
1W | 16ms | 50ms |
10W | 23ms | 505ms |
100W | 87ms | 5149ms |
示例代码:
static void Main(string[] args) { User u = new User(); CodeTimer.Initialize(); CodeTimer.Time("MethodInfo", 1000000, () => GetName2(u)); CodeTimer.Time("Literacy", 1000000, () => GetName(u)); CodeTimer.Time("dynamic", 1000000, () => GetName3(u)); } static ObjectProperty prop; public static object GetName(object obj) { if (obj == null) throw new ArgumentNullException("obj"); if (prop == null) { prop = new Literacy(obj.GetType()).Property["Name"]; if (prop == null) throw new NotSupportedException("对象不包含Name属性"); } return prop.GetValue(obj); } static MethodInfo getName; public static object GetName2(object obj) { if (obj == null) throw new ArgumentNullException("obj"); if (getName == null) { getName = obj.GetType().GetProperty("Name").GetGetMethod(); } return getName.Invoke(obj, null); //缓存了反射Name属性 } public static object GetName3(object obj) { if (obj == null) throw new ArgumentNullException("obj"); return ((dynamic)obj).Name; }
评论