Подтвердить что ты не робот

В .NET будут очищены вызовы методов?

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

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


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

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

4b9b3361

Ответ 1

У этого парня есть довольно хорошее отношение к оптимизациям JIT, выполните поиск на странице, чтобы "метод был пуст", он примерно на полпути вниз по статье -

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

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

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

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

Ответ 2

Я предполагаю, что ваш код похож:

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

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

partial void DoSomethingIfCompFlag();

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

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


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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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