Будут ли оптимизированы пустые вызовы методов в .NET? - PullRequest
20 голосов
/ 15 августа 2008

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

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


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

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

Ответы [ 5 ]

12 голосов
/ 15 августа 2008

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

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

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

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

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

10 голосов
/ 15 августа 2008

Полагаю, ваш код выглядит так:

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

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

partial void DoSomethingIfCompFlag();

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

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


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

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

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

2 голосов
/ 15 августа 2008

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

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

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

1 голос
/ 15 августа 2008

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

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

0 голосов
/ 15 августа 2008

@ Джон Лимджап: Мы уже знаем, что компилятор C # не оптимизирует пустые методы. Поскольку то, что вы декомпилируете с помощью ildasm, было сгенерировано компилятором C # ... там нет никакой помощи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...