Если тело метода пустое, будет ли JIT оптимизировать вызов (я знаю, что компилятор C# не будет). Как я могу это выяснить? Какие инструменты я должен использовать и где искать?
Поскольку я уверен, что меня об этом спросят, причиной пустого метода является директива препроцессора.
@Chris: Логично, но это может оптимизировать вызовы метода. Таким образом, метод будет существовать, но статические вызовы к нему могут быть удалены (или, по крайней мере, инклудированы...).
@Jon: Это просто говорит мне, что компилятор языка ничего не делает. Я думаю, что мне нужно прогнать мою dll через ngen и посмотреть на сборку.
У этого парня есть довольно хорошее описание JIT-оптимизации, выполните поиск на странице по 'method is empty', это примерно половина статьи -...
http://www.codeproject.com/KB/dotnet/JITOptimizations.aspx
По-видимому, пустые методы действительно оптимизируются за счет инлайнинга того, что фактически не является кодом.
@Chris: Я понимаю, что методы все равно будут частью бинарного файла и что это JIT-оптимизация :-). На полусвязанной ноте, у Скотта Хансельмана была довольно интересная статья об инлайнинге в стеках вызовов Release build:
Я'м предполагаю, что ваш код-это:
void DoSomethingIfCompFlag() {
#if COMPILER_FLAG
//your code
#endif
}
Это выиграл'т получить оптимизированный, однако:
partial void DoSomethingIfCompFlag();
#if COMPILER_FLAG
partial void DoSomethingIfCompFlag() {
//your code
}
#endif
Первый способ-это частичная, а компилятор C#3 будет оптимизировать его.
Кстати: это в основном то, что частичные методы для. Microsoft добавила генераторы кода для их дизайнеры LINQ, который нужно вызывать методы, которые по умолчанию Дон'т сделать что-нибудь.
А не заставить вас перегружать метод, вы можете использовать частичное.
Таким образом, частичные полностью оптимизирован, если не используется и производительность не теряется, а не затрат на лишние пустые вызова метода.
Нет, пустые методы никогда не оптимизируются. Вот несколько причин, почему:
Edit: Да, судя по этому (отличному) документу проекта кода, JITer устранит вызовы пустых методов. Но сами методы все равно будут скомпилированы и станут частью вашего двоичного файла по причинам, которые я перечислил.
При прочих равных условиях, да, это должно быть оптимизировано. JIT инлайнит функции там, где это уместно, и мало что может быть более уместным, чем пустые функции :)
Если вы действительно хотите быть уверенным, измените свой пустой метод так, чтобы он выбрасывал исключение и выводил трассировку стека, которую он содержит.