【发布时间】:2013-10-21 17:27:03
【问题描述】:
好吧,这只是好奇,对现实世界没有帮助。
我知道使用表达式树,您可以像常规 C# 编译器一样动态生成 MSIL。由于编译器可以决定优化,我很想问在Expression.Compile() 期间生成的 IL 是什么情况。基本上两个问题:
由于在编译时编译器可以在调试模式和发布模式下产生不同的(可能是轻微的)IL,在构建时编译表达式生成的 IL 是否存在差异处于调试模式和发布模式?
此外,在运行时将 IL 转换为本机代码的 JIT 在调试模式和发布模式下应该有很大的不同。这也是编译表达式的情况吗?还是来自表达式树的 IL 根本没有被 jitted?
我的理解可能有缺陷,以防万一。
注意:我正在考虑调试器分离的情况。我问的是Visual Studio中“调试”和“发布”附带的默认配置设置。
【问题讨论】:
-
您首先需要考虑的是您所说的“调试模式”和“发布模式”是什么意思。构建配置会影响各种编译时设置,但运行时是否附加调试器也存在差异,这会影响 JIT 优化(至少)。
-
@JonSkeet 我说的是调试器分离的情况(我将编辑到答案中),但我不知道其他编译时间设置。你的意思是x86、x64等平台配置?
-
我的意思是基本的“调试”或“发布”配置,它会影响编译时优化设置和 DEBUG 等预处理器符号。
-
@JonSkeet 确实是关于我正在谈论的这些配置。是说“发布模式”与“发布配置”不同吗?
-
该配置基本上捆绑了许多开关,包括优化和预处理器符号 - 值得准确指定您感兴趣的其中哪些。(例如,有人可以调整特定配置以包括“Release”中有更多调试信息,但仍在优化。)
标签: c# expression-trees compiler-optimization jit il