C # Производительность на ошибки - PullRequest
3 голосов
/ 17 мая 2010

Может показаться, что обнаружение ошибки происходит медленнее, чем выполнение проверки до ошибки (например, TryParse). Смежные вопросы, которые побуждают это наблюдение: здесь и здесь .

Может кто-нибудь сказать мне, почему это так - почему дешевле отлавливать ошибку, чем выполнять одну или несколько проверок данных для предотвращения ошибки?

Ответы [ 5 ]

5 голосов
/ 17 мая 2010

По сути, это раскрутка стека, который является самым дорогим. Вот отличная ссылка: Почему пробные блоки дороги?

3 голосов
/ 17 мая 2010

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

Фактическая производительность будет зависеть от характеристик вашего приложения. Возьмите следующие два блока кода:

A:

if (foo.CanFizz)
    foo.Fizz();

B

try { foo.Fizz(); }
catch (NotFizzableException) { /* etc. */ }

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

Конечно, преждевременная оптимизация - корень всего зла. Даже не думайте об этом, пока не узнаете, что это узкое место в производительности.

0 голосов
/ 17 мая 2010

Производительность падает не от «ошибок» в целом, а от исключений, а именно от различных действий, которые должны быть выполнены при создании исключения (создание объекта исключения, разматывание стека, переключение контекста).

Помните: исключения предназначены для исключительного поведения

Не должно иметь значения, что выбрасывание / отлов исключения является «медленным» (и на самом деле это не , что медленно), потому что, если вы находитесь в коде обработки исключений, то вы должны быть вне ожидаемой нормы поток вашей программы.

0 голосов
/ 17 мая 2010

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

0 голосов
/ 17 мая 2010

Быстрый ответ «из-за переключения контекста и обхода стека, необходимого для поиска корня исключения».

...