首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用反射创建高性能.NET类?

如何使用反射创建高性能.NET类?
EN

Stack Overflow用户
提问于 2009-07-10 21:57:43
回答 5查看 7K关注 0票数 10

好的,我们都知道Reflecttion比"newing“类实例的性能要差很多次,而且在很多情况下,这取决于应用程序的需求。

问题:我们如何使用延迟绑定(反射)策略创建高性能的.NET类。

我有一个现有的要求,要求使用反射(CreateInstance)创建类实例,但性能至关重要。在我的情况下,我正在为我们的应用程序中的每一条短信创建实例。在生产过程中,每天很容易超过一百万。

我想听听并分享一些关于如何在不直接引用代码中的类的情况下创建.NET类的想法,例如使用反射。我还在想,是否有一种方法可以缓存类工厂,从而提高“创建”时间

EN

回答 5

Stack Overflow用户

发布于 2009-07-10 22:01:48

每天一百万并不多;我只使用Activator.CreateInstance (使用Activator.CreatInstance(Type)的快速测试表明,在我的低端笔记本电脑上,它可以在~2秒内从Type中创建100万个对象)。

关于快速创建对象的思考:

  • 使用泛型和: new()约束(零努力)
  • 使用DynamicMethod并编写IL (不困难)

new方法的实现(不需要外部: new()约束)如下所示:ObjectFactory.cs

有关IL示例,请参见脱衣舞网il.Emit(OpCodes.Newobj, ...)

票数 12
EN

Stack Overflow用户

发布于 2009-07-10 22:01:41

我不认为每天一百万对一个简单的反射电话来说是太多的。我相信您正在进行过度优化,但正如您所说的,只需使用单个Activator.CreateInstance调用创建一个工厂类并缓存该调用即可。将使用返回对象上的CreateInstance()方法调用来创建实际实例。

代码语言:javascript
运行
复制
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
    }
}

在某个地方,您将有一个类型为staticIClassFactory字段,您将使用DefaultClassFactory或配置文件中指定的任何其他类的实例设置该字段一次。

票数 6
EN

Stack Overflow用户

发布于 2009-07-10 22:03:46

一些想法:

  • 当你发现需要的时候,保持每个类的一个实例。然后,代替CreateInstance,克隆它。
  • 创建第一个实例后,保持实例的类型。然后使用Activator.CreateInstance(类型)

Dictionary<string,Type>Dictionary<string,object>中缓存要克隆的实例或类型。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1112194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档