JIT编译器的IL优化

Den*_*voy 13 .net c# il jit

我正在开发一个发出IL代码的编译器.重要的是,由Mono和Microsoft .NET JIT编译器对生成的IL进行JIT,以获得最快的机器代码.

我的问题是:

  1. 优化模式是否有意义:

    'stloc.0; ldloc.0; ret' => 'ret' 
    'ldc.i4.0; conv.r8' => 'ldc.r8.0'
    
    Run Code Online (Sandbox Code Playgroud)

    等等,或JIT是否足够聪明,可以照顾这些?

  2. 是否有Microsoft/Mono JIT编译器执行的优化列表的规范?

  3. 是否有任何良好的读物与实际建议/最佳实践来优化IL,以便JIT编译器可以反过来生成最佳的机器代码(性能方面)?

usr*_*usr 5

  1. 你描述的两个模式是JIT实际上正确的东西(除了非原始结构).在SSA形式中,恒定传播和消除死值非常容易.
  2. 不,你必须测试JIT可以做什么.查看编译器文献,了解期望的标准优化.然后,测试它们.我们现在拥有的两个JIT非常少,有时甚至没有得到最基本的东西.例如,MyStruct s; s.x = 1; s.x = 1;RyuJIT没有优化.s = s;也不是.s.x + s.x从内存加载x两次.期待很少.
  3. 您需要了解基本操作映射到的机器代码.这不是太复杂.尝试一些事情,看看反汇编列表.您将很快了解输出的外观.


Han*_*ant 5

像这样的冗余转换和加载/存储是递归正常解析器的相当不可避免的副作用.你可以通过窥视优化器在技术上摆脱它们.但是没有什么可担心的,C#和VB.NET编译器也会生成它们.

现有的.NET/Mono抖动非常适合优化它们.他们专注于优化的代码真正重要的执行速度,机器代码.有了非常好的优势,任何编写生成IL的编译器的人都可以自动从这些优化中受益,而无需做任何特别的事情.

抖动优化覆盖在这个职位.