Могу поспорить, что мог бы ответить на этот вопрос сам, если бы я знал больше об инструментах для анализа поведения C # / JIT, но, поскольку я не знаю, прошу терпеть меня.
У меня есть простой код, подобный этому:
private SqlMetaData[] meta;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private SqlMetaData[] Meta
{
get
{
return this.meta;
}
}
Как видите, я поставил AggressiveInlining, потому что я чувствую, что он должен быть встроен.
Я думаю. Нет никакой гарантии, что JIT включит это в противном случае. Я ошибаюсь?
Могут ли подобные вещи навредить производительности / стабильности / чему-либо?
Ответы:
Компиляторы умные звери. Обычно они автоматически выжимают столько производительности, сколько могут из любого места.
Попытка перехитрить компилятор обычно не имеет большого значения, и у него есть много шансов получить ответный удар. Например, встраивание делает вашу программу больше, поскольку она дублирует код везде. Если ваша функция используется во многих местах кода, она может быть вредной, как указано @CodesInChaos. Если очевидно, что функция должна быть встроенной, вы можете поспорить, что компилятор сделает это.
В случае колебаний вы все равно можете сделать и то, и другое и сравнить, если есть какой-либо выигрыш в производительности, это единственный верный способ сейчас. Но моя ставка в том, что разница будет пренебрежимо мала, исходный код будет просто «шумнее».
источник
struct
s в качестве параметров - где во многих случаях он должен и мог. В дополнение к отсутствию сотен очевидных оптимизаций - включая, но не ограничиваясь - избегая ненужных проверок границ и выделений среди прочего.Вы правы - нет способа гарантировать, что метод будет встроен - перечисление MSDN MethodImplOptions , SO MethodImplOptions.AggressiveInlining vs TargetedPatchingOptOut .
Программисты умнее, чем компилятор, но мы работаем на более высоком уровне, и наши оптимизации являются продуктами работы одного человека - нашей собственной. Джиттер видит, что происходит во время казни. Он может анализировать как поток выполнения, так и код в соответствии со знаниями, заложенными в него его разработчиками. Вы можете лучше знать свою программу, но они лучше знают CLR. И кто будет более правильным в его оптимизации? Мы не знаем наверняка.
Вот почему вы должны проверить любую сделанную вами оптимизацию. Даже если это очень просто. И учтите, что среда может измениться, и ваша оптимизация или дезоптимизация может привести к совершенно неожиданному результату.
источник
РЕДАКТИРОВАТЬ: я понимаю, что мой ответ не совсем ответил на вопрос, хотя нет никаких реальных недостатков, из моих результатов синхронизации также нет никакого реального преимущества. Разница между получателем встроенного свойства составляет 0,002 секунды за 500 миллионов итераций. Мой тестовый пример также может быть не точным на 100%, так как он использует структуру, потому что есть некоторые предостережения относительно дрожания и встраивания со структурами.
Как всегда, единственный способ узнать это - написать тест и разобраться. Вот мои результаты со следующей конфигурацией:
Пустой проект со следующими настройками:
Результаты
Протестировано с этим кодом:
источник
Компиляторы делают много оптимизаций. Встраивание является одним из них, хотел ли программист или нет. Например, у MethodImplOptions нет опции «inline». Поскольку встраивание автоматически выполняется компилятором, если это необходимо.
Многие другие оптимизации особенно выполняются, если они включены в опциях сборки или в режиме «релиз». Но эти оптимизации как бы «работали для вас, отлично! Не работали, оставьте это» и обычно дают лучшую производительность.
это просто признак для компилятора, что операция вставки здесь действительно нужна. Больше информации здесь и здесь
Ответить на ваш вопрос;
Правда. Нет гарантии; Ни один из C # не имеет опции «принудительное включение».
В этом случае нет, как сказано в статье «Создание высокопроизводительных управляемых приложений: учебник для начинающих»
источник