Сведения о вопросе

Kimsanov

11:13, 14th August, 2020

Теги

.net   performance    

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

Просмотров: 494   Ответов: 5

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

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


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

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



  Сведения об ответе

PHPH

19:08, 12th August, 2020

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

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

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

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

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


  Сведения об ответе

VERSUION

23:51, 23rd August, 2020

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

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

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

partial void DoSomethingIfCompFlag();

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

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


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

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

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


  Сведения об ответе

PAGE

21:16, 19th August, 2020

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

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

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


  Сведения об ответе

repe

13:01, 17th August, 2020

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

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


  Сведения об ответе

crush

07:17, 14th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться