在 Windows CE 中创建对象实例比反射更快

Posted

技术标签:

【中文标题】在 Windows CE 中创建对象实例比反射更快【英文标题】:Creating Object Instances Faster Than Reflection in Windows CE 【发布时间】:2011-07-06 02:06:29 【问题描述】:

所以在看了一篇描述如何Create Object Instances Faster Than Reflection 的文章后,我真的很兴奋,因为在我的代码中我目前有很多反思。不幸的是,Windows CE 不支持DynamicMethodILGenerator编辑:Windows CE 支持Activator

我想知道是否有人知道在 CE 中创建对象实例的速度比反射更快的方法。如果没有,也许有人可以解释为什么 Windows CE 不支持此功能,以及是否有任何变通方法可以在 CE 中获得此功能。即使我必须编写自己的 DynamicMethodILGenerator 类,它也可能是值得的 :)

【问题讨论】:

视情况而定。请提供更多详细信息。 基本上从任何给定的 System.Type,我希望能够尽快创建该类型的实例。 您要创建多少个对象实例?仅供参考:我已经写过相同的技术 (matlus.com/high-performance-class-factory) 并在框架级别使用它,但坦率地说,除非您在紧密循环中创建数十万个对象,否则您不会看到任何性能改进。还要注意,如果您只使用默认构造函数,那么框架会对其进行高度优化。 【参考方案1】:

首先,支持激活器。看看the docs here。

也就是说,这并不是地球上最快的事情,尤其是如果您打算创建多个给定类型的实例。在对构建对象的不同方法进行大量测试之后,我在OpenNETCF.IoC framework 中所做的是基于每种类型(特别是在ObjectFactory class 中)缓存 ConstructorInfo 并将其用于对象创建。是的,您必须在第一次使用反射来获取 CI,但随后的调用非常快,因为您已经获得了委托。

【讨论】:

【参考方案2】:

根据您的设计,您可能能够创建一组(编译时)实例化委托(您可以store in a static class)。

例如:

static class Factory<T> 
    public Func<T> Creator  get; set; 


var instance = Factory<TSomething>.Creator();

//Elsewhere
Factory<SomeClass>.Creator = () => new SomeClass();

这只有在您可以提前使用相关类型填充工厂时才会有所帮助。


如果您只有一个Type(与通用参数相反),您可以将委托存储在Dictionary&lt;Type, Func&lt;object&gt;&gt; 中,尽管由于强制转换,效率会降低。 您仍然需要填充字典。

【讨论】:

这是一种可能性,但它似乎在大型应用程序/框架中会变得笨拙,不幸的是,这正是我正在处理的问题。字典的大小会变得太大,新的类型不容易支持。 @tkeE:你能只存储最常用的类型吗? 这是一种可能性,但由于上述原因并不完全可取。很难确切知道什么是最常用的,因为这是一个将被许多系统使用的框架。 我不确定您还有什么其他选择;我从未使用过 .Net CF。

以上是关于在 Windows CE 中创建对象实例比反射更快的主要内容,如果未能解决你的问题,请参考以下文章

java中创建对象的方法

在 .NET 中创建对象的几种方式的对比

Java面试进阶部分集合

在 NUnit 测试中创建应用程序域的异常

004-诠释 Java 工程师

在 Unity 中创建后引用实例化对象