提高反射的调用性能
来源:互联网 发布:c语言求5个数平均值 编辑:程序博客网 时间:2024/06/05 16:33
都说Reflection的性能相当差,但是非用不可的时候也得用,下面是提高反射效率的一个办法。
要被反射调用的类都实现一个接口,调用的那个类引用这个接口,将反射得来的类都转换为这个接口,然后直接调用,没有必要所有的方法都反射。
公用的接口
要被反射调用的类都实现一个接口,调用的那个类引用这个接口,将反射得来的类都转换为这个接口,然后直接调用,没有必要所有的方法都反射。
公用的接口
代码: namespace CommonInterface
{
/**//// <summary>
/// 公用的接口
/// </summary>
public interface IFoo
{
string getName();
string Name{get;}
}
}
被反射调用的类{
/**//// <summary>
/// 公用的接口
/// </summary>
public interface IFoo
{
string getName();
string Name{get;}
}
}
代码: using CommonInterface;
namespace ClassLibOne
{
/**//// <summary>
/// Class1 的摘要说明。
/// </summary>
public class FooOne:IFoo
{
public FooOne()
{
}
public string getName()
{
return "FooOne";
}
public string Name
{
get
{
return "FooOne";
}
}
}
}
调用者类namespace ClassLibOne
{
/**//// <summary>
/// Class1 的摘要说明。
/// </summary>
public class FooOne:IFoo
{
public FooOne()
{
}
public string getName()
{
return "FooOne";
}
public string Name
{
get
{
return "FooOne";
}
}
}
}
代码: using System;
using System.Reflection;
using CommonInterface;
namespace ReflectionMain
{
/**//// <summary>
/// Class1 的摘要说明。
/// </summary>
public class ReflectionMain
{
delegate string DgetName();
/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//加载
Assembly assembly = Assembly.LoadFile("D:\\Project2003\\BankTest\\Reflection\\ReflectionTest\\ReflectionMain\\bin\\Debug\\ClassLibOne.dll");
Type type = assembly.GetType("ClassLibOne.FooOne");
ConstructorInfo conInfo = type.GetConstructor(new Type[]{});
object fooOne = conInfo.Invoke(new object[]{});
//反射调用
DateTime startR = DateTime.Now;
for(int i=0;i<100000;i++)
{
object rtn;
rtn = type.GetMethod("getName").Invoke(fooOne,new object[]{});
}
TimeSpan spanR = DateTime.Now - startR;
Console.WriteLine("反射调用100,000次:"+spanR.ToString());
//转换成接口后调用
DateTime startI = DateTime.Now;
for(int i=0;i<1000000;i++)
{
IFoo foo = (IFoo)fooOne;
foo.getName();
}
TimeSpan spanI = DateTime.Now - startI;
Console.WriteLine("转换成接口后调用1,000,000次:"+spanI.ToString());
//用委托调用
DateTime startDA = DateTime.Now;
IFoo fooo = (IFoo)fooOne;
DgetName dgn = new DgetName(fooo.getName);
for(int i=0;i<10000;i++)
{
IFoo foo = (IFoo)fooOne;
dgn += new DgetName(foo.getName);
}
TimeSpan spanDA = DateTime.Now - startDA;
Console.WriteLine("用委托调用__添加到委托10,000:"+spanDA.ToString());
DateTime startD = DateTime.Now;
dgn();
TimeSpan spanD = DateTime.Now - startD;
Console.WriteLine("用委托调用10,000:"+spanD.ToString());
Console.ReadLine();
}
}
}
输出结果是:
using System.Reflection;
using CommonInterface;
namespace ReflectionMain
{
/**//// <summary>
/// Class1 的摘要说明。
/// </summary>
public class ReflectionMain
{
delegate string DgetName();
/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//加载
Assembly assembly = Assembly.LoadFile("D:\\Project2003\\BankTest\\Reflection\\ReflectionTest\\ReflectionMain\\bin\\Debug\\ClassLibOne.dll");
Type type = assembly.GetType("ClassLibOne.FooOne");
ConstructorInfo conInfo = type.GetConstructor(new Type[]{});
object fooOne = conInfo.Invoke(new object[]{});
//反射调用
DateTime startR = DateTime.Now;
for(int i=0;i<100000;i++)
{
object rtn;
rtn = type.GetMethod("getName").Invoke(fooOne,new object[]{});
}
TimeSpan spanR = DateTime.Now - startR;
Console.WriteLine("反射调用100,000次:"+spanR.ToString());
//转换成接口后调用
DateTime startI = DateTime.Now;
for(int i=0;i<1000000;i++)
{
IFoo foo = (IFoo)fooOne;
foo.getName();
}
TimeSpan spanI = DateTime.Now - startI;
Console.WriteLine("转换成接口后调用1,000,000次:"+spanI.ToString());
//用委托调用
DateTime startDA = DateTime.Now;
IFoo fooo = (IFoo)fooOne;
DgetName dgn = new DgetName(fooo.getName);
for(int i=0;i<10000;i++)
{
IFoo foo = (IFoo)fooOne;
dgn += new DgetName(foo.getName);
}
TimeSpan spanDA = DateTime.Now - startDA;
Console.WriteLine("用委托调用__添加到委托10,000:"+spanDA.ToString());
DateTime startD = DateTime.Now;
dgn();
TimeSpan spanD = DateTime.Now - startD;
Console.WriteLine("用委托调用10,000:"+spanD.ToString());
Console.ReadLine();
}
}
}
- 提高反射的调用性能
- C#提高反射的调用性能
- 反射调用的性能对比
- 反射性能差,提高性能
- C#提高webService接口调用的性能
- 用反射进行方法调用的性能
- 反射调用性能比较
- 反射调用性能比较
- 反射调用性能比较
- 替代反射调用的几种方式及性能测试
- 替代反射调用的几种方式及性能测试
- JAVA反射机制(及反射调用的性能简测)
- 提高性能的技巧
- 提高性能的技巧
- 分页的性能提高
- 提高myeclipse的性能
- 提高myeclipse的性能
- 提高jQuery的性能
- Android提高第十四篇之探秘TelephonyManager
- Minicom
- 宽字符转为char *
- Url的DEC加密与解密
- Android提高第十五篇之ListView自适应实现表格
- 提高反射的调用性能
- 铁路股两天市值蒸发超376亿元 航空股集体上涨
- 简明 HTML CSS 开发规范 (转自“清清月儿”)
- Java 默认修饰符
- VMware虚拟机文件后缀详解【zz】
- 时隔两年,又回来做技术了
- Model Dialog with free JQuery User Interface
- v4l2 spec 中文 Ch01
- timer定时器