Основываясь на случайных комментариях в Интернете, я всегда считал, что компилятор С# делает простые оптимизации для IL (удаление всегда-истинных if-statement, простых вложений и т.д.), а затем JIT выполняет реальные сложные вычисления.
Как только один пример, в документации для флага /optimize
компилятора, он говорит
Параметр/optimize включает или отключает оптимизацию, выполняемую компилятором , чтобы сделать ваш выходной файл меньше, быстрее и эффективнее.
что подразумевает, что хотя бы некоторые оптимизации применяются компилятором языка.
Однако, играя с Try Roslyn, это выглядит неправдой. Похоже, что компилятор С# практически не оптимизирует.
Примеры
Input:
bool y = true;
if (y)
Console.WriteLine("yo");
if (true)
{
Console.WriteLine("yo");
}
Input:
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!");
}
Input:
try
{
throw new Exception();
}
catch (Exception)
{
Console.WriteLine("Hello world!");
}
try
{
throw new Exception();
}
catch (Exception)
{
Console.WriteLine("Hello world!");
}
Как вы можете видеть, компилятор языка С# не выполняет никаких оптимизаций.
Это правда? Если да, то почему в документации утверждается, что /optimize
сделает ваш исполняемый файл меньше?