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

1

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

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? Способ метода компилятора1 вызывает вызов метода 6 со значениями, которые он будет иметь?

  • 0
    Имейте в виду, что встраивание Method1 (или Method2 в этом отношении) практически не экономит время, если только 1) //functionality является почти ничем, и 2) он вызывается достаточно часто, так что на него приходится хороший процент времени. Поэтому, если / когда компилятор / JITter указывает на это, он делает это только потому, что в некоторых случаях это может помочь.
  • 0
    Почему тебе не все равно? Конечно, есть более важные вещи, о которых нужно беспокоиться?
Теги:
optimization
methods
compiler-construction
il

1 ответ

4
Лучший ответ

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню