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

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

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


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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
23
0
3 435
4

Ответы 4

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

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

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

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

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

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

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

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

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

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

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

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

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

partial void DoSomethingIfCompFlag();

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

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


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

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

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

Использование атрибута [Conditional ("COMPILER_FLAG")] даст тот же эффект и, возможно, будет немного проще в использовании. См. msdn.microsoft.com/en-us/library/4xssyw96.aspx

Eric 26.04.2014 11:08

Другие вопросы по теме