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

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

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

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

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

有帮助吗?

解决方案

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

一旦你 里面 加载类型的方法,是的:常规 GIT 等通常适用(请注意,安全检查可能会使事情变得 小的 如果部分受信任,则速度会慢一些,但不会太多)。

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

  • 如果您可以将对象强制转换为静态已知的接口或基类,那么它将是相同的。
  • 如果这是不可能的,但您可以将特定操作绑定到已知委托(例如 Func<string,int>, , 通过 Delegate.CreateDelegate),那么速度几乎一样快,但不太方便。
  • 如果你做的一切都是通过 DynamicInvoke(), ,它会很像糖蜜。
  • 在4.0中, dynamic 可能会提供一个中途之家,因为它提供了鸭子类型,并且每种类型都优化了缓存。

所以:你如何访问它?

其他提示

是,一旦被装入的性能是相同的。

反射的性能损失被绑定到从组件中的元数据的读出,但执行时间将是完全一样的。也就是说,一旦实例被创建,你必须对它的引用,它会表现为你(包括JIT编译和一切)任何其他类。

这取决于你如何使用反射。它总是慢一些,但你可以使时间差非常小,如果你使用IL发出创建在运行时的工厂方法。 如果您使用简单Activator.CreateInstance,这将是如此慢得多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top