DivideByZeroException также замедляются

Это чрезвычайно медленно:

try
{
    x = k / y;
}
catch (DivideByZeroException) { }

Это о 5x быстрее:

if (y > 0) x = k / y;

Кто-либо может сказать мне почему?

7
задан Eduardo 2 February 2010 в 11:27
поделиться

6 ответов

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

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

Одно следует отметить стоимость исключений: они стоят намного больше в отладчике, чем при запуске без отладчика; В частности, первое исключение, которое необходимо загрузить кучу ресурсов, может занять несколько секунд, а не микро / миллисекунды. Если вы собираетесь позорить код, жизненно важно, чтобы вы не делаете это в отладчике - это правда в общем, но особенно для исключения.

11
ответ дан 6 December 2019 в 05:48
поделиться

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

Не каждый запрос, однако, позволяет индексировать вид на него.

Если ваши данные не являются фактическими вторыми для второго, то создание таблицы - это ОК .

-121--3690508-

ERR, потому что исключения медленнее, чем проверка. Исключения, как правило, вокруг них много инфраструктуры, что простое , если не имеет значения.

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

5
ответ дан 6 December 2019 в 05:48
поделиться

Почему исключения медленные?

, потому что многие вещи происходят, когда исключение брошено и поймано. См. Сообщение Chris Brumme о модели Управляемого исключения и Этот пост о базовой модели Win32 Seh .

Почему просто простой тест быстро?

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

Это означает, что я должен всегда пытаться избежать исключения?

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

3
ответ дан 6 December 2019 в 05:48
поделиться

Вы все еще "просматриваете" свои строки, будь то в таблице или в представлении строк таблицы.

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

-121--3690509-

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

Однако не каждый запрос позволяет индексировать представление по нему.

Если данные не являются фактическими со второго по второй, то создается таблица OK .

-121--3690508-

Поскольку исключения являются дорогостоящими.

Когда создается исключение, во время выполнения необходимо подобрать достаточно много информации (например, трассировки стека) и выдвинуть их вверх. Это требует времени и ресурсов, когда тест на значение 0 очень дешев в сравнении.

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

10
ответ дан 6 December 2019 в 05:48
поделиться

Исключения чрезвычайно медленные - это причина, по которой .NET Framework имеет триполосные методы:

// This is much quicker...
double result;
if (!double.TryParse("Twelve", out result))
{
    result = -1;
}
return result;

// Than this...
try
{
    return double.Parse("Twelve");
}
catch 
{
    return -1;
}

Вы всегда должны пытаться избежать исключений (кроме в исключительных обстоятельствах - ха-ха. ..)

1
ответ дан 6 December 2019 в 05:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: