JIT编译器的IL优化

时间:2015-06-18 08:41:39

标签: c# .net jit il

我正在开发一个发出IL代码的编译器。重要的是,由Mono和Microsoft .NET JIT编译器将生成的IL JIT发送到最快的机器代码。

我的问题是:

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

    'stloc.0; ldloc.0; ret' => 'ret' 
    'ldc.i4.0; conv.r8' => 'ldc.r8.0'
    

    等等,或JIT的智能足以照顾这些?

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

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

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

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

抖动优化包含在this post中。