好的,我们都知道Reflecttion比"newing“类实例的性能要差很多次,而且在很多情况下,这取决于应用程序的需求。
问题:我们如何使用延迟绑定(反射)策略创建高性能的.NET类。
我有一个现有的要求,要求使用反射(CreateInstance)创建类实例,但性能至关重要。在我的情况下,我正在为我们的应用程序中的每一条短信创建实例。在生产过程中,每天很容易超过一百万。
我想听听并分享一些关于如何在不直接引用代码中的类的情况下创建.NET类的想法,例如使用反射。我还在想,是否有一种方法可以缓存类工厂,从而提高“创建”时间
发布于 2009-07-10 14:01:48
每天一百万并不多;我只使用Activator.CreateInstance
(使用Activator.CreatInstance(Type)
的快速测试表明,在我的低端笔记本电脑上,它可以在~2秒内从Type
中创建100万个对象)。
关于快速创建对象的思考:
: new()
约束(零努力)DynamicMethod
并编写IL (不困难)new
方法的实现(不需要外部: new()
约束)如下所示:ObjectFactory.cs
。
有关IL示例,请参见脱衣舞网和il.Emit(OpCodes.Newobj, ...)
发布于 2009-07-10 14:01:41
我不认为每天一百万对一个简单的反射电话来说是太多的。我相信您正在进行过度优化,但正如您所说的,只需使用单个Activator.CreateInstance
调用创建一个工厂类并缓存该调用即可。将使用返回对象上的CreateInstance()
方法调用来创建实际实例。
public interface IClassFactory {
IClass CreateInstance();
}
public interface IClass {
// your actual class interface.
}
public class DefaultClassFactory : IClassFactory {
public IClass CreateInstance() {
return new DefaultClass(); // the implementation class
}
}
在某个地方,您将有一个类型为static
的IClassFactory
字段,您将使用DefaultClassFactory
或配置文件中指定的任何其他类的实例设置该字段一次。
发布于 2009-07-10 14:03:46
一些想法:
在Dictionary<string,Type>
或Dictionary<string,object>
中缓存要克隆的实例或类型。
https://stackoverflow.com/questions/1112194
复制