C# 什么表现更差:反射还是拳击?

C# 什么表现更差:反射还是拳击?,c#,.net,performance,reflection,boxing,C#,.net,Performance,Reflection,Boxing,我正在创建我自己的DI框架,作为一种学习练习创建代理工厂。我构建类型化委托的方法是使用表达式创建一个函数,该函数调用引用容器和任何构造函数参数的静态方法 这引发了一个关于值类型的有趣问题。哪一个性能最好: a) 使用反射选择具有正确参数数的静态泛型方法,然后使用MakeGenericMethod删除泛型 b) 选择老式的params Object[]并在拳击比赛中大受欢迎?IME,拳击时间与反射相比根本算不上什么。我猜反射速度会慢很多,可能是magintude的命令 不过,做板凳很容易,试一试并

我正在创建我自己的DI框架,作为一种学习练习创建代理工厂。我构建类型化委托的方法是使用表达式创建一个函数,该函数调用引用容器和任何构造函数参数的静态方法

这引发了一个关于值类型的有趣问题。哪一个性能最好:

a) 使用反射选择具有正确参数数的静态泛型方法,然后使用MakeGenericMethod删除泛型


b) 选择老式的params Object[]并在拳击比赛中大受欢迎?

IME,拳击时间与反射相比根本算不上什么。

我猜反射速度会慢很多,可能是magintude的命令


不过,做板凳很容易,试一试并发布结果:)

在这种情况下,拳击比反射快几个数量级


当然,您可以随时缓存反射结果。

如果必须处理一百万个项目,装箱每个项目的效率将低于不装箱处理它们的效率,但要比使用反射处理每个项目的类型快得多

另一方面,在许多场景中,通过在类型
T
上使用一次反射来构造一个对象,该对象可以不装箱地处理类型
T
的内容,然后在程序的生命周期中缓存该结果,就可以处理一些通用类型
T
的一百万项。这就是像
EqualityComparer.Default
这样的东西的工作原理。这种方法很容易比拳击每个项目快一个数量级以上。

一般来说,我会说,即使拳击速度较慢(在某种程度上不明显),这也是正确的方法。反射是一种促进某种元编程的工具——当您必须对代码本身做一些工作时,而不是为了促进应用程序的业务逻辑,因此您不应该在没有充分理由的情况下使用它。程序员应该首先从物理领域思考。也就是说,在你的情况下,这可能并不重要,因为你已经按照我认为的方式去做了。使用
object
仍然可以在一定程度上保证编译时的安全性和更好的维护

正如其他人所说,这里的反射速度较慢(除非您不缓存)。拳击的另一个好处是,在处理反射时,你很可能是在拳击。反射API总是处理
对象
,因此如果要返回某个实例值,则必须取消绑定。类似地,如果没有类型参数,而只有实例,则可能必须这样做


但更好的选择是依赖泛型。一些不错的模式很详细

为什么这个“学习练习”不涉及分析各种设置以找到最佳解决方案?;-)尽管如此,我还是会给出一个+1。c)使用泛型参数重载?不太可能,表达式。调用需要MethodInfo,因此您必须先选择正确类型的正确方法。哪一个更慢是无关紧要的。相关的问题是,它们中的任何一个对于您的应用程序是否足够快?如果两种方法都不够快,无法满足应用程序的需要,那么知道哪种方法较慢也无济于事。如果结果表明两者都足够快,那么知道哪一个慢在很大程度上是无关紧要的。@Eric Lippert感谢您的评论,我认为我的标题太负面了,我更感兴趣的是扩展我对反射v拳击的性能影响的理解,以帮助我更好地理解CLR和C。不过,请记住,您仍然需要访问反射缓存,很可能是通过字典。如果一点装箱仍然比那些查找快,我不会感到惊讶——特别是如果涉及到字符串键(可能是这样,也可能不是这样)。