Исключительная эффективность, когда ничего не брошено - PullRequest
10 голосов
/ 16 февраля 2011

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

Сначала взгляните на этот C #:

int simpleSimon, cautiousCarol, dangerousDave;

try
{
    simpleSimon = int.Parse("fail");
}
catch
{
    simpleSimon = 1;
}

try
{
    cautiousCarol = int.Parse("1");
}
catch
{
    cautiousCarol = 1;
}

dangerousDave = int.Parse("1");

Я уверен, что код Дэйва будет самым быстрым / самым эффективным;в то время как Саймон понесет большой штраф за исключение.

А как же Кэрол?Поскольку она не бросает никаких исключений, несет ли она штраф?Если да, то какой и какой?(Снижение производительности или использование дополнительной памяти или что-то еще?)

Ответы [ 2 ]

8 голосов
/ 16 февраля 2011

Никаких существенных штрафов за Carol. При необходимости будут зарегистрированы и выполнены только определенные прыжки.

В качестве подсказки используйте int.TryParse(...), чтобы избежать подобных ситуаций.

6 голосов
/ 16 февраля 2011

Это деталь реализации JIT.Джиттер x86 должен установить 16 байтов в кадре стека, чтобы помочь CLR найти правильный блок перехвата в случае возникновения исключения.Это должно занять около 3 наносекунд.Для джиттера x64 вообще не работает, фильтрация исключений реализована по-другому в 64-битной версии Windows (на основе таблицы, а не на основе стека).Требуемая дополнительная память примерно эквивалентна (код по сравнению с данными таблицы).

Ничего из этого не должно иметь значения для такого кода, преобразование строки в целое число является операцией ввода-вывода.Во-первых, стоимость получения данных на 3–4 порядка выше, чем любой анализ, который вы делаете.И вы, конечно, будете использовать TryParse (), если не доверяете источнику данных.Обработка исключения стоит довольно дорого.

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