开源框架:快速反射类库(Fast Ref…
来源:互联网 发布:盛世景 知乎 编辑:程序博客网 时间:2024/06/03 15:58
全文英文版:Fast Reflection Library
这是我在CodePlex上创建的一个项目,它的网址是http://www.codeplex.com/FastReflectionLib,使用MicrosoftPublic License(Ms-PL),您可以随意在自己的产品中使用它的全部或部分代码。这个项目用到了我在《方法的直接调用,反射调用与Lambda表达式调用》和《这下没理由嫌Eval的性能差了吧?》两篇文章里用到的做法,并加以提炼和扩展发布的项目——随便搞搞,留个印记,也供以后参考。
基本使用方式
反射是.NET中非常重要的功能。使用反射来构造对象、调用方法或是访问属性是某些项目中常用的做法之一(例如ORM框架)。众所周知,与一个成员的直接访问相比,反射调用的性能要低好几个数量级。FastReflectionLib提供了一种简便的方式,使一些常用反射调用的性能得到大幅提高。如下:
using System;using System.Reflection;usingFastReflectionLib;namespaceSimpleConsole{
直接使用各工作对象
各FastXxx方法实际上是将PropertyInfo等对象作为Key去一个Cache中获取对应的工作对象,然后调用工作对象上对应的方法。因此,直接调用工作对象可以获得更好的性能。各工作对象类型的对应关系如下:
•PropertyInfo:IPropertyAccessor
•MethodInfo:IMethodInvoker
•ConstructorInfo:IConstructorInvoker
•FieldInfo:IFieldAccessor
我们可以使用FastReflectionCaches.MethodInvokerCache来获取一个IMethodInvoker对象:
static void Execute(MethodInfo methodInfo, object instance, inttimes){
在FastReflectionLib中,已经提供了IPropertyAccessor等接口的默认实现。该实现将会构造一颗表达式树(ExpressionTree)并将其编译(调用其Compile方法)以获得一个与反射方法签名相同的委托对象。这是一种简单、通用而安全的实现,由于Compile方法使用了Emit,其性能也较为令人满意(可见下面的性能测试)。但是这并不是性能最高的做法,如果使用Emit生成最优化的代码,其性能甚至会高于方法的直接调用(例如DynamicReflectionLibrary)。如果您想使用更好的实现来替换,则可以自行构造一个工作对象接口的实现,并替换对应的Factory:
public class BetterPropertyAccessor :IPropertyAccessor{
在FastReflectionLib中使用基于System.Collections.Generic.Dictionary<TKey,TValue>类型编写的缓存容器。每次调用FastXxx扩展方法时,类库将从对应的缓存容器中获取工作对象。如果缓存容器中还没有所需的工作对象,那么它就会调用合适的Factory来构造新的工作对象。从下面的性能测试来看,许多时间是消耗在缓存查找上的,如果您有更好的缓存实现,可以使用以下的方法替换默认的缓存的容器:
public class BetterMethodInvokerCache
FastReflectionLib中通过PropertyInfo等对象作为Key,对PropertyAccessor等工作对象进行缓存。但是在某些场景下,您也可以选择合适的方式来自行缓存工作对象。与FastReflectionLib源码同时发布的CustomCache示例网站中包含了一个FastEval扩展,在某些场景下,我们可以使用这个更高效的方法来替换内置的Eval方法。这个示例的特点如下:
•使用对象的类型和属性名同时作为缓存的Key获取对应的PropertyAccessor对象
•使用PropertyAccessor获取“匿名对象”中的属性值
•缓存的作用域为特定页面,而不是整个AppDomain。
性能测试
FastReflectionLib源码中包含了一个性能测试项目,您可以从中看出FastReflectionLib对于反射的性能改进。摘录部分数据如下(测试在我的笔记本上运行,Release编译)。
执行以下方法:
public classTest{
调用方式 消耗时间(秒)
方法直接调用 0.0071397
内置反射调用 1.4936181
工作对象调用 0.0468326
Fast方法调用 0.1373712
- 开源框架:快速反射类库(Fast Ref…
- 开源框架:快速反射类库(Fast Reflection Library)
- 转 undefined ref…
- Android 快速开发框架 T…
- spring bean ref l…
- Android 开源框架ViewPageInd…
- Quartz 框架快速入门(三)&n…
- Quartz 框架快速入门(四)&n…
- 图论: spfa == Shortest Path Fast…
- 关于linux开机Fast TSC calibratio…
- 【原创】Python 反射 ex…
- Quartz 框架快速入门(一)
- Quartz 框架快速入门(二)
- afinal logoAndroid的快速开…
- PHP开源框架Yaf安装(Windows&nbsp…
- java 通过 反射机制得到 类名称
- Enabling Fast Incremental Backup
- 反射-框架、工具类
- c#用正则表达式判断字符串是否全是…
- C#中判断是否为数字(及一些好用的…
- asp.net DropDownList 选取选中事…
- 如何处理RadioButtonList中过长的…
- C#反射知识
- 开源框架:快速反射类库(Fast Ref…
- (收藏)C#开源资源大汇总
- .NET 软件版本号规定原则
- Code Review(代码复查)
- 正则表达式的基本语法
- 网络负载平衡的工作原理 负载均衡-…
- IBatisNet 开发指南系列文章更新
- 少用且有用的SQL语句【收藏】
- SQL Server 数据库使用备份还原造…