@Beginer494o

Возможно ли оптимизировать Inline метода с throw с помощью директив препроцессора?

Я гонюсь за оптимизацией. У меня есть метод, в котором выбрасывается exception. Но мне хотелось бы сделать inline. Произойдет ли буст производительности в Release версии приложения, если я сделаю что-то подобное?
public void Foo()
{
    //Code
#if DEBUG
    if (capacity <= 0)
        throw new Exception("Capacity should be greater than zero");
#endif
    //Code
}
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
vabka
@vabka Куратор тега C#
Токсичный шарпист
Да, возможно. Эта проверка с exception просто исчезнет из Release сборки в таком примере.
Но в таком случае лучше использовать Debug.Assert - они тоже в релизе исчезнут.
Но если в штатной ситуации capacity реально может оказаться меньше нуля - лучше проверку оставить.
Ну и ещё есть какой-то атрибут, чтобы показать JIT-у, что выпадение исключения в твоём коде - это что-то очень редкое, и тогда JIT будет оптимизировать код исходя из этого.

+ Если ты уберёшь эту проверку на 0 совсем, то тогда производительность наоборот может упасть, тк jit будет дальнейший код оптимизировать исходя из того, что capacity может быть меньше нуля => будет вставлять повсюду проверки на выходы за границы, хотя в случае с проверкой и исключением - jit бы знал, что такое невозможно и наоборот бы выпилил дальнейшие проверки.

+ Обязательно пиши бенчмарки, если пишет что-то неочевидное, что должно улучшить производительность.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Не скажу насчет C# но в других языках и технологиях обработка Exception когда оно уже случилось
приводит к тяжелым последствиям для производительности. Мне кажется лучше возвращать код
ошибки или как-то по другому проверять capacity.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы