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