C # Cast Exception - PullRequest
       4

C # Cast Exception

6 голосов
/ 03 января 2011

Наткнулся на какой-то старый код, который выбрасывает и сбрасывает, перехватывая некоторые исключения приведения (около 20 за поездку :()

Что если какой-либо удар по производительности был достигнут из-за этого? Должен ли я беспокоиться об этомили это просто накладные расходы в try / catch

Удивительно не хватает информации по теме производительности исключений с C #.

Спасибо, искренне.

Ответы [ 5 ]

9 голосов
/ 03 января 2011

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

BAD

myType foo = (myType)obj;
foo.ExecuteOperation();

GOOD

myType foo = obj as myType;
if (foo != null)
{
     foo.ExecuteOperation();
}
1 голос
/ 03 января 2011

Это плохо по двум причинам.

  1. Исключения медленные, производительность сильно падает. Я не думаю, что это займет целую миллисекунду, как указал Мэтт, но они достаточно медленные, чтобы вы могли избежать их при нормальной работе.
  2. Если у вас нет веских причин, вы не должны ловить пустые исключения. Ты просто прячешь проблемы. Лучше, если программа аварийно завершит работу, чем та, что связана с потенциально опасными ошибками.

Если они просто try { } finally { } группы, тогда все хорошо - там нет накладных расходов. Однако try { } catch { } является потенциально опасным и потенциально медленным.

Что касается документации, это довольно хорошо: http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx#Don%27tuseexceptionhandlingasmeansofreturninginformationfromamethod18

Редактировать: только что понял, что вы сказали пустая ловля исключения, а не ловля пустых исключения В любом случае, если вы не имеете дело с IO, вы, вероятно, хотите избежать этого ради производительности.

0 голосов
/ 03 января 2011

Если вы не столкнулись с какими-либо проблемами с производительностью, и это единственный способ, которым вы должны сделать этот алгоритм, продолжайте использовать этот метод.

Возможно, перед попыткой приведения вы можете увидеть с некоторыми предложениями ifесли бы вы могли сделать приведение.

0 голосов
/ 03 января 2011

Как уже упоминалось, исключения бросаются дорого.В некоторых случаях их нельзя избежать.

В этом случае, однако, звучит так, будто они определенно могут быть.,Это скажет вам, если приведение прошло успешно или нет, таким образом избегая Исключения в целом:

object someObject;
SomeType typedObject;

// fill someObject

typedObject = someObject as SomeType;

if(typedObject == null)
{
    // Cast failed
}
0 голосов
/ 03 января 2011

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

Избегать использования исключений в качестве механизма управления потоком.

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