Когда свойство «встроено» при оптимизации кода - PullRequest
3 голосов
/ 08 ноября 2010

Это своего рода вопрос нуба. У меня есть простое свойство

bool IsRoot { get { return parent==null; } }

, который я вызываю много раз из других свойств и методов класса (и производных классов)

Мне нравится держать его таким, потому что он делает код читабельным (для меня), но я боюсь, что все вызовы IsRoot замедлят меня, так как они могут не быть "встроенными" в финальной версии код. Под «встроенным» я подразумеваю то, что они заменяются копией parent==null оценки вместо get_IsRoot().

Может ли кто-нибудь объяснить мне, когда (или если) свойства встроены в C # и для приложений, ориентированных на производительность, следует ли избегать свойств или нет?

EDIT_1 : Краткий ответ: свойства переводятся в чистые вызовы функций, и они могут или не могут быть встроены в зависимости от того, что решает JIT. Доверяйте системе, чтобы она делала правильный выбор, и не беспокойтесь о вещах, которые могут повлиять на вещи на уровне 5-10%, если только не используется профилировщик и конечный результат не настроен на производительность.

Спасибо за ссылки SO сообщества, и я надеюсь, что был способ наградить несколько правильных ответов. Извините, я должен был выбрать один.

Ответы [ 2 ]

4 голосов
/ 09 ноября 2010

Думаю, это ответит на ваш вопрос

Имеет ли C # встроенные свойства?

2 голосов
/ 09 ноября 2010

Вот СТАРЫЙ пост Эрика Ганнерсона , в котором говорится о встраивании.
Суть в том, что джиттер решает, должна ли функция быть встроена. Насколько я понимаю, вы можете в некоторой степени «поощрять» встраивание, написав небольшие функции, но я не знаю, насколько это действительно надежно.

Вот еще одна ссылка из вопроса на SO, который задает аналогичный вопрос. Многие хорошие ссылки включены.

Вот выдержка из одной из ссылок, которые я разместил во второй ссылке:

Короткий и простой метод, который часто используется, может быть встроен в вызывающий код. В настоящее время документ JIT задокументирован (возможно, здесь будет более "подробно о блоге") для встроенных методов длиной менее 32 байт, которые не содержат никакой сложной логики ветвления и не содержат никаких механизмов, связанных с обработкой исключений. См. Блог Дэвида Нотарио для получения дополнительной информации по этой теме (обратите внимание, что это не совсем относится к CLR 2.0).

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

На боковой ноте вы можете заставить функцию НЕ быть встроенной, например:

[MethodImpl(MethodImplOptions.NoInlining)]
public void DoNotInlineMe()
{
  Console.WriteLine("Hello from non-inlined method");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...