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

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

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


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

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

У этого парня есть довольно хорошее описание JIT-оптимизации, выполните поиск на странице по 'method is empty', это примерно половина статьи -...

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

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

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

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

Комментарии (0)

Я'м предполагаю, что ваш код-это:

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

Это выиграл'т получить оптимизированный, однако:

partial void DoSomethingIfCompFlag();

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

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


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

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

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

Комментарии (1)

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

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

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

Комментарии (0)

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

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

Комментарии (0)