Оптимизация компилятора для методов, которые вызывают только другой метод

#c# #optimization #methods #compiler-construction #il

#c# #оптимизация #методы #компилятор-конструкция #il

Вопрос:

Я думаю, что мой вопрос лучше всего задать на примере

 Method1(variable var1, variable var2)
{
    Method2([null or default value goes here], var1, var2)
}

Method2(variable newvar, variable var1, variable var2)
{
    //functionality
}
  

Будет ли компилятор оптимизировать наш код, изменив все вызовы метода 1 на вызов метода 2? Я бы подумал, что это встроит метод. Однако, что, если метод2 вызывает 3, который вызывает 4, который вызывает 5, который вызывает 6? Изменяет ли компилятор вызовы method1 на вызов метода 6 со значениями, которые он будет иметь?

Комментарии:

1. Имейте в виду, что встраивание Method1 (или Method2 , если на то пошло) практически не экономит времени, если только 1) //functionality это почти ничего, и 2) это вызывается достаточно часто, чтобы на него приходилось хороший процент времени. Поэтому, если / когда компилятор / JITter вставляет его, он делает это только потому, что в некоторых случаях это может помочь.

2. Почему вас это волнует? Конечно, есть более важные вещи, о которых нужно беспокоиться?

Ответ №1:

Это полностью деталь реализации и может быть изменено. Однако команда CLR написала в блоге о том, когда методы могут быть встроены (хотя это, конечно, предварительно RyuJIT).

Обратите внимание, что компилятор C # никогда не встраивает методы — встраивание происходит на этапе компиляции JIT. В общем, простой вызов метода, как вы описали (без использования виртуальных / абстрактных методов), будет встроен во время выполнения, однако.