我正在开发一个发出IL代码的编译器。重要的是,由Mono和Microsoft .NET JIT编译器将生成的IL JIT发送到最快的机器代码。
我的问题是:
优化模式是否有意义:
'stloc.0; ldloc.0; ret' => 'ret'
'ldc.i4.0; conv.r8' => 'ldc.r8.0'
等等,或JIT的智能足以照顾这些?
是否有Microsoft / Mono JIT编译器执行优化列表的规范?
是否有任何良好的读物与实用建议/最佳实践来优化IL,以便JIT编译器可以反过来生成最佳的机器代码(性能方面)?
答案 0 :(得分:5)
MyStruct s; s.x = 1; s.x = 1;
。 s = s;
也不是。s.x + s.x
。 {{1}}从内存加载x两次。期待很少。答案 1 :(得分:5)
冗余转换和加载/存储是一个非常不可避免的递归正确解析器的副作用。你可以通过窥视优化器在技术上摆脱它们。但是没什么可担心的,C#和VB.NET编译器也会生成它们。
现有的.NET / Mono抖动非常适合优化它们。他们专注于优化真正对执行速度和机器代码至关重要的代码。编写生成IL的编译器的任何人都可以自动从这些优化中受益,而无需做任何特殊的事情。
抖动优化包含在this post中。