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

When to start using IL over higher languages

在stack exchange team看了几个开源项目之后。我注意到有几次他们只是直接编写内联在 c# 函数中的 IL 代码。

您可以在 dapper file 中看到一个完美的例子。

我的猜测是编译器不会生成我们认为最高效的代码,有时您只需要为编译器生成代码即可。

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

我知道这些示例是针对 stackexchange 的,但我猜测其他开发人员不得不做出这个决定,因为 Sigil 存在。

.NET IL 与实际的 CPU 汇编语言(x86 等)相比是如此简单,以至于只有一种方法可以完成几乎所有事情。意思是,你无法通过更好的 IL 获得更好的性能,因为没有更好的 IL。 (假设您没有故意生成次优的 IL,而调试版本会这样做。)

.NET 性能更多地取决于 JIT-ter。无论如何,高级语言、JIT-ting、GC-ing 等的整个概念。有其性能损失,因此 IL 中的轻微优化无论如何都没有太大关系。

那么人们为什么要使用 IL?它是在您生成代码时(例如在编译 XSLT、正则表达式或动态代理时)。在 IL 中执行比在字符串缓冲区中创建 C# 代码并编译它快得多,仅此而已。

除了可以动态生成代码,当IL是必须的时候,我认为IL没有任何其他优势。 C# 是一种功能丰富且发展迅速的语言,不使用它会很疯狂。不得不在 IL 工作将是一种惩罚。你可以放心,C# 可以编译成尽可能好的 IL。

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

顺便说一句,据我所知,您不能将 IL 嵌入到 C# 文件中。除了即时生成新代码外,您不能将 IL 编译到您的程序集中,至少不能在 Visual Studio 中,除非使用某些技巧涉及在从 C# 构建程序集后更改程序集。