Попробуем поймать - причина высокой загрузки процессора? - PullRequest
0 голосов
/ 11 января 2019

Я обобщаю Кодекс. Следующий код повторяется почти 4000 раз в цикле foreach. На моем локальном IIS он работает, но на производственном облачном сервере происходит полное сбой приложения.

try
{
    cell.Value = decimal.Parse(dr[dc.ColumnName].ToString());
}
catch
{
    cell.Value = dr[dc.ColumnName];
}

Мой запрос: - Будет ли использование блока Catch, как указано выше, вызывать высокую загрузку ЦП?

В качестве дополнительной информации: - Catch бьет 4000 раз

1 Ответ

0 голосов
/ 11 января 2019

Наличие в вашем коде try-catch имеет минимальные, но незначительные для IMO издержки производительности: в диапазоне <0.001 мкс </strong> за попытку "try-that-didnt-catch" (с использованием сборки .NET 4.6.1 Release на моей машине Core i7 x64).

Но , если он должен поймать , тогда он стоит немного больше: в диапазоне 12,5 мкс за попытку-то-чтобы-поймать ( с использованием сборки .NET 4.6.1 Release на моей машине с Core i7). Тем не менее, вы можете не заметить, пока не доберетесь до уровня 10 тысяч обнаруженных исключений.

В общем, гораздо лучше избегать метания и ловли, если вы можете, и вы можете сделать это здесь, используя decimal.TryParse .

Теперь вам нужно выполнить проверку на ноль отдельно, иначе .ToString() может все равно привести к сбою.

Переписанный код:

var v = dr[dc.ColumnName];
var s = v?.ToString(); // or you might use: var s = v as string;
if (s != null && decimal.TryParse(s, out decimal d))
    cell.Value = d;
else
    cell.Value = v;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...