Как повысить эффективность обработки исключений в точечной сети - PullRequest
0 голосов
/ 11 февраля 2020

Обработка исключений удобна, она обеспечивает тонкий синтаксис и облегчает проверку каждой допустимости.

Я решил проверить, эффективна ли обработка исключений (в точке net), потому что она генерирует стек вызовов и связанная с этим информация.

Итак, я написал следующий тест:

using System;
using System.Diagnostics;
namespace ExceptionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int nTests = 50;
            int[] io = new int[12];
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < nTests; i++)
            {
                try
                {
                    io[13] = 3;
                }
                catch
                {

                }
            }
            sw.Stop();
            var t1 = sw.ElapsedMilliseconds;
            sw.Restart();
            //I had to do more tests so to have a significant time precision
            double nMult = 10000000;
            for (int i = 0; i < nMult * nTests; i++)
            {
                if (io.Length > 13)
                {
                    io[13] = 3;
                }
            }
            sw.Stop();
            var t2 = sw.ElapsedMilliseconds;
            Console.Write("Handling exceptions (t1): " + t1.ToString() + "\r\n\r\nTesting before call (t2): " + (t2 / nMult).ToString());
            Console.Write("\r\n\r\nTime ratio (t1/t2): " + (t1 / (t2/nMult)).ToString());
            Console.Read();
        }
    }
}

И результаты:

Обработка исключений (t1): 434 мс

Тестирование перед вызовом (t2): 0,0001407 мс

Соотношение времени (t1 / t2): 3084577,11442786

Я был удивлен! На создание исключения уходит еще 3 миллиона раз!

Мои вопросы:

Почему это занимает столько времени?

Есть ли способ его улучшить? (Вроде как флаг времени выполнения, чтобы не генерировать трассировки и просто go вернуться к улову)

Я знаю, что исключения являются исключениями, и их следует избегать, но эти результаты далеки от ожидаемых!


Редактировать:

В первом тесте я запустил конфигурацию отладки.

Новые результаты с использованием конфигурации выпуска:

Обработка исключений (t1): 9

Тестирование перед вызовом (t2): 7,13E-05

Соотношение времени (t1 / t2): 126227,208976157

Немного лучше, но все еще далеко много времени.


По данным Microsoft site :

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

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

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