Насколько медленны исключения .NET? - PullRequest
142 голосов
/ 02 октября 2008

Я не хочу дискуссии о том, когда и не бросать исключения. Я хочу решить простой вопрос. В 99% случаев аргумент об отказе от исключений вращается вокруг того, что они медленные, в то время как другая сторона заявляет (с помощью теста производительности), что скорость не является проблемой. Я прочитал множество блогов, статей и постов, касающихся одной или другой стороны. Так что же это?

Некоторые ссылки из ответов: Skeet , Mariani , Brumme .

Ответы [ 13 ]

1 голос
/ 02 октября 2008

В режиме выпуска накладные расходы минимальны.

Если вы не собираетесь использовать исключения для управления потоком (например, нелокальные выходы) рекурсивным способом, я сомневаюсь, что вы сможете заметить разницу.

0 голосов
/ 23 марта 2014

Когда вы пишете классы / функции для использования другими, кажется, что трудно сказать, когда уместны исключения. Есть некоторые полезные части BCL, которые мне пришлось бросить и пойти на пинвоук, потому что они выдают исключения, а не возвращают ошибки. В некоторых случаях вы можете обойти это, но в других, таких как System.Management и Performance Counter, есть случаи, когда вам нужно делать циклы, в которых BCL часто генерирует исключения.

Если вы пишете библиотеку, и существует отдаленная вероятность того, что ваша функция может использоваться в цикле, и существует вероятность большого количества итераций, используйте шаблон Try .. или какой-либо другой способ показать ошибки помимо исключений. И даже тогда трудно сказать, сколько будет вызываться ваша функция, если она используется многими процессами в общей среде.

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

0 голосов
/ 23 октября 2008

Небольшое замечание о производительности, связанной с отловом исключений.

Когда путь выполнения входит в блок try, ничего волшебного не происходит. Здесь нет инструкции try и никаких затрат, связанных с входом или выходом из блока try. Информация о блоке try хранится в метаданных метода, и эти метаданные используются во время выполнения всякий раз, когда возникает исключение. Механизм выполнения перемещается по стеку в поисках первого вызова, который содержался в блоке try. Любые накладные расходы, связанные с обработкой исключений, возникают только при возникновении исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...