我一直在阅读很多关于发射以及它如何比反射快得多的信息,但一直无法找出原因。我知道 emit 正在注入 IL 代码,但是为什么在进行像 ORM 这样的属性映射时这比反射快?
参考这种用例: Emit mapper vs valueinjecter or automapper performance
我一直在阅读很多关于发射以及它如何比反射快得多的信息,但一直无法找出原因。我知道 emit 正在注入 IL 代码,但是为什么在进行像 ORM 这样的属性映射时这比反射快?
参考这种用例: Emit mapper vs valueinjecter or automapper performance
反射使用通用代码和元数据来执行其操作。反射调用通常会进行大量运行时检查,例如,如果您要访问的属性确实属于您提供的对象的类型。或者您要传递给方法的参数与签名兼容。当然还有很多装箱和拆箱,因为一切都被视为一个对象。
另一方面,反射发射专门为您要执行的任务生成代码,在编译过程中只检查一次很多事情,然后将与您在源代码中编写的每个代码一样快地执行。
动态生成代码显然有相当多的开销,但如果您只执行一次然后多次使用此代码,从长远来看会更快。正则表达式也是如此。您可以只使用它们,并且您的表达式基本上将在操作期间被解释,但是如果您必须多次使用相同的表达式,您可以指定编译选项,并且库将生成针对您的表达式量身定制的代码,然后您可以直接执行它而无需每次都需要解释表达式。
所以本质上反射就像解释代码,反射发射(就像)编译它。