在 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 不支持DynamicMethod
和ILGenerator
。 编辑:Windows CE 支持Activator
我想知道是否有人知道在 CE 中创建对象实例的速度比反射更快的方法。如果没有,也许有人可以解释为什么 Windows CE 不支持此功能,以及是否有任何变通方法可以在 CE 中获得此功能。即使我必须编写自己的 DynamicMethod
和 ILGenerator
类,它也可能是值得的 :)
【问题讨论】:
视情况而定。请提供更多详细信息。 基本上从任何给定的 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<Type, Func<object>>
中,尽管由于强制转换,效率会降低。
您仍然需要填充字典。
【讨论】:
这是一种可能性,但它似乎在大型应用程序/框架中会变得笨拙,不幸的是,这正是我正在处理的问题。字典的大小会变得太大,新的类型不容易支持。 @tkeE:你能只存储最常用的类型吗? 这是一种可能性,但由于上述原因并不完全可取。很难确切知道什么是最常用的,因为这是一个将被许多系统使用的框架。 我不确定您还有什么其他选择;我从未使用过 .Net CF。以上是关于在 Windows CE 中创建对象实例比反射更快的主要内容,如果未能解决你的问题,请参考以下文章