【发布时间】:2015-09-03 19:15:18
【问题描述】:
我正在开发一个能发出 IL 代码的编译器。重要的是,生成的 IL 由 Mono 和 Microsoft .NET JIT 编译器 JIT 到最快的机器代码。
我的问题是:
-
优化以下模式是否有意义:
'stloc.0; ldloc.0; ret' => 'ret' 'ldc.i4.0; conv.r8' => 'ldc.r8.0'等等,还是 JIT 足够聪明来处理这些?
是否有包含 Microsoft/Mono JIT 编译器执行的优化列表的规范?
是否有任何关于优化 IL 的实用建议/最佳实践的好读物,以便 JIT 编译器反过来生成最佳机器代码(性能方面)?
【问题讨论】:
-
据我所知,JIT 在消除
stloc.0; ldloc.0;方面做得很好。对于 IronScheme,我尝试将输出 IL 调整为与 C# 非常相似,因为 JIT 可能会更加努力地优化已知模式。但这只是一种感觉:D 你总是可以创建一些微基准来衡量它。 -
.NET JITters 并不是特别聪明(毕竟,他们没有太多时间)。你为什么关心“尽可能快”?
-
@Luaan,我关心“尽可能快”,因为这是需要为密集计算生成代码的编译器。理想情况下,它应该生成本机机器代码,但我正在考虑使用 IL 以获得更好的可移植性和可维护性。但是,性能仍然是重中之重。
-
@DenisYarkovoy 你可以创建一些微基准来分析结果......
-
我会选择性能不那么重要的 IL,并且选择本地代码。可移植性很棘手,但是 - YAGNI。只要确保它实际上是安全的:)