何时开始使用IL而不是更高级的语言

时间:2015-01-08 20:23:40

标签: c# .net il

在堆栈交换团队看到一些开源项目之后。我注意到有几次他们只是在c#函数中直接编写了IL代码。

您可以在dapper file中看到的完美示例。

我的猜测是,编译器不会生成被认为最有效的代码,有时您只需要为编译器执行此操作。

我的好奇心在于何时决定开始使用IL发射器而不是普通的旧C#?

我知道这些示例是针对stackexchange的,但是我还在考虑其他开发人员必须做出这个决定,因为Sigil存在。

1 个答案:

答案 0 :(得分:10)

与实际的CPU汇编语言(x86等)相比,.NET IL非常简单,只有一种方法可以完成所有操作。意思是,你无法用更好的IL实现更好的性能,因为没有更好的IL。 (假设您没有故意生成次优的IL,这是调试版本所做的。)

.NET性能在很大程度上取决于JIT-ter。无论如何,高级语言,JIT-ting,GC-ing等的整个想法。它的性能成本很高,所以IL的轻微优化无论如何都无关紧要。

为什么人们会使用IL?这是在生成代码时(比如编译XSLT,正则表达式或动态代理时)。在IL中,比在字符串缓冲区中创建C#代码并编译它更快,这就完全快了。

除了能够动态生成代码之外,当IL是必须的时候,我不相信IL有任何其他优点。 C#是一种功能丰富且快速发展的语言,如果不使用它就会疯狂。在IL工作将是一种惩罚。您可以放心,C#可以编译为尽可能好的IL。

您还可以随意使用各种最新的C#功能。我同意,像动态这样的东西可能没有最好的性能,但它不是关于性能,它是关于现代功能,只是帮助你完成工作。 IL不会给你这个。 (当然,一些新功能确实有助于提高性能,例如异步,但在更高层次上,与组装级优化的方式完全不同。)

顺便说一句,AFAIK你不能将IL嵌入到C#文件中。除了动态生成新代码之外,您无法将IL编译到程序集中,至少不能在Visual Studio中编译,除非某些技巧涉及在使用C#构建后更改程序集。