为什么反射在计算上很昂贵?

时间:2013-05-12 10:58:01

标签: c# .net clr

显然,反思是一个非常广泛的主题,但让我们举一个简单的例子:"""运算符(A是B)。它实际上需要CLR做什么?要查看程序集的元数据,找到类型A,向上遍历其继承层次结构,看看B是否在某处。

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

那么是什么使得反思(我的意思是简单的运算符,例如""或"")")相对昂贵?

2 个答案:

答案 0 :(得分:3)

运算符与检索类的类型一样昂贵。最重要的区别是 时会产生成本。对于运算符,当JIT编译器在编译代码时从程序集中检索元数据时会发生这种情况。在执行代码之前会发生这种情况,因此很可能是您在分析时未观察到的成本。或者忽略不可避免的开销,它是。一旦完成,在循环中使用 非常便宜,因为抖动已将指针值编译到类型的方法表(也称为“类型句柄”)直接进入机器代码。无需再次查找类型。

不是反射的情况,它不会预先运行。您将测量在磁盘上查找程序集的成本以及页面在执行它时从程序集文件中的元数据页面出错。这可能是相当大的,磁盘很慢。然后再次找回元数据缓存槽的成本。

答案 1 :(得分:0)