Будут ли оптимизированы пустые вызовы методов в .NET?

Учитывая пустое тело метода, оптимизирует ли JIT вызов (я знаю, что компилятор C # не будет). Как мне узнать об этом? Какие инструменты я должен использовать и где я должен искать?

Поскольку я уверен, что это будет задано, причиной пустого метода является директива препроцессора.


@Chris: имеет смысл, но он может оптимизировать вызовы метода. Таким образом, метод все еще существует, но статические вызовы к нему могут быть удалены (или, по крайней мере, встроены ...)

@Jon: Это просто говорит мне, что языковой компилятор ничего не делает. Я думаю, что мне нужно сделать, это запустить мою DLL через Ngen и посмотреть на сборку.

14.08.2008 23:33:35
4 ОТВЕТА

Нет, пустые методы никогда не оптимизируются. Вот несколько причин, почему:

  • Метод может быть вызван из производного класса, возможно, в другой сборке
  • Метод может быть вызван с использованием Reflection (даже если он помечен как private)

Изменить: Да, глядя на этот (отличный) код проекта документа, JITer исключит вызовы пустых методов. Но сами методы все равно будут скомпилированы и станут частью вашего двоичного файла по причинам, которые я перечислил.

2
14.08.2008 23:53:20

При прочих равных, да, это должно быть оптимизировано. JIT встроенные функции, где это уместно, и есть несколько вещей, более подходящих, чем пустые функции :)

Если вы действительно хотите быть уверенным, измените пустой метод на выдачу исключения и распечатайте трассировку стека, которую он содержит.

1
14.08.2008 23:41:30

В этом разделе довольно хорошо рассматривается оптимизация JIT, выполните поиск на странице «метод пуст», он примерно в середине статьи -

http://www.codeproject.com/KB/dotnet/JITOptimizations.aspx

По-видимому, пустые методы оптимизируются за счет встраивания того, что фактически не является кодом.

@Chris: я понимаю, что методы все еще будут частью двоичного файла и что это JIT-оптимизации :-). На полусвязанной ноте у Скотта Хансельмана была довольно интересная статья о встраивании в стеки вызовов сборки Release:

http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx

13
24.11.2013 07:37:39

Я предполагаю, что ваш код выглядит так:

void DoSomethingIfCompFlag() {
#if COMPILER_FLAG
    //your code
#endif
}

Это не будет оптимизировано, однако:

partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

Первый пустой метод является частичным, и компилятор C # 3 оптимизирует его.


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

Вместо того, чтобы заставлять вас перегружать метод, вы можете использовать частичное.

Таким образом, парциальные возможности полностью оптимизируются, если они не используются, и производительность не теряется, вместо того, чтобы добавлять накладные расходы на дополнительный пустой вызов метода.

13
15.08.2008 09:25:10
Использование атрибута [Conditional ("COMPILER_FLAG")] будет иметь тот же эффект и, возможно, будет немного проще в использовании. См. Msdn.microsoft.com/en-us/library/4xssyw96.aspx
Eric 26.04.2014 07:08:27