为什么反射在计算上是昂贵的

本文关键字:反射 计算 为什么 | 更新日期: 2023-09-27 18:13:15

显然反射是一个非常广泛的主题,但让我们举一个简单的例子:"是"操作符(a是B)。它实际上需要CLR做什么?要查看程序集的元数据,找到类型A,沿着它的继承层次结构向上走,看看B是否在那里的某个地方。

现在,这不都是CLR的标准工作吗?我的意思是,CLR在运行时一直在非反射代码中进行类型检查。当你调用方法或给参数赋值时,CLR必须在运行时检查被赋值对象的类型是否与其指定的形参或变量匹配。

那么,是什么使得反射(我指的是简单的操作符,如"is"或"as")相对昂贵呢?

为什么反射在计算上是昂贵的

is操作符的开销与检索类的Type一样大。当发生成本时,最大的区别是。对于is操作符,当JIT编译器在编译代码时从程序集中检索元数据时,就会发生这种情况。它在执行代码之前发生,因此很可能是您在进行概要分析时没有观察到的成本。或者认为这是不可避免的开销。一旦这样做了,在循环中使用is是非常便宜的,因为抖动已经将指向类型方法表的指针值(又名"类型句柄")直接编译到机器码中。不需要再查找类型

对于Reflection来说不是这样,它不会在前面运行。您将度量在磁盘上查找程序集的成本,以及在执行程序集文件时从该程序集文件中调入元数据的页面错误。这可能是相当大的,磁盘很慢。然后再重新找到元数据缓存槽的成本

覆盖区域:

  • (为什么)反射在。net中如此昂贵吗?
  • 什么是"成本"?.NET反射?
  • .NET反射有多昂贵?

…还有其他人