#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. В общем, простой вызов метода, как вы описали (без использования виртуальных / абстрактных методов), будет встроен во время выполнения, однако.