Если оптимизация включена, будет ли JIT всегда встроен в этот метод? - PullRequest
6 голосов
/ 27 августа 2009

Я не ожидаю определенного да или нет. Любое знание, которое у вас может быть, я рассмотрю как ответ.

private String CalculateCharge(Nullable<Decimal> bill, Nullable<Decimal> rate)
{
    return ((bill ?? 0.0m) * (rate ?? 0.0m)).ToString("C");
}

1 Ответ

22 голосов
/ 27 августа 2009

Встраивание - это деталь реализации JIT, а не компилятора C #. Из блога Эрика Ганнерсона :

JIT использует ряд эвристик для решить, должен ли метод быть в подкладке. Ниже приведен список наиболее значимые из них (примечание что это не является исчерпывающим):

  • Методы, которые больше, чем 32 байта IL, не будут встроены.
  • Виртуальные функции не встроены.
  • Методы, которые имеют сложное управление потоком, не будут встроены. Сложный управление потоком является любое управление потоком другой чем если / то / еще; в этом случае, переключатель или время.
  • Методы, которые содержат блоки обработки исключений, не являются встроенный, хотя методы, которые бросают исключения все еще являются кандидатами на встраивание.
  • Если какой-либо из формальных аргументов метода является структурой, метод будет не быть встроенным.

Хотя ваш метод довольно короткий и не очень сложный, поэтому может соответствовать эвристике, Nullable<T> - это struct, поэтому я предполагаю, что ваш метод не встроенный.

Как показывает практика, если использование этого метода повышает производительность, JIT включит этот метод; иначе не будет. Но это действительно деталь реализации JIT, и вы ничего не должны кодировать для:

Я бы внимательно рассмотрел кодирование этих эвристик , поскольку они могут измениться в будущих версиях JIT. Не ставьте под угрозу правильность метода, пытаясь гарантировать, что он будет встроенным.

РЕДАКТИРОВАТЬ: Очевидно, что немного о структурах, не являющихся inline, устарела; обновленную информацию можно найти в блоге Вэнса Моррисона .

...