【发布时间】:2016-05-07 15:12:40
【问题描述】:
基于随机的 Internet cmets,我一直认为 C# 编译器对 IL 进行了简单的优化(删除始终为真的 if 语句、简单的内联等),然后是 JIT执行真正的复杂优化。
作为一个例子,the documentation for the /optimize compiler flag 上写着
/optimize 选项启用或禁用编译器执行的优化以使您的输出文件更小、更快、更高效。
这意味着语言编译器至少应用了一些优化。
然而,玩弄Try Roslyn,这似乎不是真的。看起来 C# 编译器根本没有进行任何优化。
示例
输入:
bool y = true;
if (y)
Console.WriteLine("yo");
if (true)
{
Console.WriteLine("yo");
}
输入:
static void DoNothing() { }
static void Main(string[] args)
{
DoNothing();
Console.WriteLine("Hello world!");
}
private static void DoNothing()
{
}
private static void Main(string[] args)
{
NormalProgram.DoNothing();
Console.WriteLine("Hello world!");
}
输入:
try
{
throw new Exception();
}
catch (Exception)
{
Console.WriteLine("Hello world!");
}
try
{
throw new Exception();
}
catch (Exception)
{
Console.WriteLine("Hello world!");
}
如您所见,C# 语言编译器似乎根本没有进行任何优化。
这是真的吗?如果是这样,为什么文档声称/optimize 会使您的可执行文件更小?
【问题讨论】:
-
它确实优化了
yaway... -
您真正需要做的是比较优化和非优化版本的 IL 代码。非反编译版本。
-
你怎么知道这个在线编译使用了优化?
-
@ScottChamberlain 该站点也支持 IL 输出和非优化构建。
标签: c# .net compiler-optimization