9

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

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

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

b) 选择老式的参数 Object[] 并接受拳击的打击?

4

5 回答 5

18

IME,装箱时间与反射相比算不了什么。

于 2010-02-12T22:05:21.167 回答
3

我猜想反射会慢很多,可能是数量级。

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

于 2010-02-12T22:15:04.123 回答
3

在这种情况下,装箱将比反射快几个数量级。

当然,您始终可以缓存反射结果。

于 2010-02-12T22:21:10.190 回答
2

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

正如其他人所说,反射在这里是较慢的(除非你不缓存)。拳击有利于拳击的另一件事是,在处理反射时,您很可能无论如何都是拳击。反射 API 总是处理object,所以如果你要取回一些实例值,你必须拆箱。类似地,如果您没有类型参数,而只有实例,则首先调用GetType值类型实例将它装箱。object

但更好的选择是依赖泛型。这里详细介绍了一些不错的模式

于 2013-06-10T09:59:01.527 回答
1

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

另一方面,在许多情况下,可以通过T在 type 上使用一次反射来处理一百万个某种泛型类型的项目T,以构造一个可以在没有装箱的情况下处理某种类型的对象,T然后将结果缓存到程序的生命。这就是事情的EqualityComparer<T>.Default运作方式。这种方法很容易比装箱每个项目快一个数量级以上。

于 2012-12-18T16:22:39.163 回答