在Windows CE中更快地创建对象实例:优于反射的方法

7
所以在阅读了一篇描述如何比反射更快地创建对象实例的文章后,我非常兴奋,因为我的代码中目前有相当多的反射。不幸的是,在Windows CE中不支持DynamicMethodILGenerator编辑Activator在Windows CE中受支持。
我想知道是否有人知道在CE中比反射更快地创建对象实例的方法。如果没有,也许有人可以解释一下为什么Windows CE不支持这个功能,以及是否有任何解决方法来获得这个功能。即使我必须编写自己的DynamicMethodILGenerator类,这也可能值得一试 :)

这要看情况。请提供更多细节。 - SLaks
基本上,从任何给定的 System.Type,我希望能够尽快创建该类型的实例。 - Ian Dallas
你创建了多少个对象实例?顺便说一下,我也写过同样的技术(http://www.matlus.com/high-performance-class-factory/),并在框架级别上使用它,但坦白地说,除非你在紧密循环中创建数十万个对象,否则你不会看到任何性能提升。还要注意,如果你只使用默认构造函数,那么它已经被框架高度优化了。 - Shiv Kumar
2个回答

2

首先,Activator得到支持。请看这里的文档

话虽如此,如果你打算创建给定类型的多个实例,它并不是最快的。在经过多种构建对象的不同方式测试后,在OpenNETCF.IoC框架中,我在每种类型的基础上缓存了ConstructorInfo(具体在ObjectFactory类中),并且用于对象创建。是的,第一次需要使用反射来获取CI,但由于已经有委托,因此后续调用非常快速。


1
根据您的设计,您可能能够创建一组(编译时)实例化委托(可以存储在静态类中)。
例如:
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>>中,尽管会因为类型转换而变得不太高效。
你仍然需要填充字典。


这是可能的,但在一个大型应用程序/框架中,它似乎会变得笨重,而这恰恰是我所面对的问题。字典的大小将变得过于庞大,新类型也不容易支持。 - Ian Dallas
@tkeE:你能只存储最常用的类型吗? - SLaks
这是一种可能性,但出于上述原因并不完全理想。很难确定哪些是最常用的,因为这是一个将被许多系统使用的框架。 - Ian Dallas
我不确定你还有什么其他选择;我从未使用过 .Net CF。 - SLaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接