.NET代码发布JIT的执行方式与本机代码相同

lys*_*cid 3 .net c# clr jit

.NET语言都编译为中间语言(MSIL).

据我所知,在执行期间(有时在其他阶段,我不完全了解 - NGEN),代码被JIT(从MSIL编译成实际的机器代码).

我想知道在JITting代码之后是否存在性能"惩罚"来自代码在CLR上执行的事实,或者代码是否与任何其他本机代码"相同"?

Ben*_*igt 5

有许多性能差异:

  1. 托管对象的免费存储实现为堆栈,而不是堆(大对象堆除外),并且开销低于大多数本机分配器使用的堆.但是之后您需要为垃圾收集和压缩付费.

  2. JIT可以内联一些AOT编译器必须离开虚拟的调用(即调用其他程序集).但AOT编译器可以花更多时间寻找优化机会.

  3. 从理论上讲,JIT可以使用运行代码的特定CPU(例如AVX)上的高级指令.尽管如此,仍然在等待实际上充分利用它们的JIT.

  4. AOT编译器可以使用分析数据来控制代码存储器的布局.JIT编译器几乎总是按照编译顺序将函数发送到内存中.