Literacy 快速反射读写对象属性,字段开源项目

我要开发同款
匿名用户2014年11月17日
96阅读
开发技术C#
所属分类常用工具包、程序开发
授权协议未知

作品详情

Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多

当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但不能提高性能,反而会使性能下降,所以使用场合需要自己把握

下面是在我的电脑上做的一些测试(因机器配置不同会有少许误差)

测试次数Literacy反射1016ms0ms10015ms0ms1K16ms5ms1W16ms50ms10W23ms505ms100W87ms5149ms

示例代码:

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;}
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论