问题描述
好了,大家都知道Reflecttion是很多的时间比newing一个类的实例,更少的高性能,而且在许多情况下,这是蛮好根据不同的应用需求。
Ok, so we all know Reflecttion is many time less performant than "newing" a class instance, and in many cases this is just fine depending on the application requirements.
问:我们怎样才能创建一个使用后期绑定(反射)策略高性能的.NET类的
QUESTION: How can we create high performance .NET classes using a late binding (Reflection) strategy.
我有一个现有的要求,即要求使用反射(的CreateInstance)来创建类的实例,但性能是至关重要的。在我的情况,我为我们的应用程序每一个接收到的SMS消息创建实例。在生产过程中这很容易被每天超过一百万。
I have an existing requirement that demands class instances be created using reflection (CreateInstance), but performance is critical. In my situation I am creating instances for every incoming SMS Message in our application. During production this could easily be over a million per day.
我想听到和分享如何创建.NET类的一些想法,而不用直接引用在code类,例如使用反射。我也在想,如果有一种方法以某种方式缓存类工厂,可以提高创世纪的时间
I would like to hear and share some ideas on how to create .NET classes without directly referencing the classes in code, for example using Reflection. I was also thinking if there is a way to somehow cache a class Factory that can improve the "Creation" time
推荐答案
100万天也不是很多;我只是用 Activator.CreateInstance
(快速测试使用 Activator.CreatInstance(类型)
显示我的弱旅笔记本电脑可以从创建1M对象键入
在约2秒)。
1 million a day is not a lot; I'd just use Activator.CreateInstance
(a quick test using Activator.CreatInstance(Type)
shows that on my lowly laptop it can create 1M objects from aType
in ~2s).
在快速创建对象的思考:
Thoughts on creating objects quickly:
- 使用泛型和
:新的()
约束(零努力) - 使用
DynamicMethod的
,写的IL(不硬)
- use generics and the
: new()
constraint (zero effort) - use
DynamicMethod
and write the IL (not hard)
在新
办法的实施(而不需要:新的()
约束外),如下所示: ObjectFactory.cs
。
An implementation of the new
approach (without needing the : new()
constraint externally) is shown here: ObjectFactory.cs
.
对于IL例如,看到的和 il.Emit(欧普codes.Newobj,...)
For an IL example, see dapper-dot-net and il.Emit(OpCodes.Newobj, ...)
这篇关于如何使用反射创建高性能.NET类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!