Бросок исключения стоит дорого. Причин множество, но в основном это связано с необходимостью построения трассировки стека и чистого выхода из вложенных областей, пока вы не найдете соответствующий оператор catch
.
Фактическая производительность будет зависеть от характеристик вашего приложения. Возьмите следующие два блока кода:
A:
if (foo.CanFizz)
foo.Fizz();
B
try { foo.Fizz(); }
catch (NotFizzableException) { /* etc. */ }
Обычная мудрость гласит, что первое быстрее, но если вы ожидаете, что foo.CanFizz
будет правдой большую часть времени, тогда второе может действительно работать лучше. Стоимость проверки состояния охраны каждый раз может быть выше стоимости отлова исключения в необычном случае, когда условие охраны ложное.
Конечно, преждевременная оптимизация - корень всего зла. Даже не думайте об этом, пока не узнаете, что это узкое место в производительности.