Устраняет ли проглатывание исключения снижение производительности при его выбросе? - PullRequest
2 голосов
/ 08 июня 2011

После столкновения с некоторыми необработанными исключениями при использовании Response.Redirect() я прочитал его, и кажется, что несколько человек рекомендуют использовать ApplicationInstance.CompleteRequest() вместо этого, чтобы избежать необработанного ThreadAbortException для каждого перенаправления, и тем самым избежатьхит производительности.Но давайте предположим, что вместо этого вы поймаете это исключение, как показано ниже ...

try
{
    response.Redirect("Default.aspx", false);
    response.End();
}
catch (ThreadAbortException)
{
    // Do nothing
}

Будет ли это устранено снижение производительности при проглатывании исключения?

Ответы [ 2 ]

5 голосов
/ 08 июня 2011

Исключение по-прежнему выбрасывается, поэтому все затраты на генерацию исключения и его перехват все еще присутствуют.

0 голосов
/ 06 апреля 2018

На моем компьютере выдача исключения стоит около 0,042 мс, плюс около 0,026 мс, чтобы что-то с ним сделать. До тех пор, пока отладчик не подключен. Если я запускаю его с отладчиком Visual Studio 2015, это стреляет примерно до 15 мс, разница при выполнении каких-либо действий с ним теряется в шуме.

Ниже приведен код теста и результаты, но это произвольный тест. Я бы не использовал исключения при разборе длинных списков очень плохих данных, я бы использовал TryParse ().

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

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


    private const int DataSize = 1000;
    private const string TestInt = "1";

    static void Main(string[] args)
    {
#if DEBUG
        Console.Write("DEBUG code, ");
#else
        Console.Write("RELEASE code, ");
#endif
        Console.Write(System.Diagnostics.Debugger.IsAttached ? "Debugger attached. " : "no debugger. ");
        Console.WriteLine($"{DataSize} of \"{TestInt}\"");

        var seedData = new List<string>();
        seedData.AddRange(Enumerable.Repeat(TestInt, DataSize));
        var stopWatch = new System.Diagnostics.Stopwatch();

        // Handled
        stopWatch.Restart();
        var exceptions = new List<Exception>();
        foreach (var item in seedData)
        {
            try
            {
                var x = int.Parse(item);
            }
            catch (Exception ex)
            {
                exceptions.Add(ex);
            }
        }
        var elapsed = stopWatch.Elapsed;
        Console.WriteLine($"Handled {elapsed}.");

        // Swallowed
        stopWatch.Restart();
        foreach (var item in seedData)
        {
            try
            {
                var x = int.Parse(item);
            }
            catch (Exception ex)
            {

            }
        }
        elapsed = stopWatch.Elapsed;
        Console.WriteLine($"Swallowed {elapsed}.");

        // But I would do this task using TryParse()
        stopWatch.Restart();
        var failedStrings = new List<string>();
        foreach (var item in seedData)
        {
            int x;
            if (!int.TryParse(item, out x))
                failedStrings.Add(item);
        }
        elapsed = stopWatch.Elapsed;
        Console.WriteLine($"Tryparse {elapsed}.");

        Console.ReadKey();
    }

RELEASE-код, без отладчика. 1000 "х"

Обработано 00: 00: 00.0632112.

проглочен 00: 00: 00.0366465.

Tryparse 00: 00: 00.0000955.

Код отладки, без отладчика. 1000 "х"

Обработано 00: 00: 00.0743439.

Проглотил 00: 00: 00.0491802.

Tryparse 00: 00: 00.0001026.

RELEASE код, отладчик прилагается. 1000 "х"

Обработано 00: 00: 15.3732464.

Проглотил 00: 00: 15.2940802.

Tryparse 00: 00: 00.0001101.

Код отладки, отладчик прилагается. 1000 "х"

Обработано 00: 00: 15.1689722.

Проглотил 00: 00: 15.1741098.

Tryparse 00: 00: 00.0001026.

RELEASE-код, без отладчика. 1000 из "1"

Обработано 00: 00: 00.0001697.

Проглотил 00: 00: 00.0001575.

Tryparse 00: 00: 00.0001756.

Код отладки, без отладчика. 1000 "1"

Обработано 00: 00: 00.0002214.

Проглотил 00: 00: 00.0001946.

Tryparse 00: 00: 00.0001093.

RELEASE код, отладчик прилагается. 1000 из "1"

Обработано 00: 00: 00.0001807.

Проглотил 00: 00: 00.0003288.

Tryparse 00: 00: 00.0003351.

Код отладки, отладчик прилагается. 1000 "1"

Обработано 00: 00: 00.0001117.

Проглотил 00: 00: 00.0000884.

Tryparse 00: 00: 00.0000911.

...