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

标签 c# .net il

<分区>

在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# 构建程序集后更改程序集。

关于c# - 何时开始使用 IL 而不是高级语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27848891/

相关文章:

.net - 使用 MONO_IOMAP 来处理硬编码文件路径?

c# - 为什么加入 beforefieldinit 会大幅提升泛型类的执行速度?

c# - 从汇编中获取 MSIL?

c# - AJAX + ASP.net 从 Sql Server 检索数据?

c# - OraOLEDB.Oracle 提供程序未在本地计算机上注册

.net - GroupBox控件中的圆角

c# - 为 Nullable<T> 序列化生成 IL?

c# - Silverlight CustomControl 依赖属性不能绑定(bind)到父 View 模型

c# - 异步任务超时

c# - 应用程序不会死于未处理的异常?