1

通过反射加载的类中代码的执行时间(运行时)性能是否与使用 new 关键字创建类时的相同代码相同?

我说是。但我正在与一位认为面向反射的代码总是较慢的同事讨论这个问题。

我的观点是,无论类最初是如何加载/创建的,性能都是相同的,因为 JIT 编译器并不关心类是如何加载的。

我对么?无论哪种方式,我都会感谢任何可以帮助澄清这一点的参考资料。

(注意:我不是在谈论使用反射与 new 关键字创建类的性能。我指的是类创建后方法中的实际代码。)

4

3 回答 3

1

这取决于你如何执行它;-p

一旦您进入了加载类型的方法,是的:常规 GIT 等通常适用(请注意,如果它是部分受信任的,安全检查可能会使事情变慢一点,但不多)。

但首先您需要在动态对象上调用一些代码:

  • 如果您可以将对象转换为静态已知的接口或基类,那么它将是相同的。
  • 如果这是不可能的,但您可以将特定操作绑定到已知的委托(例如Func<string,int>,通过Delegate.CreateDelegate),那么它几乎一样快,但不太方便。
  • 如果你通过 做所有事情DynamicInvoke(),它会非常像糖浆。
  • 在 4.0 中,dynamic可能会提供一个折中方案,因为它提供了鸭式打字,每种类型都有优化的缓存。

那么:您如何访问它?

于 2009-12-04T12:21:14.697 回答
1

是的,一旦加载,性能是相同的。

反射的性能损失与从程序集中读取元数据有关,但执行时间完全相同。也就是说,一旦创建了实例并且您拥有对它的引用,它将像您拥有的任何其他类一样运行(包括 JIT 编译和所有内容)。

于 2009-12-04T12:16:48.510 回答
0

这取决于您如何使用反射。它总是较慢,但是如果您使用 IL emit 在运行时创建工厂方法,则可以使时间差非常小。如果你使用简单的 Activator.CreateInstance,它会慢很多。

于 2009-12-04T12:17:43.837 回答