2010-10-26 3 views
2

Можно создать дубликат:
Performance Cost Of 'try'Неужели .NET попробовать/поймать дешево?

Я наткнулся на это замечание в "Best Practices для обработки исключений," в MSDN:

"с помощью обработки исключений лучше, потому что меньше кода выполненных в нормальном случае "

в контексте того, следует ли требовать eck для состояния объекта перед вызовом метода или просто вызвать метод и поймать исключение. Вышеуказанная рекомендация - это когда событие исключения встречается редко.

Предполагая, что проверка собственности не предполагает дорогостоящего расчета, а просто возвращает значение состояния, насколько дешево стоимость выполнения блока try/catch в случае не бросания по сравнению с проверкой свойства?

Меня интересует рекомендация, потому что даже если try/catch свободен или свободен, вызываемый метод во многих случаях выполняет кучу проверок самим.

+0

Но даже если попытка/улов свободна, рекомендуется ли это использовать, а не проверять состояние? – Holstebroe

+0

Вы должны принять разумные меры, чтобы исключить возможность возникновения исключения по возможности; Я думаю, это может зависеть от того, как часто вы ожидаете «исключения». Если это может быть несколько распространено, сначала выполните тест. Если это будет очень редко, пусть исключение будет выброшено. –

ответ

8

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

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

Метод get, который только что возвращает состояние, оптимизирован для поиска по полю, и в значительной степени является одной операцией - все будет обычно медленнее, чем позже. Тем не менее, я сомневаюсь, что обработка исключений вызовет какой-либо заметный эффект в вашей общей скорости, если она не находится в очень, очень плотной петле - и в этом случае общая производительность, вероятно, не будет хуже, чем проверки, которые вы вводите, чтобы избежать обработки исключений ,

+0

Это точно моя точка зрения. В этом случае главное здесь - ремонтопригодность. Вот почему я задавался вопросом, почему рекомендация подчеркивает эффективность при выборе между ними. – Holstebroe

1

«Исключения для исключительных ситуаций», а не для нормального потока управления.

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

+0

Мой вопрос не о случае, когда на самом деле возникает исключение, речь идет о наилучшей практике перехвата вызовов try/catch, которая редко вызывает исключения и проверку состояния. – Holstebroe

0

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

+0

Я не обязательно думаю, что некоторые из советов здесь дают достаточную мысль для полных последствий. «Использовать if, а не ждать исключения» - это хороший совет, но, передавая идею о том, что исключения ужасно низкопроизводительны и их следует избегать, приводит к возврату параметров ref и кодов ошибок в качестве возвращаемых значений. При написании собственных классов и методов вы хотите бросить исключения из-за плохих обстоятельств и позволить пользователю (даже если вы являетесь пользователем) справляться с ними выше в цепочке вызовов, где будет доступна надлежащая процедура обработки. – CodexArcanum

+0

@CodexArcanum: вопрос конкретно касается производительности. Исключения, вероятно, * менее эффективны, чем коды ошибок в обширном, подавляющем большинстве сценариев. Я все еще использую их. – Puppy

3

Вы принимаете цитату из контекста. Полная цитата (курсив мой):

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

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

логика Вышеприведенная цитата выглядит следующим образом:

  • Если вы повторяете эту операцию несколько раз, и это не разумно исключение произойдет, то не выполняют проверку, используйте исключение , Вы сохраняете коды кода, не повторяя проверку на каждую итерацию.

  • Если операция не цикл повторяется, проверьте состояние, а не нахождение исключения.

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

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

+0

Я не согласен с рассмотрением производительности, используемым в качестве основных критериев принятия решения в статье для выбора правильного метода проверки. – Holstebroe

+0

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

2

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

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

Смежные вопросы