反射的性能差是一个公认的事实.而最耗性能的还是根据程序集获取要调用的对象,而在对象里搜索要调用的方法所耗性能到不不是很多,如果对象里的方法不是特别的多,而去可以指定相关参数提高搜索的效率,比如BindingFlags,Binder.
如果将对象的类型和方法属性进行一下存储,性能方法应该会得到改观.
简单的做了下测试:
classProgram
{
staticIDictionary<string,Type>typeList=newDictionary<string,Type>();
staticIDictionary<string,MethodInfo>methodList=newDictionary<string,MethodInfo>();
staticvoidMain(string[]args)
{
intiBegin=Environment.TickCount;
for(inti=0;i<1000;i++)
{
Test1("Test.TestClass,Test");
Test1("Test1.Class1,Test1");
}
Console.WriteLine("普通:{0}",Environment.TickCount-iBegin);
GC.Collect();
iBegin=Environment.TickCount;
for(inti=0;i<1000;i++)
{
Test2("Test.TestClass,Test");
Test2("Test1.Class1,Test1");
}
Console.WriteLine("存储Type:{0}",Environment.TickCount-iBegin);
GC.Collect();
iBegin=Environment.TickCount;
for(inti=0;i<1000;i++)
{
Test3("Test.TestClass,Test");
Test3("Test1.Class1,Test1");
}
Console.WriteLine("存储MethodInfo:{0}",Environment.TickCount-iBegin);
GC.Collect();
Console.ReadLine();
}
staticvoidTest1(stringtypeName)
{
Typetype=Type.GetType(typeName);
objectinstance=Activator.CreateInstance(type,1);
MethodInfomethodInfo=type.GetMethod("GetValue");
methodInfo.Invoke(instance,null);
instance=Activator.CreateInstance(type,null);
methodInfo=type.GetMethod("Add",newType[]{typeof(int),typeof(int)});
methodInfo.Invoke(instance,newobject[]{1,2});
}
//存储Type
staticvoidTest2(stringtypeName)
{
Typetype=GetType(typeName);
objectinstance=Activator.CreateInstance(type,1);
MethodInfomethodInfo=type.GetMethod("GetValue");
methodInfo.Invoke(instance,null);
instance=Activator.CreateInstance(type,null);
methodInfo=type.GetMethod("Add",newType[]{typeof(int),typeof(int)});
methodInfo.Invoke(instance,newobject[]{1,2});
}
//存储MethodInfo
staticvoidTest3(stringtypeName)
{
Typetype=GetType(typeName);
objectinstance=Activator.CreateInstance(type,1);
MethodInfomethodInfo=GetMethod(typeName,"GetValue",type,newType[0]);
methodInfo.Invoke(instance,null);
instance=Activator.CreateInstance(type,null);
methodInfo=GetMethod(typeName,"Add",type,newType[]{typeof(int),typeof(int)});
methodInfo.Invoke(instance,newobject[]{1,2});
}
staticTypeGetType(stringtypeName)
{
Typetype=null;
if(!typeList.ContainsKey(typeName))
{
type=Type.GetType(typeName);
typeList.Add(typeName,type);
}
else
type=typeList[typeName];
returntype;
}
staticMethodInfoGetMethod(stringtypeName,stringmethodName,Typetype,paramsType[]types)
{
MethodInfomethodInfo=null;
if(!methodList.ContainsKey(typeName+methodName))
{
methodInfo=type.GetMethod(methodName,types);
methodList.Add(typeName+methodName,methodInfo);
}
else
methodInfo=methodList[typeName+methodName];
returnmethodInfo;
}
}
其中 Test.TestClass 类和 Test1.Class1 都有一个无参构造函数和一个int类型的参数及2个方法:
intval=0;
publicClass1(intval)
{
this.val=val;
}
publicstringGetValue()
{
returnstring.Format("thevalueis{0}",val);
}
publicintAdd(inta,intb)
{
returna+b;
}
为了测试,上面2个类里都加了几个方法(只是定义,并没有具体的实现代码).
测试了下不进行任何处理,时间都在130左右波动,对Type进行存储,时间在32左右,基本上没什么波幅,而对Type和MethodInfo进行存储时间维持在31.
看来这样处理下对性能的改善还是起到了作用.
分享到:
相关推荐
使用反射和泛型,我们可以编写一个通用方法,接收`DataReader`和类型信息作为参数,然后逐行读取数据,利用反射实例化指定类型的对象并设置属性值。 示例代码可能如下: ```csharp public static T ...
.NET框架中的反射机制是开发人员在运行时探索和操作类型、方法、属性等对象的强大工具。然而,反射的使用往往伴随着性能损失,因为它的动态性质需要额外的开销。本文将深入探讨.NET反射机制的性能优化策略,并通过...
3. **序列化和反序列化**:反射可以帮助在运行时检查对象的结构,以便进行有效的序列化和反序列化操作。 4. **元编程**:编写自动生成代码或修改现有代码的工具,可以利用反射来分析现有的类型信息。 5. **日志和...
在.NET开发环境中,反射框架是一个强大的工具,它允许程序在运行时检查自身并动态操作类、接口、属性...尽管反射有时可能会带来性能开销,但在正确使用和适当优化的情况下,它能够极大地提升开发效率和软件的可维护性。
3. **反射机制**:在许多编程语言中(如Java和Python),反射是一种允许程序在运行时检查和操作自身结构的能力,包括类、对象、属性和方法等。通过反射,开发者可以动态地获取对象信息,这对于调试、元编程和插件...
Java反射API允许程序在运行时检查类、接口、字段和方法的信息,并能够动态创建对象、调用方法、改变字段值。在缓存管理中,反射机制可以用来动态地获取和操作对象,比如根据类名实例化对象,或者在缓存中查找或设置...
在.NET编程环境中,反射是一种强大的工具,它允许我们在运行时检查和操作程序集、类型、方法、属性等对象。在本篇文章中,我们将深入探讨如何使用反射将`DataRow`对象转换为自定义的实体类。`DataRow`是.NET中的一个...
在C++编程中,反射是一种高级特性,它允许程序在运行时检查自身,获取类型信息,并与对象的元数据进行交互。通常,静态类型的编程语言如C++在编译时就已经确定了类型信息,而反射则打破了这一限制,使得动态操作成为...
4. **反射**:Java反射机制允许在运行时检查类、接口、字段和方法的信息,并能够动态地创建对象和调用方法。这在框架设计、插件系统、元编程等场景下非常有用。反射API包括`java.lang.Class`、`java.lang.reflect....
- **2.4.3 使用类型化方法访问属性**:使用`GetXXX`类型化方法提高访问性能。 - **2.4.4 使用多数据集**:如果需要获取多个结果集,考虑使用`SqlDataAdapter.Fill`填充多个`DataTable`。 **2.5 DataSet** - **...
- **1.6.3 动态方法调用**:反射还可以用于动态调用方法,但在性能敏感的场合下应当避免使用。 **1.7 基本代码技巧** - **1.7.1 循环写法**:选择高效的循环结构。 - **1.7.2 拼装字符串**:使用`StringBuilder`而...
- **方法调用**:反射调用方法时,需要通过Method对象的invoke()方法,相比直接调用,它需要更多的字节码解析和安全性检查。 - **内存消耗**:反射API使用会增加额外的内存开销,因为需要存储和处理更多的对象。 ...
反射在Java中是一个强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。通过java.lang.Class类,我们可以获取任何类的信息,包括类名、方法、构造器等。java.lang....
泛型是Java 5引入的一项特性,它允许在类、接口和方法中定义类型参数,以提供更强的类型安全性和减少类型转换的必要。泛型的主要目标是消除运行时的类型检查和强制类型转换,提高代码的可读性和可维护性。例如,`...
2. **反射**:反射是Java的一种强大的动态类型功能,允许程序在运行时检查类、接口、字段和方法的信息,并能够动态地调用方法和访问属性。通过Class类、Constructor类、Method类和Field类,我们可以实现对Java对象的...
反射机制在Java编程语言中是一项强大的工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这个技术的核心概念是能够在运行时分析类的信息,并且能够动态地创建对象、调用方法以及访问和修改字段值。...
通过反射,我们可以动态地创建对象、调用方法、访问和修改字段值,甚至可以执行私有成员的操作。 在Java IOC中,反射API起着关键作用。Spring框架通过反射来实例化bean,并根据配置的依赖关系进行注入。例如,当...
为了实现持久化框架,需要对对象的通用属性和操作进行统一规划,具体包括: 1. **唯一标识**:每个对象都应具备一个全局唯一的标识符(ID),以区分不同对象。这个ID在不同数据库中可能有不同的表现形式。 2. **...