плохая производительность из-за слишком большого количества ошибок? - PullRequest
3 голосов
/ 23 апреля 2010

У меня есть большой проект на C # (.NET 2.0), который содержит очень большие куски кода, сгенерированного SubSonic.Вызывает ли подобный триум-бросок ужасное снижение производительности?

for (int x = 0; x < identifiers.Count; x++)
        {decimal target = 0;
            try
            {
                target = Convert.ToDecimal(assets[x + identifiers.Count * 2]); // target %
            }
            catch { targetEmpty = true;  }}

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

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

Любые мысли будут полезны (будьте добры,это был несчастный день)

спасибо, Крис

Ответы [ 4 ]

5 голосов
/ 23 апреля 2010

Использование исключений для потока управления, как правило, является плохой практикой (именно из-за низкой эффективности, которую вы наблюдаете). Какой тип данных вам нужно преобразовать в decimal? Не могли бы вы использовать метод TryParse или другой метод, который не выдает исключение, если ввод не в ожидаемом формате?

Decimal.TryParse метод должен помочь, если вы анализируете строки, так как он сообщает об ошибке, возвращая false:

decimal d;
if (Decimal.TryParse(str, out d)) 
  // Ok, use decimal 'd'
else 
  // Failed - do something else
4 голосов
/ 23 апреля 2010

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

decimal.TryParse будет гораздо лучшим вариантом здесь, и я бы предложил также кэшировать значение identifiers.Count * 2 (не уверен, оптимизирует ли это компилятор)

3 голосов
/ 23 апреля 2010

Существует также TryParse для десятичного числа.Он избегает исключения и использует вместо этого bool, чтобы сигнализировать об успехе / неудаче.

0 голосов
/ 23 апреля 2010

Это страшно выглядящий код, и вы получаете хорошие предложения о том, как его исправить.

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

Просто сделайте паузу примерно 10 раз и каждый раз проверяйте стек вызовов. Если исключения стоят некоторого процента времени, скажем, 50%, то вы увидите это в процессе броска или ловли их примерно в этом проценте пауз.

...